将1000个xml中的值保存到excel中

本文关键字:保存 excel 1000个 xml | 更新日期: 2023-09-27 18:23:43

我的C#应用程序循环处理5000个文件,然后将xpath的值写入excel表中的单元格。每秒处理40个文件相当慢。

在分析后,我发现这条线占所有使用时间的50%以上:

XmlDocument.Load(filename);

为了编写excel,我在每个文件的每个xpath上循环,并执行:

worksheet.Cells[row, col] = value;

一次将所有xml加载到内存中(每个xml小于20kb),然后将其存储在集合中,然后将它们全部转换为excel,这在速度方面会更有利吗?

我知道多线程可能会降低性能,而不是提高性能,因为进程受IO限制。

将1000个xml中的值保存到excel中

它可能没有IO绑定。大部分时间都花在构建XMLDOM上。然而,多线程可能会引入一个问题,这取决于将结果写入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(尽管Excel 2003可以通过加载项读取xlsx文件),另一种选择是使用OpenXML库生成Excel文件,前提是您还没有。我想,由于这个库处理XML,它将比处理Excel互操作更快,也更安全(没有Excel对话框,没有僵尸进程等)。

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