Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将大量数据从C#导出到excel的最佳/最快方法是什么_C#_Asp.net Mvc_Excel_Openxml - Fatal编程技术网

将大量数据从C#导出到excel的最佳/最快方法是什么

将大量数据从C#导出到excel的最佳/最快方法是什么,c#,asp.net-mvc,excel,openxml,C#,Asp.net Mvc,Excel,Openxml,我有使用OpenXML库导出数据的代码 我有20000行和22列,这需要时间(大约10分钟) 是否有任何解决方案可以将数据从C#导出到excel,速度会更快,因为我正在从asp.net mvc应用程序中执行此操作,许多人的浏览器都超时了。取决于您针对的excel版本,您可以将数据公开为OData服务,Excel 2010可以自然使用该服务,并为您处理下载和格式化 我假设这些数据需要完全发送到客户端,并且已经以某种方式进行了预过滤,但仍然需要发送回发出请求的人 在这种情况下,您希望“异步”执行此特

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

我有20000行和22列,这需要时间(大约10分钟)


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

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

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

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

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

如果此人成功下载了文档(您可以通过脚本完成),则可以使用该标记删除文档的数据库条目,并从文件系统中删除该文件


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

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

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

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

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


一种开销小、编写速度快、Excel可读的格式是CSV(好吧,这是传统格式,很难理解…。

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

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


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

假设有20000行22列,每列大约100字节,仅生成41兆字节的数据。再加上xml标记,再加上格式化,我想说你最终压缩了100MB的数据(.xlsx不过是几个压缩的xml文件)

当然,这需要一段时间,获取数据也需要一段时间。 我建议您使用excel package plus而不是Office OpenXML开发工具包。


“匆匆忙忙”和“希望它不要过早爆炸”的Microsoft代码中可能存在错误/性能问题。

我最终使用了一个名为ClosedXML的开源解决方案,该解决方案非常有效

我的目标是excel 2003和2007您可能需要生成一个新线程,并在那里运行该过程。即使你现在加快速度,如果它增长到100000列呢?类似于:新线程(()=>{//do work}).Start();(.Net 4)@Patrick Pitre-这对节省时间有什么帮助?这是格式化数据还是可以使用逗号分隔的值文件?我假设您的速度减慢是因为创建了一个大型XML集,而不是数据量本身。@leora抱歉,我应该澄清一下。生成一个新线程应该有助于防止页面超时问题。类似于JFalcon下面的建议。在后台异步执行处理,然后在处理完成时通知用户。让用户/浏览器一直坐在那里等待不是一个好的UI/UX实践。@leora但是,通过让每个线程只获取一批文件并对其进行处理,您可能会使用多个线程来加速它。例如,线程1可以处理前1000行,线程2可以处理后1000行,依此类推。当一个线程完成时,它将拾取下一个1000行。您必须设置某种递增变量来跟踪已处理的行,以便每个线程准确地知道下一批处理位于哪一行。可能会变得一团糟,但这可能是你唯一的希望。因为同样,如果文件增长到100000+行会怎么样。