在类/对象中使用Excel对象(工作表,工作簿…)

我将Excel工作表导入摘要工作簿时遇到问题。

首先,我尝试导入数据作为DataTable,使用:

`Dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); tableName = GetTableNames(Dt); com = new OleDbDataAdapter(SqlQuery(tableName[0]), conn); com.Fill(DtSet); Dt = DtSet.Tables[0];` 

工作正常,除了事实,一些标题丢失后,将数据复制到一个新的工作表:

 private static void ImportData(DataTable source, string p) { int pos = Globals.ThisWorkbook.Sheets.Count; object lastSheet = Globals.ThisWorkbook.Sheets.get_Item(pos); Globals.ThisWorkbook.Sheets.Add(Type.Missing, lastSheet, Type.Missing, Type.Missing); Excel.Worksheet ws = (Excel.Worksheet)Globals.ThisWorkbook.ActiveSheet; ws.Name = p; // column headings for (var i = 0; i < source.Columns.Count; i++) { ws.Cells[1, i + 1] = source.Columns[i].ColumnName; } // rows for (var i = 0; i < source.Rows.Count; i++) { // to do: format datetime values before printing for (var j = 0; j < source.Columns.Count; j++) { ws.Cells[i + 2, j + 1] = source.Rows[i][j]; } } } 

其次,我希望通过互操作导入它来导入修复程序,所以我实现了这一点:

  public Excel.Worksheet GetWorksheet(string path) { Excel.Application vApp = new Excel.Application(); Excel.Workbook vBook = vApp.Workbooks.Open(path); Excel.Worksheet ws = vBook.Sheets.get_Item(1); vBook.Close(); vApp.Quit(); return ws; } 

似乎工作也很好,直到我尝试将此工作表复制到活动工作簿:

  private static void ImportData(Excel.Worksheet source, string p) { int pos = Globals.ThisWorkbook.Sheets.Count; source.Copy(Globals.ThisWorkbook.Worksheets[pos]); } 

这应该复制源到Globals.ThisWorkbook内的最后一个位置…但我得到的只是一个COMException

现在我想出了如何解决这个问题。 希望你能帮忙。

米尔科

我build议不要使用COM对象。 试试,OpenXML和ClosedXMLdynamic创buildExcel表。

[ http://www.c-sharpcorner.com/article/closed-xml-to-read-excel-files-in-asp-net-c-sharp/%5D

希望这可以帮助!

感谢这里发布这个人: StackOverflow

我需要将源工作簿加载到活动应用程序中,而不是启动自己的应用程序,并从那里获取工作表:

  Excel.Application destApp = Globals.ThisWorkbook.Application; Excel.Workbook destWB = destApp.Workbooks[1]; Excel.Workbook sourceWB = destApp.Workbooks.Open(d.Path); int pos = Globals.ThisWorkbook.Sheets.Count; Excel.Worksheet destWS = ((Excel.Worksheet)destWB.Worksheets[pos]); Excel.Worksheet sourceWS = ((Excel.Worksheet)sourceWB.Worksheets[1]); sourceWS.Name = d.Name; sourceWB.Save(); sourceWS.Copy(destWS); sourceWB.Close(); 

这一切,它的速度非常快。