使用C#访问Excel电子表格中的表格

我正在编写一个程序(使用C#,使用Microsoft.Office.Interop.Excel),它读取Excel电子表格,并将filter等应用于其中的数据。 然而,我正在努力解决一些问题,即如何“获取”表示我正在使用的数据表的表格对象。 我希望能够通过他们的头来访问列,所以我认为我会需要DataTable命名空间。 但是我似乎无法弄清楚该怎么做。

以下是我的代码的粗略框架:

private void Process(Workbook workBook) { try { Worksheet sheet = workBook.Sheets["x"]; Range range = sheet.UsedRange; // what goes here in order to access columns by name? } catch (Exception ex) { } } 

我真的不知道如何去做这个,所以任何帮助,以及有关如何使用Microsoft.Office.Excel.Interop的有用的文章的任何build议,真的很受欢迎。 我真的一直无法find适合我需求的资源。 非常感谢你!

以下代码片段演示了使用C#和Microsoft.Office.Interop.Excel将数据从.NET DataTable导出到Excel工作簿的技术:

  internal static bool Export2Excel(DataTable dataTable, bool Interactive) { object misValue = System.Reflection.Missing.Value; // Note: don't put Microsoft.Office.Interop.Excel in 'using' section: // it may cause ambiguity w/System.Data because both have DataTable obj // use in-place reference as shown below Microsoft.Office.Interop.Excel.Application _appExcel = null; Microsoft.Office.Interop.Excel.Workbook _excelWorkbook = null; Microsoft.Office.Interop.Excel.Worksheet _excelWorksheet = null; try { // excel app object _appExcel = new Microsoft.Office.Interop.Excel.Application(); // excel workbook object added to app _excelWorkbook = _appExcel.Workbooks.Add(misValue); _excelWorksheet = _appExcel.ActiveWorkbook.ActiveSheet as Microsoft.Office.Interop.Excel.Worksheet; // column names row (range obj) Microsoft.Office.Interop.Excel.Range _columnsNameRange; _columnsNameRange = _excelWorksheet.get_Range("A1", misValue).get_Resize(1, dataTable.Columns.Count); // column names array to be assigned to _columnNameRange string[] _arrColumnNames = new string[dataTable.Columns.Count]; // assign array to column headers range, make 'em bold _columnsNameRange.set_Value(misValue, _arrColumnNames); _columnsNameRange.Font.Bold = true; // populate data content row by row for (int Idx = 0; Idx < dataTable.Rows.Count; Idx++) { _excelWorksheet.Range["A2"].Offset[Idx].Resize[1, dataTable.Columns.Count].Value = dataTable.Rows[Idx].ItemArray; } // Autofit all Columns in the range _columnsNameRange.Columns.EntireColumn.AutoFit(); // make visible and bring to the front (note: warning due to .Activate() ambiguity) if (Interactive) { _appExcel.Visible = Interactive; _excelWorkbook.Activate(); } // // save and close if Interactive flag not set else { // Excel 2010 - "14.0" // Excel 2007 - "12.0" string _ver = _appExcel.Version; double _dblVer = double.Parse(_ver); string _fileName ="TableExported_" + DateTime.Today.ToString("yyyy_MM_dd") + "-" + DateTime.Now.ToString("hh_mm_ss"); // check version and select file extension if (_dblVer >= 12) { _fileName += ".xlsx"; } else { _fileName += ".xls"; } // save and close Excel workbook in Document Dir string _subDir = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), _expDir); // create if target directory doesn't exists if (!System.IO.Directory.Exists(_subDir)) { System.IO.Directory.CreateDirectory(_subDir); } // format the full File path string _pathFile = System.IO.Path.Combine(_subDir, _fileName); // save file and close Excel workbook _excelWorkbook.Close(true, _pathFile, misValue); } // quit excel app process if (_appExcel != null) { _appExcel.UserControl = false; _appExcel.Quit(); } return true; } catch (Exception ex) { // alternatively you can show Error message throw; } finally { // release ref vars if (_appExcel != null) { _excelWorksheet = null; _excelWorkbook = null; _appExcel = null; misValue = null; } } } 

希望这会有所帮助。 问候,

我一直使用EPPLUS,可以通过NuGet获得。 使用EPPLUS而不是Microsoft.Office.Excel.Interop

自切片面包以来最好的事情。

这是一个用于显示如何导出到Excel的计算器链接

这里是如何将Excel导入到数据表

 var pck = new OfficeOpenXml.ExcelPackage(); pck.Load(new System.IO.FileInfo(path).OpenRead()); var ws = pck.Workbook.Worksheets["Worksheet1"]; DataTable tbl = new DataTable(); var hasHeader = true; foreach (var firstRowCell in ws.Cells[1, 1, 1, ws.Dimension.End.Column]){ tbl.Columns.Add(hasHeader ? firstRowCell.Text : string.Format("Column {0}", firstRowCell.Start.Column)); } var startRow = hasHeader ? 2 : 1; for (var rowNum = startRow; rowNum <= ws.Dimension.End.Row; rowNum++){ var wsRow = ws.Cells[rowNum, 1, rowNum, ws.Dimension.End.Column]; var row = tbl.NewRow(); foreach (var cell in wsRow){ row[cell.Start.Column - 1] = cell.Text; } tbl.Rows.Add(row); }