繁体   English   中英

c#-将值从1000的xmls保存到excel

[英]c# - save values from 1000s of xmls to excel

我的C#应用​​程序循环了超过5000个文件,然后将xpath的值写入Excel工作表中的单元格。 每秒处理40个文件非常慢。

分析后,我发现此行占所有使用时间的50%以上:

XmlDocument.Load(filename);

要写入excel,我遍历每个文件的每个xpath并执行以下操作:

worksheet.Cells[row, col] = value;

就速度而言,一次将所有xml加载到内存中(每个xml小于20kb),然后将它们存储在一个集合中,然后将它们全部转置成更好的速度,会更好吗?

我了解到,由于进程受IO限制,因此多线程可能会降低性能而不是提高性能。

它可能不受IO限制。 大部分时间都花在构造XML DOM上。 但是,多线程会引入一个可能的问题,具体取决于将结果写入Excel的位置。 我不确定,但是如果您只能从单个线程访问Office对象,我不会感到惊讶。

在写入Excel对象之前,您必须添加一个收集结果的附加步骤。 这必须是某种同步的集合,或者是另一个专用于写入Excel的线程,或者在处理完所有文件之后执行。

现在,回到第一点:大部分时间都花在加载DOM上。 基于http://www.nearinfinity.com/blogs/joe_ferner/performance_linq_to_sql_vs.html的结果,如果您仍然需要DOM相关方法,我会考虑使用XDocument。 该接口与XmlDocument相距不远,因此应该很容易适应。

要以最快的速度处理XML,请查看XmlReader。 但是,这并不能为您提供任何DOM功能,并且比两种基于DOM的方法更难处理。

因此,简而言之,首先尝试转换为XDocument方法,这可能会使速度大约提高一倍。 然后,我将研究将处理转换为多线程(也许在文件列表上使用PLINQ)。 最后,如果性能仍然不够,请尝试使用XmlReader接口。

编辑以响应要使用的集合类型:

我看到了两个基本选项,具体取决于处理XML文件所需的时间。 如果它只占整个过程的一小部分(大部分时间都花在处理Excel上),那么只需有一个List<T> ,其中T是您需要写入excel的数据的某种表示形式(如果您所需要的所有内容),并使用.Add方法将其lock 然后,一旦XML处理完成,Excel编写器将遍历此集合。

如果XML处理需要一段时间,并且您使用的是.Net 4,请选择ConcurrentQueue类。 这将自己提供线程安全性(实际上,现在看来,在第一种情况下也可以使用Concurrent集合之一, ConcurrentQueueBlockingCollection )。 然后,您将拥有运行处理XML的线程,然后有一个写入Excel的使用者线程。

其他一些事情。 扩展对问题的评论,如果您不做任何需要Excel特定功能的操作,则可以写成CSV。 http://www.codeproject.com/Articles/86973/C-CSV-Reader-and-Writer此处的库使用起来非常简单,并且可以处理嵌入式逗号。 缺点是,如果您尝试保存CSV,Excel会抛出“大可怕对话框”。 但是,可以通过用户培训来克服这些问题。

另一个选择是,如果您的目标至少是Excel 2007,则可以使用OpenXML库生成Excel文件(尽管Excel 2003可以读取带有插件的xlsx文件),前提是您尚未这样做。 我认为,由于该库可以处理XML,因此它比处理Excel互操作要快,而且也更安全(没有来自Excel的对话框,没有僵尸进程等)。

在我看来,大部分时间都花在了XML解析上,而且如果不解析XML,就无法做到这一点。 因此,我认为没有简单的答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM