【问题标题】:What is the best / fastest way to export large set of data from C# to excel将大量数据从 C# 导出到 excel 的最佳/最快方法是什么
【发布时间】:2011-10-21 02:53:36
【问题描述】:

我有使用 OpenXML 库导出数据的代码。

我有 20,000 行和 22 列,这需要很长时间(大约 10 分钟)。

是否有任何解决方案可以将数据从 C# 导出到 excel,因为我从 asp.net mvc 应用程序执行此操作会更快,并且许多人的浏览器正在超时。

【问题讨论】:

  • 您可能必须生成一个新线程,并在那里运行该进程。即使你现在加快速度,如果它增长到 100,000 列呢?类似于: new Thread(() => { // 做工作 }).Start(); (.Net 4)
  • @Patrick Pitre - 这对减少时间有何帮助?
  • 这是格式化数据还是您可以使用逗号分隔值文件代替?我认为您的放缓是在创建大型 XML 集而不是数据量本身。
  • @leora 抱歉,我应该澄清一下。产生一个新线程应该有助于防止您的页面超时问题。类似于 JFalcon 在下面的建议。在后台异步执行处理,然后在完成时通知用户。让用户/浏览器一直坐在那里等待并不是好的 UI/UX 实践。
  • @leora 但是,您可能会使用多个线程来加速它,方法是让每个线程只获取一批文件并处理它。例如,线程 1 可以处理前 1000 行,线程 2 可以处理后 1000 行,依此类推。当一个线程完成后,它会拾取接下来的 1000 行。您必须设置某种递增变量来跟踪已处理的行,因此每个线程都确切地知道下一批位于哪一行。可能会变得混乱,但可能是你唯一的希望。因为同样,如果文件增长到 100,000+ 行怎么办。

标签: c# asp.net-mvc excel openxml


【解决方案1】:

假设有 20'000 行和 22 列,每列大约 100 字节,则仅产生 41 兆字节的数据。加上 xml 标签,加上格式化,我想说你最终会压缩(.xlsx 只不过是几个压缩的 xml 文件)100 mb 的数据。

当然这需要一段时间,获取数据也是如此。 我建议您使用 excel 包 plus 而不是 Office OpenXML 开发工具包。 http://epplus.codeplex.com/

write-in-a-hurry-and-hope-that-it-doesnt-blow-up-too-soon Microsoft 代码中可能存在错误/性能问题。

【讨论】:

    【解决方案2】:

    CSV。它是一个纯文本文件,但可以由任何版本的 Excel 打开。

    毫无疑问,将数据导出到 Excel 是一种更简单的方法。很多网站都提供 CSV 格式的数据导出。

    您需要做的只是添加一个逗号 (,) 来分隔值和换行符来分隔记录。构建 csv 文件不需要额外的资源,因此速度非常快。

    【讨论】:

      【解决方案3】:

      我最终使用了一个名为 ClosedXML 的开源解决方案,效果很好

      【讨论】:

        【解决方案4】:

        根据您所针对的 Excel 版本,您可以将数据公开为 Excel 2010 可以自然使用的 OData 服务,并为您处理下载和格式化。

        【讨论】:

        • 我的目标是 excel 2003 和 2007
        【解决方案5】:

        我假设这些数据需要完全发送给客户端,并且已经以某种方式进行了预过滤,但仍需要发送回发出请求的人。

        在这种情况下,您希望“异步”执行此特定操作。我不确定这是否适合您的工作流程,但假设有人请求这个大型 XML 格式的文档,我会:a)排队另一个工作线程以在返回“令牌”的同时启动文档的生成(也许是请求者的 GUID); b) 返回指向页面的链接,请求者可以在该页面上单击链接(传递令牌)以允许页面查找结果。

        如果线程已完成对文档的处理,它会将其放入具有唯一名称的特殊文件夹中,并将标记添加到具有其文档位置的数据库表中。如果该人请求该页面,则令牌存在于数据库中并且文档存在于文件系统中,则允许他们单击并通过 HTTP 下载它。如果它不存在,他们要么被告知它不存在,要么等待结果。 (此消息可以基于收到请求的时间。)

        如果此人成功下载了文档(您可以通过脚本执行此操作),您可以使用该令牌删除该文档的数据库条目并从文件系统中删除该文件。

        我希望我正确地阅读了这个问题。

        【讨论】:

          【解决方案6】:

          我发现我可以通过限制导出操作的数量来加快将数据从数据库导出到 Excel 电子表格的速度。我发现通过在写入之前积累100行数据,创建速度至少提高了5-10倍。

          【讨论】:

            【解决方案7】:

            导出数据时最常犯的错误在工作流中

            • 构建模型
            • 构建 XML DOM
            • 将 XML DOM 保存到文件

            此工作流会导致开销,因为构建 XML DOM 需要时间,XML DOM 与模型一起保存在内存中,然后将整组数据写入文件。

            处理此问题的更好方法是将您的模型条目直接转换为目标格式,并将其直接写入(缓冲)文件。

            CSV 是一种开销低、编写速度快且可由 Excel 读取的格式(好吧,它是传统的,它很尴尬......)。

            【讨论】:

              猜你喜欢
              • 2010-10-01
              • 2018-01-10
              • 1970-01-01
              • 1970-01-01
              • 2012-07-29
              • 1970-01-01
              • 1970-01-01
              • 2018-07-19
              • 1970-01-01
              相关资源
              最近更新 更多