将数据表保存到c#中包含100k行的大型excel文件

时间:2016-02-18 07:33:40

标签: c# excel datatable

我使用Windows应用程序并处理大型excel文件。我需要从datatable节省100k行到excel文件。

目前我的create excel功能仅支持65,500行?

但是我需要保存excel文件。有可能吗?

如果是,那么,请给出来源?

这是我的代码

    public static void ExportDataSetToExcel(DataTable dt, int index, string strFilePathName)
    {
        Console.WriteLine("Creating Output Excel file");              
        string fileFomat = getExcelFileName(index) + (DateTime.Now.ToString("yyyyMMddTHHmmss"));           
        Microsoft.Office.Interop.Excel.Application objXL = null;           
        Microsoft.Office.Interop.Excel.Workbook objWB = null;
        try
        {

            objXL = new Microsoft.Office.Interop.Excel.Application();                
            objWB = objXL.Workbooks.Add(1);               
            int sheetcount = 1; 

            Microsoft.Office.Interop.Excel.Worksheet objSHT = (Microsoft.Office.Interop.Excel.Worksheet)objWB.Sheets.Add();                
            Microsoft.Office.Interop.Excel.Range cells = objSHT.Cells;                
            cells.NumberFormat = "@"; 
            //formatRange = objSHT.get_Range("b1",Type.Missing);                
            //formatRange.EntireRow.Font.Bold = true;

            objSHT.Name = "RunOrderSheet";                            
            for (int j = 0; j < dt.Rows.Count; j++)
            {
                for (int i = 0; i < dt.Columns.Count; i++)  
                {
                    //Condition to put column names in 1st row
                    //Excel work book indexes start from 1,1 and not 0,0
                    if (j == 0)
                    {
                        objSHT.Cells[1, i + 1] = dt.Columns[i].ColumnName.ToString();
                    }
                    //Writing down data
                    objSHT.Cells[j + 2, i + 1] = dt.Rows[j][i].ToString();
                }
            }                
            sheetcount++;
            objWB.Saved = true;
            objWB.SaveCopyAs(strFilePathName.Trim() + fileFomat.Trim() + ".xlsx");               
            objWB.Close();                
            objXL.Quit();
            Console.WriteLine("Process done");
        }
        catch (Exception ex)
        {
            objWB.Saved = true;              
            objWB.Close();               
            objXL.Quit();
            log.Error(ex.Message);          
        }
    }

1 个答案:

答案 0 :(得分:0)

Excel和带C#的COM接口绝对支持超过65k行。只是为了证明它是可能的,运行以下代码:

public static void ExportDataSetToExcel()
{
    Excel.Application objXL = null;
    Excel.Workbook objWB = null;

    objXL = new Microsoft.Office.Interop.Excel.Application();
    objXL.Visible = true;

    objWB = objXL.Workbooks.Add(1);
    Excel.Worksheet objSHT = objWB.Sheets.Add();

    for (int row = 1; row < 100000; row++)
    {
        objSHT.Cells[row, 1].Value2 = row;
    }

    objWB.SaveAs("c:\test\test.xlsx", Excel.XlFileFormat.xlOpenXMLWorkbook);
    objWB.Close();
    objXL.Quit();
}

根据我的怀疑(首先是我认为最有可能的事情),这引出了我可能存在的问题的几种可能性:

  1. 由于你有一个try / catch块非常好地捕获错误并确保在保存文件的同时在你的循环中发生任何事情,所以有些东西正在绊倒众所周知的断路器。虽然我没有看到任何明显的错误,但它可能是任何东西。在catch块中放置一个断点,查看ex包含的内容。另外,请记下导致错误的特定记录,以便您可以单步执行该记录并查看其发生的位置。

  2. 我注意到您使用的是SaveCopyAs而不是SaveAsSaveCopyAs会自动保存与原始格式完全相同的格式。我认为你的Excel会出现默认的xlsx,但我当然无法保证。使用具有显式文件格式的SaveAs将保证以支持超过65k行的格式保存它:

  3. objWB.SaveAs("c:\test\test.xlsx", Excel.XlFileFormat.xlOpenXMLWorkbook);

    在不知道数据表有多大的情况下,它可能只是一个内存问题,也会导致try / catch失效。