2011-10-21 106 views
4

我有使用OpenXML庫導出數據的代碼。什麼是從C#導出大量數據到excel的最佳/最快方式

我有20,000行22列,它需要時間(大約10分鐘)。

是否有任何解決方案,將數據從C#導出到Excel,這將更快,因爲我從一個asp.net mvc應用程序這樣做,許多人瀏覽器超時。

+0

你可能就要有產卵關閉一個新的線程,並有運行過程。即使你現在加快速度,如果它增長到10萬列呢?例如:new Thread(()=> {// do work})。 (.Net 4) –

+4

@帕特里克·皮特雷 - 這將如何減少花費時間? – leora

+1

這是格式化數據還是可以使用逗號分隔值文件?我會假設你的減速是在創建一個大的XML集,而不是本身的數據量。 – Tommy

回答

1

我清盤使用名爲ClosedXML一個開源的解決方案,工作非常

0

根據您要定位的Excel版本,您可以將數據公開爲OData服務,該服務可以自然使用Excel 2010,並將處理您的下載和格式設置。

+0

我的目標是2003年和2007年的Excel – leora

0

我假設這些數據是需要完全發送給客戶端的,並且已經以某種方式預過濾了,但仍然需要發回給提出請求的人。

在這種情況下,您想要'異步'執行此特定操作。我不確定這是否適合您的工作流程,但是說一個人請求這個大型的XML格式的文檔,我會:a)排隊另一個工作線程來啓動文檔的生成,同時返回一個'標記'(可能是GUID給請求者); b)返回一個鏈接到一個頁面,請求者可以點擊鏈接(傳遞令牌),讓頁面查找結果。

如果線程已完成文檔處理,則將其放入具有唯一名稱的特殊文件夾中,並將該標記添加到具有文檔位置的數據庫表中。如果該人請求該頁面,該令牌存在於數據庫中,並且該文檔存在於文件系統上,則它們可以通過HTTP進行點擊和下載。如果它不存在,他們會被告知不存在或等待結果。 (該消息可以基於接收到請求的時間。)

如果此人成功下載文檔(並且您可以通過腳本執行此操作),則可以使用該令牌刪除文檔數據庫條目並從文件系統中刪除該文件。

我希望我能正確地閱讀這個問題。

0

我發現通過限制導出操作的次數,我可以加快從數據庫導出數據到Excel電子表格的速度。我發現通過在寫入之前積累100行數據,創建速度至少增加5-10倍。出口最經常當導出數據是在工作流完成數據時

0

的錯誤

  • 創建模型
  • 構建XML DOM
  • 保存XML DOM到文件

這工作流程會導致開銷,因爲構建XML DOM需要時間,將XML DOM與模型一起保存在內存中,然後將大量數據寫入文件。

更好的處理方法是將模型條目直接轉換爲目標格式並直接寫入(緩衝)文件。

開銷很小,寫入速度快,可以被Excel讀取的格式是CSV(好,它是遺留的,很尷尬......)。

1

CSV。這是一個純文本文件,但可以通過任何版本的Excel打開。

毫無疑問,將數據導出到excel是一種更簡單的方法。很多網站提供數據導出爲CSV。

你需要做的只是添加一個逗號(,)來分隔值和換行符來分隔記錄。它不會花費額外的資源來構建csv文件,因此速度非常快。

2

假設每行大約有100個字節的20,000行和22列,單獨產生41兆字節的數據。加上xml標籤,再加上格式化,我會說你最終會壓縮(.xlsx只是幾個壓縮的xml文件)100MB的數據。

當然這需要一段時間,取數據也是如此。 我建議您使用excel包而不是Office OpenXML開發工具包。 http://epplus.codeplex.com/

在快速寫入和希望這不是微軟的代碼中可能存在一個缺陷/性能問題。

相關問題