2013-05-09 85 views
1

我正在使用下面的代碼使用Microsoft.Office.Interop.Excel導出excel。 [女士辦公室2003]。 我需要導出約150000行可以有最多300列。將數據表導出到Excel時出錯

但在Get_Range上出現錯誤。 excelSheet.get_Range(excelRange,類型:

public static void ExportToExcel(DataTable dt, string outputPath) 
    { 
     try 
     { 
      // Create the Excel Application object 
      ApplicationClass excelApp = new ApplicationClass(); 

      // Create a new Excel Workbook 
      Workbook excelWorkbook = excelApp.Workbooks.Add(Type.Missing); 

      int sheetIndex = 0; 

      // Copy each DataTable 


      // Copy the DataTable to an object array 
      object[,] rawData = new object[dt.Rows.Count + 1, dt.Columns.Count]; 

      // Copy the column names to the first row of the object array 
      for (int col = 0; col < dt.Columns.Count; col++) 
      { 
       rawData[0, col] = dt.Columns[col].ColumnName; 
      } 

      // Copy the values to the object array 
      for (int col = 0; col < dt.Columns.Count; col++) 
      { 
       for (int row = 0; row < dt.Rows.Count; row++) 
       { 
        rawData[row + 1, col] = dt.Rows[row].ItemArray[col]; 
       } 
      } 

      // Calculate the final column letter 
      string finalColLetter = string.Empty; 
      string colCharset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
      int colCharsetLen = colCharset.Length; 

      if (dt.Columns.Count > colCharsetLen) 
      { 
       finalColLetter = colCharset.Substring(
        (dt.Columns.Count - 1)/colCharsetLen - 1, 1); 
      } 

      finalColLetter += colCharset.Substring(
        (dt.Columns.Count - 1) % colCharsetLen, 1); 

      // Create a new Sheet 
      Worksheet excelSheet = (Worksheet)excelWorkbook.Sheets.Add(
       excelWorkbook.Sheets.get_Item(++sheetIndex), 
       Type.Missing, 1, XlSheetType.xlWorksheet); 

      excelSheet.Name = "data"; 

      // Fast data export to Excel 
      string excelRange = string.Format("A1:{0}{1}", 
       finalColLetter, dt.Rows.Count + 1); 

      //excelSheet.get_Range(
      excelSheet.get_Range(excelRange, Type.Missing).Value2 = rawData; 

      // Mark the first row as BOLD 
      ((Range)excelSheet.Rows[1, Type.Missing]).Font.Bold = true; 


      // Save and Close the Workbook 
      excelWorkbook.SaveAs("C:\\Dashsrv\\data.Xls", XlFileFormat.xlWorkbookNormal, Type.Missing, 
       Type.Missing, Type.Missing, Type.Missing, XlSaveAsAccessMode.xlExclusive, 
       Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); 
      excelWorkbook.Close(true, Type.Missing, Type.Missing); 
      excelWorkbook = null; 

      // Release the Application object 
      excelApp.Quit(); 
      excelApp = null; 

      // Collect the unreferenced objects 
      GC.Collect(); 
      GC.WaitForPendingFinalizers(); 
      MessageBox.Show("File created at"); 
     } 
     catch(Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 

    } 

獲得下面的代碼行

[{ 「0x800A03EC從HRESULT異常」}]錯誤[50000行和列40工作細]。缺少).Value2 = rawData;

IS Get_Range()對行/列有一些限制嗎?

正如我所知的MS Office 2003列的限制是256,不知道行限制。

感謝

回答

1

Excel 2003中可以在一個工作表中有一個最大的65536行(specification

Excel 2007中

和更新可以有1048576行(​​規格:Excel 2007Excel 2010Excel 2013

+0

感謝您快速回復Knagis。 – Elliana 2013-05-09 10:53:07

+0

請問您能否以其他方式快速導出excel?與上面相比? – Elliana 2013-05-09 10:59:06

+0

嘗試使用OfficeOpenXML而不是Interop。 - http://excelpackage.codeplex.com/wikipage?title=Creating%20an%20Excel%20spreadsheet%20from%20scratch&referringTitle=Home – kgu87 2013-05-09 12:26:22

0

Excel 2003行數限制爲65,536 - http://support.microsoft.com/kb/120596

+0

以上代碼與MS OFFICE 2003, 兼容是否可以在我的系統上安裝任何DLL或SDK,以創建可在2007及更高版本的MS Office中打開的Excel。 我不得不安裝FilFormatCoverter http://support.microsoft.com/kb/924074 但需要一些DLL,它可以在我的C#應用​​程序被添加,使得在上面的代碼中 excelWorkbook.SaveAs(「C: \\ Dashsrv \\ data.Xls「,XlFileFormat.xlWorkbookNormal,,,,,,,,,); 我可以將XlFileFormat設置爲xlOpenXMLWorkbook。 – Elliana 2013-05-15 06:47:51