還有什么不能做?——細談在C#中讀寫Excel系列文章之一


  在寫這一系列文章之前,我要首先申明一個事情,那就是自打.NET一開始我們大概就已經開始使用它在自己的程序中與Excel進行交互了,諸如從Excel中讀取數據顯示報表、將程序中的數據導出到Excel中等等。這個看似很平常,而且我相信有很多的人都寫過或看過類似的程序。在早期版本的.NET中我們需要在Windows中執行一個命令(時間太久我也不太記得這個命令叫什么了)來將Office COM組件變成托管代碼以便在.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規范則無法顯示。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM