在寫這一系列文章之前,我要首先申明一個事情,那就是自打.NET一開始我們大概就已經開始使用它在自己的程式中與Excel進行互動了,諸如從Excel中讀取資料顯示報表、將程式中的資料匯出到Excel中等等。這個看似很平常,而且我相信有很多的人都寫過或看過類似的程式。在早期版本的.NET中我們需要在Windows中執行一個命令(時間太久我也不太記得這個命令叫什麼了)來將Office COM組件變成Managed 程式碼以便在.NET程式中調用,後來的.NET Framework可以完全支援Office COM組件的調用,但需要在工程中添加引用。但是無論怎樣,我們在程式中都是對Office COM組件進行操作,這樣會有許多不便,無論從程式執行效率上還是代碼編輯上都會讓你感覺很彆扭。
那現在又有什麼不同呢?
我的意思是說如果你的程式啟動並執行環境沒有安裝Office,或者說運行環境中沒有註冊Office COM組件,那會怎樣?
你可能會說那不是程式本身的問題,我們甚至可以要求客戶提供Office COM組件。但是請注意,如果你的程式要求跨平台使用,而Office COM組件在目標平台上並不受支援(怎麼會有這麼奇怪的需求?!),你可能會遇到點麻煩。這個時候我們可以考慮在程式中提供一個替代的選項來禁用相應的功能,從而避免程式錯誤地使用並不存在的Office COM組件。
不過,如果能有一個行之有效辦法解決所有的問題難道不是一件令人興奮的事情嗎?我們可否繞過Office COM組件而直接對檔案本身進行操作呢?(有點癡心妄想了)這個想法有點誇張,在早期版本的Excel檔案中(應該是在Excel 2007之前)幾乎是行不通的,但從Excel 2007之後這個事情變得可行了。
在Excel 2007之後的版本中,檔案名稱的尾碼變成XLSX了,其實這個也是SpreadsheetXL。我們有三種方法可以操作它:自己寫解析器分析檔案中的內容,這個可能會比較麻煩;第二種是使用Microsoft提供的OpenXML SDK來操作Excel檔案,OPENXML SDK到目前為止應該有兩個版本,而且包含的功能還是很豐富的;第三種就是直接使用自.NET Framework 3.0之後提供的新功能直接操作Excel檔案。
先介紹下什麼是XLSX檔案。看下面這個圖就明白了。
XLSX檔案本身就是一個壓縮包,裡麵包含了Excel檔案中所有的資料和樣式,包括一些資源檔(片、連結等等),這些檔案幾乎都以XML的形式放在壓縮包裡不同的檔案夾中。只要我們熟悉了這些XML檔案的結構以及不同檔案夾的用途,就可以非常方便地以ZIP壓縮檔的形式操作XLSX檔案了。下面這個圖就是解壓XLSX檔案後的內容:
稍後我會介紹如何通過各種不同的方式來使用XLSX檔案以及各種不同的應用。但在這之前我想先說一下Excel的REST應用。這裡有幾個連結可以協助你瞭解什麼是Excel REST應用。
http://msdn.microsoft.com/en-us/library/ee556820.aspx
http://www.cnblogs.com/dwang/archive/2010/12/08/1899983.html
http://msdn.microsoft.com/en-us/library/hh124646.aspx
Excel REST是SharePoint Excel Services提供的一個用來訪問Excel檔案的服務,我們只需要通過一個簡單的URL就可以得到Excel檔案中的資料,使用非常方便。而且我們還可以通過這個URL來修改Excel中某些儲存格的資料,甚至擷取或修改圖表。具體的使用方法和例子大家可以查看MSDN,上面會有非常詳細的介紹。
在使用Excel REST服務返回Range資料時,如果所對應的工作表有自訂名稱,URL應該是怎樣的?這裡有幾個例子:
- 讀取Student表,範圍從A1到G5,注意%7C是轉義之後的冒號。
http://<ServerName>/_vti_bin/ExcelRest.aspx/ExcelTemplates/sampleWorkbook.xlsx/Model/Ranges('Student!A1%7CG5')?$format=html
- 讀取Teacher and Student表,範圍從D5到CG27。注意表名中的空格可能需要進行轉義。另外就是表名用了兩個單引號括起來。
http://<ServerName>/_vti_bin/ExcelRest.aspx/ExcelTemplates/sampleWorkbook.xlsx/Model/Ranges('''Teacher%20and%20Student''!D5%7CCG27')?$format=html
- 讀取Teacher表,範圍為A10儲存格。注意表名也用了兩個單引號括起來。
http://<ServerName>/_vti_bin/ExcelRest.aspx/ExcelTemplates/sampleWorkbook.xlsx/Model/Ranges('''Teacher''!A10%7CA10')?$format=html
在Excel中,自訂的表名可以用兩個單引號括起來。Excel REST Services返回的資料類型有三種:html、atom和xml。注意atom是RSS的格式,如果返回的資料類型不符合RSS規範則無法顯示。