顯示具有 Office 標籤的文章。 顯示所有文章
顯示具有 Office 標籤的文章。 顯示所有文章

2009年9月7日 星期一

OpenXml Sdk 2.0

之前提到過 不建議在 asp.net 上使用 office Interop 的原因,那在伺服器端需要生成 Office 文件時,究竟用什麼方法較適當呢?我建議使用 xml 的方法。

Office 2003 有自己的 xml格式。到了 Office 2007 時代, Microsoft 提交了 Open Xml Format 。建立 xml 的資料是純文字的,任何平台都能建立文件。

但是,了解 xml 的格式是需要相當的時間,尤其這些 Word, Excel 等格式,充滿著許許多多的物件及相對應的 xml element。為了讓開發 Open Xml 更為方式,微軟推出了 OpenXml Sdk,目前推到了 2.0 , (仍為 CTP 版)。

我初步使用的心得:

  1. 還是在操作 xml:當初以為是像 Office automation 的物件方式在生成文件,其實這個想法是錯的。
  2. 已經相當成熟了:雖然是操作 xml,但配合多個 Tool,反而更能深入了解該 xml format 的用意。
  3. 是格式,而非應用程式:例如製作 doc的目錄 (Table of Content),這是一個 Word 的功能,因此只能由 Word 應用程式來生成。在 xml 中是沒有這個功能的。當然,我們可以寫一個類似的功能,直接生成文件目錄的 xml。但,蠻花時間的哦!

2009年7月28日 星期二

Microsoft Visual Studio Tools for the Office System Power Tools v1.0.0.0

開發 Office 2007 的程式,如果是以 xml 的方式來處理文件時, 最為麻煩的一件事,是必須先改名為 .zip 檔,然後解壓,然後再觀察 xml 的 layout,relations。
難道沒有一個好的工具嗎?
有的。

Microsoft Visual Studio Tools for the Office System Power Tools v1.0.0.0

安裝完畢後,打開 Visual Studio 2008,之後直接在檔案總管以拖拉方式拖進 Visual Studio後,就會打開如下圖的視窗。

image

觀察一下 document.xml 吧!這是一個 word 文件的入口。Hello.docx 是一個超簡單的 word 2007 文件,裡面只有一句 Hello,及一個註解「This is good start」

image

打開 document.xml,可看到如下的 xml。看到了 Hello 的文字呢。而且,該段文字是包在一段註解 <w:commentRangeStart w:id=”0” /><w:commentRangeEnd w:id=”0” /> 。

image

而 w:id=”0” 的註解,需參考 comments.xml,如下圖。注意到反白的 <w:comment w:id=”0”  ,就是id=0 的註解。

image

這個小小的範例,可以了解MS2007 的 xml 格式是強大且充滿彈性的。了解了 xml 的格式後,就可以對 office  文件進行自動化的文件產生,對於客戶的需求,又多了一分把握。

2009年6月30日 星期二

如何產生原生格式的 Excel 檔?

產生 Excel 的資料檔,是個老需求了。我也寫過一篇產生 Excel 檔的方法,陳述了我所知道的方法。
我最常使用的方法是 Report Service了,但美中不足的是,Report Service 必須將資料一次吃進來。
我所遇到的資料,有200多萬筆,一次吃進來,當然 Out of memory.

因此,我需要一個直接寫 原生格式的 Excel 檔,而非 csv, xml, html 等格式。

那到底什麼是原生格式呢?找到一個微軟開發的文件,

http://download.microsoft.com/download/0/B/E/0BE8BDD7-E5E8-422A-ABFD-4342ED7AD886/Excel97-2007BinaryFileFormat(xls)Specification.pdf,怕了吧,共三百多頁!

也有另一個 Open xml 的文件,http://sc.openoffice.org/excelfileformat.pdf,可惜必須以 office 2003 以上來開啟。我的客戶又是Excel 2002,開不了。

現在,找到了一個 open source 的元件, MyXLS,試用一下,還真的很簡單呢!也可支援中文。

可惜,超傷記憶體,寫出70453 筆資料,產生的過程中就使用了 7xx MB。12萬筆,就 out of memory。(我的開發機器,3GB memory,asp.net 最多可用 1.8GB)

其原理是在 memory 組物件,沒有作 swap 到 harddisk的動作。
這個問題,就像 XmlDocument 超傷記憶體一樣,之後才又出了個 XmlTextWriter

不過,若資料筆數少,則這個 MyXLS 可說是相當好用的了。

如果可以的話,想試試 Open XML Format SDK 2.0, 畢竟是微軟自家的東西,想來會比較好用。但現在仍在 CTP,而且 Excel 2002 開不了。

 

20090702 後記:

後來又找到了 NOPI ,看來比 MyXLS 更節省記憶體(26萬筆, 要864MB),且該元件更新頻率較多。比較建議用這個。

2009年3月31日 星期二

不建議在 asp.net 上使用 office Interop 的原因

在Web solution 上,客戶常有一個需求。以 Excel 檔匯入資料,或匯出資料成Excel檔案。

匯出成 Excel 的方法,之前已有討論過了, 但不少的同事還是喜歡用 Interop 的方式。。

不建議。因為我之前也用過,下場蠻慘的。

http://support.microsoft.com/kb/257757

此篇介紹微軟非常不建議直接在伺服器上安裝Microsoft Office 作為solution 的原因及建議。

Share with Facebook