C# 在ASP.NETC中将大型数据导出到excel#

C# 在ASP.NETC中将大型数据导出到excel#,c#,asp.net,openxml-sdk,closedxml,C#,Asp.net,Openxml Sdk,Closedxml,我正在尝试将一个数据集导出到excel文件。数据集包含20多个数据表(每个表将在最终输出excel文件中显示为单独的表格),每个表包含30+k行,约10列。我正在从其他资源读取这些数据,并将其保存到数据集中。不使用任何数据库来存储它。我正在使用来自的开放XML和封闭XML来完成这个过程。它可以在15-20个数据表中正常工作,但超过25个数据表会占用太多时间。对此,我们将非常感谢您的任何建议或帮助 示例代码: using (XLWorkbook wb = new XLWorkbook()) {

我正在尝试将一个数据集导出到excel文件。数据集包含20多个数据表(每个表将在最终输出excel文件中显示为单独的表格),每个表包含30+k行,约10列。我正在从其他资源读取这些数据,并将其保存到数据集中。不使用任何数据库来存储它。我正在使用来自的开放XML和封闭XML来完成这个过程。它可以在15-20个数据表中正常工作,但超过25个数据表会占用太多时间。对此,我们将非常感谢您的任何建议或帮助

示例代码:

 using (XLWorkbook wb = new XLWorkbook())
 {
   foreach (DataTable dt in dsData.Tables)
   {
     wb.Worksheets.Add(dt);
   }
   Response.Clear();
   Response.Buffer = true;
   Response.Charset = "";
   Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
   Response.AddHeader("content-disposition", "attachment;filename=DataSet.xlsx");
   wb.SaveAs(Response.OutputStream);
   Response.Flush();
   Response.End();   
 }

经过一些研究,我找到了一个解决方案,我用100多万个数据测试了下面的代码,效果很好。也许这对其他人会有帮助。 我删除了closedxml引用,并添加了“Interop.Microsoft.Office.Core.dll”引用。然后我编写了以下代码

所需命名空间: 使用Excel=Microsoft.Office.Interop.Excel, 使用System.Runtime.InteropServices

    Excel.Workbook xlWorkBook;
    Excel.Application xlApp;
    Excel.Worksheet xlWorkSheet;
    Excel.Range Startrange;
    Excel.Range HeaderStartrange;
    public bool StartExport(DataTable dtbl, bool isFirst, bool isLast, string strOutputPath, string TemplateLocation, string TemplateFullName, int SectionOrder, int totalNoOfSheets)
    {
        bool isSuccess = false;
        try
        {
            if (isFirst)
            {
                CopyTemplate(TemplateLocation, strOutputPath, TemplateFullName);
                xlApp = new Excel.Application();
                if (xlApp == null)
                {
                    throw new Exception("Excel is not properly installed!!");
                }
                xlWorkBook = xlApp.Workbooks.Open(@strOutputPath + TemplateFullName, 0, false, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);

                // To Add Sheets Dynamically
                for (int i = 0; i <= totalNoOfSheets; i++)
                {
                    int count = xlWorkBook.Worksheets.Count;
                    Excel.Worksheet addedSheet = xlWorkBook.Worksheets.Add(Type.Missing,
                            xlWorkBook.Worksheets[count], Type.Missing, Type.Missing);
                    addedSheet.Name = "Sheet " + i.ToString();
                }
            }
            xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(SectionOrder);
            Startrange = xlWorkSheet.get_Range("A2");
            HeaderStartrange = xlWorkSheet.get_Range("A1");
            FillInExcel(Startrange, HeaderStartrange, dtbl);
            xlWorkSheet.Name = dtbl.TableName;
            if (isLast)
            {
                xlApp.DisplayAlerts = false;
                xlWorkBook.SaveAs(@strOutputPath + TemplateFullName, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing,
                    Type.Missing, Type.Missing);
                xlWorkBook.Close(true, null, null);
                xlApp.Quit();
                Marshal.ReleaseComObject(xlWorkSheet);
                Marshal.ReleaseComObject(xlWorkBook);
                Marshal.ReleaseComObject(xlApp);
                GC.WaitForPendingFinalizers();
                GC.Collect();
                isSuccess = true;
            }
        }
        catch (Exception ex)
        {
            isSuccess = false;
            throw;
        }
        return isSuccess;
    }

    private void FillInExcel(Excel.Range startrange, Excel.Range HeaderStartRange, DataTable dtblData)
    {
        int rw = 0;
        int cl = 0;
        try
        {
            // Fill The Report Content Data Here
            rw = dtblData.Rows.Count;
            cl = dtblData.Columns.Count;
            string[,] data = new string[rw, cl];
            // Adding Columns Here
            for (var row = 1; row <= rw; row++)
            {
                for (var column = 1; column <= cl; column++)
                {
                    data[row - 1, column - 1] = dtblData.Rows[row - 1][column - 1].ToString();
                }
            }
            Excel.Range endRange = (Excel.Range)xlWorkSheet.Cells[rw + (startrange.Cells.Row - 1), cl + (startrange.Cells.Column - 1)];
            Excel.Range writeRange = xlWorkSheet.Range[startrange, endRange];
            writeRange.Value2 = data;
            writeRange.Formula = writeRange.Formula;
            data = null;
            startrange = null;
            endRange = null;
            writeRange = null;
        }

        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }
Excel.工作簿xl工作簿;
Excel.applicationxlapp;
Excel工作表;
Excel.Range Startrange;
Excel.Range Headers StartRange;
公共bool StartExport(DataTable dtbl、bool isFirst、bool isLast、string strOutputPath、string templatellocation、string TemplateFullName、int SectionOrder、int totalNoOfSheets)
{
bool isSuccess=错误;
尝试
{
如果(isFirst)
{
CopyTemplate(TemplateLocation、strOutputPath、TemplateFullName);
xlApp=new Excel.Application();
如果(xlApp==null)
{
抛出新异常(“Excel未正确安装!!”;
}
xlWorkBook=xlApp.Workbooks.Open(@strOutputPath+TemplateFullName,0,false,5,“,”,true,Microsoft.Office.Interop.Excel.XlPlatform.xlWindows,“\t”,false,false,0,true,1,0);
//动态添加图纸的步骤

对于(inti=0;i经过一些研究,我找到了一个解决方案,我用100多万个数据测试了下面的代码,它运行得很好。可能对其他人有帮助。 我删除了closedxml引用并添加了“Interop.Microsoft.Office.Core.dll”引用

所需命名空间: 使用Excel=Microsoft.Office.Interop.Excel, 使用System.Runtime.InteropServices

    Excel.Workbook xlWorkBook;
    Excel.Application xlApp;
    Excel.Worksheet xlWorkSheet;
    Excel.Range Startrange;
    Excel.Range HeaderStartrange;
    public bool StartExport(DataTable dtbl, bool isFirst, bool isLast, string strOutputPath, string TemplateLocation, string TemplateFullName, int SectionOrder, int totalNoOfSheets)
    {
        bool isSuccess = false;
        try
        {
            if (isFirst)
            {
                CopyTemplate(TemplateLocation, strOutputPath, TemplateFullName);
                xlApp = new Excel.Application();
                if (xlApp == null)
                {
                    throw new Exception("Excel is not properly installed!!");
                }
                xlWorkBook = xlApp.Workbooks.Open(@strOutputPath + TemplateFullName, 0, false, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);

                // To Add Sheets Dynamically
                for (int i = 0; i <= totalNoOfSheets; i++)
                {
                    int count = xlWorkBook.Worksheets.Count;
                    Excel.Worksheet addedSheet = xlWorkBook.Worksheets.Add(Type.Missing,
                            xlWorkBook.Worksheets[count], Type.Missing, Type.Missing);
                    addedSheet.Name = "Sheet " + i.ToString();
                }
            }
            xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(SectionOrder);
            Startrange = xlWorkSheet.get_Range("A2");
            HeaderStartrange = xlWorkSheet.get_Range("A1");
            FillInExcel(Startrange, HeaderStartrange, dtbl);
            xlWorkSheet.Name = dtbl.TableName;
            if (isLast)
            {
                xlApp.DisplayAlerts = false;
                xlWorkBook.SaveAs(@strOutputPath + TemplateFullName, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing,
                    Type.Missing, Type.Missing);
                xlWorkBook.Close(true, null, null);
                xlApp.Quit();
                Marshal.ReleaseComObject(xlWorkSheet);
                Marshal.ReleaseComObject(xlWorkBook);
                Marshal.ReleaseComObject(xlApp);
                GC.WaitForPendingFinalizers();
                GC.Collect();
                isSuccess = true;
            }
        }
        catch (Exception ex)
        {
            isSuccess = false;
            throw;
        }
        return isSuccess;
    }

    private void FillInExcel(Excel.Range startrange, Excel.Range HeaderStartRange, DataTable dtblData)
    {
        int rw = 0;
        int cl = 0;
        try
        {
            // Fill The Report Content Data Here
            rw = dtblData.Rows.Count;
            cl = dtblData.Columns.Count;
            string[,] data = new string[rw, cl];
            // Adding Columns Here
            for (var row = 1; row <= rw; row++)
            {
                for (var column = 1; column <= cl; column++)
                {
                    data[row - 1, column - 1] = dtblData.Rows[row - 1][column - 1].ToString();
                }
            }
            Excel.Range endRange = (Excel.Range)xlWorkSheet.Cells[rw + (startrange.Cells.Row - 1), cl + (startrange.Cells.Column - 1)];
            Excel.Range writeRange = xlWorkSheet.Range[startrange, endRange];
            writeRange.Value2 = data;
            writeRange.Formula = writeRange.Formula;
            data = null;
            startrange = null;
            endRange = null;
            writeRange = null;
        }

        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }
Excel.工作簿xl工作簿;
Excel.applicationxlapp;
Excel工作表;
Excel.Range Startrange;
Excel.Range Headers StartRange;
公共bool StartExport(DataTable dtbl、bool isFirst、bool isLast、string strOutputPath、string templatellocation、string TemplateFullName、int SectionOrder、int totalNoOfSheets)
{
bool isSuccess=错误;
尝试
{
如果(isFirst)
{
CopyTemplate(TemplateLocation、strOutputPath、TemplateFullName);
xlApp=new Excel.Application();
如果(xlApp==null)
{
抛出新异常(“Excel未正确安装!!”;
}
xlWorkBook=xlApp.Workbooks.Open(@strOutputPath+TemplateFullName,0,false,5,“,”,true,Microsoft.Office.Interop.Excel.XlPlatform.xlWindows,“\t”,false,false,0,true,1,0);
//动态添加图纸的步骤

对于(int i=0;我定义“花费太多时间”。打开文件或下载文件需要多长时间?为什么要保存到MemoryStream,然后立即将其复制到OutputStream?为什么不保存到OutputStream?通常我不会尝试将整个数据库保存到excel。首先,数据库可能包含更多的数据excel无法管理。您将数据库保存到excel的原因是什么?@FrankerZ将数据表添加到XLWorkbook对象时需要20多分钟。@Jzl:您的意思是说无法单独打开数据表?必须一次全部打开?定义“占用太多时间”。打开文件或下载文件需要多长时间?为什么要保存到MemoryStream,然后立即将其复制到OutputStream?为什么不保存到OutputStream?通常我不会尝试将整个数据库保存到excel。首先,数据库可能包含更多的数据excel无法管理。您将数据库保存到excel的原因是什么?@FrankerZ将数据表添加到XLWorkbook对象时需要20多分钟。@Jzl:您的意思是说无法单独打开数据表?必须一次全部打开?CopyTemplate不存在CopyTemplate不存在