【问题标题】:Optimised way for byte array to memory stream字节数组到内存流的优化方式
【发布时间】:2018-12-28 21:13:58
【问题描述】:

我使用以下代码行

byte[] byteInfo = workbook.SaveToMemory(FileFormat.OpenXMLWorkbookMacroEnabled);
workStream.Write(byteInfo, 0, byteInfo.Length);
workStream.Position = 0;
return workStream;

借助 C# 和 Spreadsheetagear 从浏览器下载 excel 文件。

它适用于较少的记录,但是当我尝试下载包含大量数据的工作簿(具有 50k 行 1k 列并启用宏的 Excel)时,这一行

byte[] byteInfo = workbook.SaveToMemory(FileFormat.OpenXMLWorkbookMacroEnabled);

单独花费将近 4 - 5 分钟。有没有什么优化的方法可以让下载大文件只需要 1 到 2 分钟。

【问题讨论】:

    标签: c# .net spreadsheetgear


    【解决方案1】:

    试试

    workbook.SaveToStream(outputstream, SpreadsheetGear.FileFormat.OpenXMLWorkbook);
    

    流通常可以更快,因为它们通常以 ram 所需的速度保存。而不是填充页面文件。

    【讨论】:

    • 我试过用这个,也花了差不多一样的时间。
    • @Leo 看起来可能没有无损的方法来做到这一点。 Xcheque 的答案可能正是您所需要的
    • 是否有任何方法可以在响应中发送内存流,当它被创建时,会话(从工作簿到内存流)反映在浏览器下载百分比中,而不是转换整个文件进入内存流,然后作为响应发送它
    • 完全是@Courtney
    • 在不知道下载完成的长度或百分比的情况下,您将无法进度条。但你可以做 static ms=new MemoryStream();静态布尔保存完成=假;线程th=新线程(SaveWorkbook); th.IsBackground=true; th.Start();在保存工作簿中。做 SaveComplete=false workbook.SaveToStream(ms, SpreadsheetGear.FileFormat.OpenXMLWorkbook);保存完成=真;检查表格是否完整。如果不显示一个表格说保存等
    【解决方案2】:

    对于大型工作簿,SpreadsheetGear 进程运行所用的时间与将工作簿打开到内存中所用的时间有关,而不是与编译信息和下载信息所用的时间有关。您可以通过请求打开工作簿并发送简单的成功响应来测试这一点,而无需下载的字节数组。大小超过 1-2MB 的电子表格文件会开始减慢速度,超过 5MB 的过程会变得非常缓慢。

    选项是:

    1. 创建一个空的电子表格并通过提取它来构建内容 从数据库中插入电子表格以供下载。 这比打开大型电子表格文件要快。
    2. 删除占用空间并增加文件大小的非必要内容 电子表格
    3. 将电子表格拆分为较小的单个文件。您可以通过比较处理 10 x 1MB 文件、2 x 5MB 文件和 1 x 10MB 文件的速度来测试这一点
    4. 使用 CSV 导入/导出文件流程。 它们速度更快,但显然不如 SpreadsheetGear 聪明 功能
    5. 设置直接下载存储的电子表格文件,而不是通过 SpreadsheetGear。这更快,但显然需要存储中的静态文件或由另一个进程创建和存储的静态文件

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 2011-09-14
      • 1970-01-01
      • 2014-03-28
      • 2017-05-20
      • 1970-01-01
      相关资源
      最近更新 更多