2016-11-29 87 views
0

我在將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

回答

0

感謝的人張貼了這個位置: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(); 

那它的速度非常快。

1

我建議不要使用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。高效代碼的性能也很好。 –

相關問題