Ссылка на файл Excel, рабочую книгу, рабочий лист в C# - PullRequest
0 голосов
/ 31 марта 2020

Все, я изо всех сил пытался просто сослаться на файл Excel, чтобы я мог автоматически извлечь его данные в новый рабочий лист.

Я знаю, что это означает создание нового файла Excel и его элементов:

        Excel.Application oXL;
        Excel._Workbook oWB;
        Excel._Worksheet oSheet;
        Excel.Range oRng;



            //Start Excel and get Application object.
            oXL = new Excel.Application();
            oXL.Visible = true;
            //Get a new workbook.
            oWB = (Excel._Workbook)(oXL.Workbooks.Add(Missing.Value));
            oSheet = (Excel._Worksheet)oWB.ActiveSheet;

Но здесь я теряюсь ... Я хочу, чтобы пользователь выбрал другой файл Excel через диалоговое окно файла, а затем я хочу скопировать данные из указанного файла в новую книгу выше.

Пример: новый файл, пользователь выбирает «MyExcel.csv». Как бы я сослался на это, чтобы я мог, скажем, скопировать столбец А в новый лист? Что бы ни работало с C#.

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

Исходя из вашего описания, вы хотите скопировать один столбец из файла CSV и вставить в новый файл Excel.

Сначала я преобразую файл CSV в datatable.

Во-вторых, Я выбираю указанный столбец c и преобразую один столбец в таблицу данных.

В-третьих, я преобразую таблицу данных в новый файл Excel.

Вы можете попробовать следующий код.

using System;
using System.Data;
using Excel = Microsoft.Office.Interop.Excel;


    class Program
    {
        static void Main(string[] args)
        {
            string path = "D:\\t.csv";
            DataTable table = ReadCsv(path);
            table= new DataView(table).ToTable(false, "Tests");
            ExportToExcel(table, "D:\\t.xlsx");
        }
        public static DataTable ReadCsv(string path)
        {
            Microsoft.Office.Interop.Excel.Application objXL = null;
            Microsoft.Office.Interop.Excel.Workbook objWB = null;
            objXL = new Microsoft.Office.Interop.Excel.Application();
            objWB = objXL.Workbooks.Open(path);
            Microsoft.Office.Interop.Excel.Worksheet objSHT = objWB.Worksheets[1];

            int rows = objSHT.UsedRange.Rows.Count;
            int cols = objSHT.UsedRange.Columns.Count;
            DataTable dt = new DataTable();
            int noofrow = 1;

            for (int c = 1; c <= cols; c++)
            {
                string colname = objSHT.Cells[1, c].Text;
                dt.Columns.Add(colname);
                noofrow = 2;
            }

            for (int r = noofrow; r <= rows; r++)
            {
                DataRow dr = dt.NewRow();
                for (int c = 1; c <= cols; c++)
                {
                    dr[c - 1] = objSHT.Cells[r, c].Text;
                }

                dt.Rows.Add(dr);
            }

            objWB.Close();
            objXL.Quit();
            return dt;
        }

        public static void ExportToExcel( DataTable tbl, string excelFilePath = null)
        {
            try
            {
                if (tbl == null || tbl.Columns.Count == 0)
                    throw new Exception("ExportToExcel: Null or empty input table!\n");

                // load excel, and create a new workbook
                var excelApp = new Excel.Application();
                excelApp.Workbooks.Add();

                // single worksheet
                Excel._Worksheet workSheet = excelApp.ActiveSheet;

                // column headings
                for (var i = 0; i < tbl.Columns.Count; i++)
                {
                    workSheet.Cells[1, i + 1] = tbl.Columns[i].ColumnName;
                }

                // rows
                for (var i = 0; i < tbl.Rows.Count; i++)
                {
                    // to do: format datetime values before printing
                    for (var j = 0; j < tbl.Columns.Count; j++)
                    {
                        workSheet.Cells[i + 2, j + 1] = tbl.Rows[i][j];
                    }
                }

                // check file path
                if (!string.IsNullOrEmpty(excelFilePath))
                {
                    try
                    {
                        workSheet.SaveAs(excelFilePath);
                        excelApp.Quit();
                        Console.WriteLine("Excel file saved!");
                    }
                    catch (Exception ex)
                    {
                        throw new Exception("ExportToExcel: Excel file could not be saved! Check filepath.\n"
                                            + ex.Message);
                    }
                }
                else
                { // no file path is given
                    excelApp.Visible = true;
                }
            }
            catch (Exception ex)
            {
                throw new Exception("ExportToExcel: \n" + ex.Message);
            }
        }
    }

Исходный CSV-файл.

enter image description here

Файл Excel:

enter image description here

0 голосов
/ 31 марта 2020

Может быть, это поможет:

Убедитесь, что вы управляете своими Nugets и добавьте ссылку "Microsoft.Office.Interop.Excel" -> (Ссылки (Правый клик) -> Управление пакетами Nuget -> Обзор -> «Microsoft.Office.Interop.Excel» -> Установить)

Примечание: Это копия для вставки в тот же лист. Чтобы скопировать данные в другой лист из другого файла, просто передайте «лист» в качестве параметра методу и вставьте его туда.


public class Excel1
    {
        private readonly string excelSufix = ".xlsx";

        private readonly string excelFilePrefix = "..."; //Where you excel file is located

        private string getFilePath(string fileName)
        {
            return excelFilePrefix + fileName + excelSufix; //returns the file path by the given file name
        }

        public void CopyPaste(string fileName, int worksheet, string toCopyRange, string whereInsertRange)
        {
            //Range should look like = "A:C" or "D:F"
            var excelApp = new Microsoft.Office.Interop.Excel.Application();
            excelApp.Visible = true;
            var workBook = excelApp.Workbooks.Open(getFilePath(fileName));
            var workSheet = (Microsoft.Office.Interop.Excel.Worksheet)workBook.Sheets[worksheet];

            var toCopy = workSheet.Range[toCopyRange];
            var whereInsert = workSheet.Range[whereInsertRange];

            whereInsert.Insert(Microsoft.Office.Interop.Excel.XlInsertShiftDirection.xlShiftToRight, toCopy.Cut());
        }
    }

Редактировать: Вы мог бы добавить конструктор к классу, в который вы передаете путь файла и некоторые переменные класса, которые ссылаются на файл, рабочую таблицу et c et c ... В этом случае у вас будут независимые объекты для каждого файла

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...