【问题标题】:Referencing an Excel file, workbook, worksheet in C#在 C# 中引用 Excel 文件、工作簿、工作表
【发布时间】:2020-03-31 05:14:02
【问题描述】:

所有, 我一直在努力简单地引用 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”。 我将如何引用它,以便我可以将 A 列复制到新工作表中? 任何适用于 C# 的东西。

【问题讨论】:

  • 看这个。我已经举了一个例子HERE它在VB.Net中但是可以很容易地转换成C#
  • 你如何转换成 C#?
  • 对于初学者,CodeTranslator 应该会有所帮助:)
  • 如果你知道,我如何让用户指定的文件路径不在 CS 文件中?

标签: c# excel visual-studio


【解决方案1】:

也许这会有所帮助:

确保您管理您的 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());
        }
    }

编辑:您可以向传递文件路径的类和一些引用文件、工作表等的类变量添加构造函数...在这种情况下,您将拥有独立的每个文件的对象

【讨论】:

    【解决方案2】:

    根据您的描述,您希望从 csv 文件中复制一列并粘贴到新的 excel 文件中。

    首先,我将 csv 文件转换为数据表。

    其次,我选择特定的列并将一列转换为数据表。

    第三,我将数据表转换为新的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 文件。

    excel文件:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-22
      • 1970-01-01
      • 2019-10-10
      相关资源
      最近更新 更多