簡體   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