【问题标题】:How can I export very large amount of data to excel如何将大量数据导出到excel
【发布时间】:2013-10-06 17:03:18
【问题描述】:

我目前正在使用 EPPlus 将数据导出到 Excel。它适用于少量数据。但是要导出大量数据会消耗大量内存。

我简要介绍了 OOXML 和/或 Microsoft Open XML SDK 2.5。我不确定是否可以使用它将数据导出到 Excel?

还有第三方提供程序库。

我想知道哪种解决方案可以正确地导出大量数据且性能良好且不占用太多空间(理想情况下少于要导出的数据量的 3 倍)?

更新:一些额外的要求... 我需要能够导出“颜色”信息(不包括 CSV),并且我想要一些易于管理的东西,比如 EPPlus 库(不包括 XML 格式本身)。我找到了另一个线程,他们推荐我正在尝试的 Aspose 或 SpreadsheetGear。我把第一个答案说好。谢谢大家。

2016 年 2 月 16 日更新 就像信息一样...我们现在使用 SpreadSheetGear,我们喜欢它。我们需要支持一次,这太棒了。

谢谢

【问题讨论】:

  • 创建一个 CSV 文件。 CSV 可以直接用 Excel 打开,而且制作起来非常简单。如果你使用FileStream来写,那么消耗的内存应该限制在当前行。
  • @罗伯特,谢谢。对于一些原始数据导出,我会考虑,但实际上我的数据包括颜色信息和 CSV 不能包含的更多信息。
  • 当然……当然可以。
  • @Robert,CSV 是文本库,我可以将颜色信息添加为通道值,但我必须编写一些东西来导入它并在 Excel 中将其显示为颜色。

标签: c# performance excel memory export


【解决方案1】:

作为替代方案,您可以使用我的SwiftExcel 库。它专为大容量 Excel 输出而设计,可将数据直接写入文件而不会影响内存。

这是一个使用示例:

using (var ew = new ExcelWriter("C:\\temp\\test.xlsx"))
{
    for (var row = 1; row <= 100; row++)
    {
        for (var col = 1; col <= 10; col++)
        {
            ew.Write($"row:{row}-col:{col}", col, row);
        }
    }
} 

【讨论】:

    【解决方案2】:

    EPPlus 将数据导出到 Excel。它适用于少量数据。但是要导出大量数据会消耗大量内存。

    几年前,我写了一个 C# 库,使用 OpenXML 库将数据导出到 Excel,我也遇到了同样的情况。

    在您开始拥有大约 30k+ 行之前它运行良好,此时,库将尝试缓存您的所有数据......并且它会耗尽内存。

    但是,我通过使用 OpenXmlWriter 类解决了这个问题。这会将数据直接写入 Excel 文件(无需先缓存),而且内存效率更高。

    而且,如您所见,该库非常易于使用,只需调用一个 CreateExcelDocument 函数,然后将其传递给 DataSetDataTableList&lt;&gt;

    // Step 1: Create a DataSet, and put some sample data in it
    DataSet ds = CreateSampleData();
    
    // Step 2: Create the Excel .xlsx file
    try
    {
        string excelFilename = "C:\\Sample.xlsx";
        CreateExcelFile.CreateExcelDocument(ds, excelFilename);
    }
    catch (Exception ex)
    { 
        MessageBox.Show("Couldn't create Excel file.\r\nException: " + ex.Message);
        return;
    }
    

    您可以从这里下载 C# 和 VB.Net 的完整源代码:

    Mike's Export to Excel

    祝你好运!

    【讨论】:

    • 非常感谢迈克。我不记得确切的情况,但我们实际上使用的是 SpreadsheetGear,它做得很好。但与此同时,我们也使用了 64 位。我不能证明 SpreadsheetGear 单独解决了这个问题,但我真的很喜欢这个产品。我注意到您的解决方案。
    • 嗨@Mike,您的链接无效,您能否提供更新的链接,我想看看您的解决方案,因为我们需要将大量数据下载到 Excel,目前它是抛出内存异常,提前致谢。
    【解决方案3】:

    我第二次使用 CSV,但请注意 Excel 对工作表中的行数和列数有限制,如下所述: http://office.microsoft.com/en-us/excel-help/excel-specifications-and-limits-HP010342495.aspx

    具体来说: 工作表大小 1,048,576 行 x 16,384 列

    这适用于 Excel 2010。处理大量数据时,请牢记这些限制。

    【讨论】:

    • 谢谢,但我需要 excel。我更新了我的问题以添加有关它的限制。感谢您提供限制信息。我的数据非常大,但没有达到这个程度。
    【解决方案4】:

    如果您的要求足够简单,您可以使用 CSV。

    如果您需要更多详细信息,请查看SpreadsheetML。它是一种 XML 架构,可用于创建 Excel 可以本机打开的文本文档。它支持公式、每个工作簿的多个工作表、格式等。

    【讨论】:

    • 由于导出颜色和更多数据而不仅仅是普通数据,我无法使用 CSV。我会寻找 SpreadsheetML
    • SpreadsheetML 是格式。我在我的问题中添加了更新,以准确说明我应该使用哪个库(更容易)。
    猜你喜欢
    • 1970-01-01
    • 2016-09-20
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    相关资源
    最近更新 更多