繁体   English   中英

将数据表保存到C#中具有100k行的大型Excel文件中

[英]Save datatable to large excel file having rows 100k in c#

我使用Windows应用程序并处理大型excel文件。 我需要将10万行从数据表保存到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);          
        }
    }

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而不是SaveAs SaveCopyAs自动以与原始格式完全相同的格式保存。 我认为您的Excel带有默认的xlsx ,但是我当然不能保证。 SaveAs与显式文件格式一起使用将确保将其保存为支持65k行以上的格式:。

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

在不知道数据表有多大的情况下,它可能仅仅是一个内存问题,也使try / catch失败了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM