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

问题描述:

我在将Excel工作表导入到摘要工作簿时遇到问题。在类/对象中使用Excel对象(工作表,工作簿...)

首先,我尝试导入数据,数据表,使用:

`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]; 
      } 
     } 
    } 

其次,我希望导入修复由VIA互操作导入它,所以我实现了这个一个:

 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

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

Mirko

感谢的人张贴了这个位置:*

我需要加载源工作簿到活动的应用程序,而不是在开始自己的应用程序,并从那里得到的工作表:所有

  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(); 

那它的速度非常快。

我建议不要使用COM对象。尝试使用OpenXML和ClosedXML来动态创建Excel表。

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

希望这有助于!

+0

Thansk您的评论,问题是使用外部库或软件是不允许在我的公司批准。该软件需要在两天内完成,审批需要很长时间。 :-) – Mirko

+1

是的,我可以理解。你正在使用Microsoft.Interop.Excel权利?我也用过它。我们的产品托管在客户购买的云服务器上。我们无法说服我们的客户在服务器中安装Microsoft Office Primary Interop Assembly软件包。所以我使用了完全免费的openXML和ClosedXML。高效代码的性能也很好。 –