用XML操作Excle檔案
在項目中有時候需要將資料輸出到Excle,辦法很多,比如說用ADO,但是這些都不能滿足效能上的要求,如果你將10W條資料用ADO方式寫入資料庫,速度是很慢的。而且還不能對產生的Excle設定格式。
一個偶然的機會,我發現將Excle檔儲存為XML(表格),然後用記事本開啟就會發現,整個檔案就是一個XML資料.對這個檔案進行操作還能得到複雜的效果,比如:合併儲存格,字型,顏色,甚至是為儲存格設定公式。
比如這樣的:
一些值得注意的地方:
一 .檔案頭部有以下資訊:
<?xml version="1.0"?> <?mso-application progid="Excel.Sheet"?> <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40"> <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"> <Author>xRoy</Author> <LastAuthor>xRoy</LastAuthor> <Created>2009-02-25T03:21:56Z</Created> <Company>SunnySec</Company> <Version>11.9999</Version> </DocumentProperties>
其中,一下幾個部分可以修改,其意思很簡單,懂點E文就知道了.
<Author>xRoy</Author> <LastAuthor>xRoy</LastAuthor> <Created>2009-02-25T03:21:56Z</Created> <Company>SunnySec</Company> <Version>11.9999</Version>
二 .接下來你將看到<Styles>部分,大概就像這樣:
<Styles> <Style ss:ID="Default" ss:Name="Normal"> <Alignment ss:Vertical="Center"/> <Borders/> <Font ss:FontName="宋體" x:CharSet="134" ss:Size="12"/> <Interior/> <NumberFormat/> <Protection/> </Style> <Style ss:ID="s21"> <Alignment ss:Vertical="Center"/> <Borders> <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/> <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/> <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/> <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/> </Borders> <Font ss:FontName="宋體" x:CharSet="134" ss:Size="12"/> <Interior ss:Color="#800080" ss:Pattern="Solid"/> <NumberFormat/> <Protection/> </Style> <Styles/>
<Styles>部分定義了一個樣式的集合,每一種樣式都在<Style></Style>中描述,我的理解是,每一個樣式都是代表了一個儲存格的形態,注意是一個,能不能在一個儲存格上組合多個此處定義的樣式,還沒測試.在<Style>中:
ss:ID 定義該樣式的名稱,要使用一個樣式的時候需要用到.
<Borders><Borders/> 這個東西就說明目前的儲存格的四個邊的樣式(有沒有線條?線條多粗..)
Font 定義儲存格上文字的樣式
Interior: 指的是底色,ss:Color用於描述顏色,ss:Pattern 描述如何繪製
三 .資料部分
在這部分,你會看見類似這樣的內容:
<Worksheet ss:Name="Sheet1"> <Table ss:ExpandedColumnCount="9" ss:ExpandedRowCount="6" x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25"> <Column ss:AutoFitWidth="0" ss:Width="50.25"/> <Column ss:AutoFitWidth="0" ss:Width="92.25"/> <Column ss:AutoFitWidth="0" ss:Width="102.75"/> <Column ss:AutoFitWidth="0" ss:Width="80.25"/> <Column ss:AutoFitWidth="0" ss:Width="83.25"/> <Column ss:AutoFitWidth="0" ss:Width="59.25"/> <Column ss:AutoFitWidth="0" ss:Width="58.5"/> <Column ss:AutoFitWidth="0" ss:Width="133.5"/> <Column ss:AutoFitWidth="0" ss:Width="198.75"/>
說明:
<Worksheet ss:Name="Sheet1">
這裡說明有一個叫做Sheet1的表單
<Table ss:ExpandedColumnCount="9" ss:ExpandedRowCount="6" x:FullColumns="1"
x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25">
對於這個表單的總體資料描述:
ss:ExpandedColumnCount="9" 資料表格有9列
ss:ExpandedRowCount="6" 資料表格有6行
後面的就是設定一些預設屬性,如果你在後面具體的表格上沒有指定樣式,就會用到這些.
<Column ss:AutoFitWidth="0" ss:Width="50.25"/>
依次定義ss:ExpandedColumnCount個列的寬和高
接下來就是資料部分了,完整的一行大概是這樣的:
<Row ss:AutoFitHeight="0"> <Cell ss:StyleID="s22"><Data ss:Type="String" x:Ticked="1">交易類型</Data></Cell> <Cell ss:StyleID="s22"><Data ss:Type="String" x:Ticked="1">產品名稱</Data></Cell> <Cell ss:StyleID="s22"><Data ss:Type="String" x:Ticked="1">收方單位</Data></Cell> <Cell ss:StyleID="s22"><Data ss:Type="String" x:Ticked="1">產品開始序號</Data></Cell> <Cell ss:StyleID="s22"><Data ss:Type="String" x:Ticked="1">產品結束序號</Data></Cell> <Cell ss:StyleID="s22"><Data ss:Type="String" x:Ticked="1">數量</Data></Cell> <Cell ss:StyleID="s22"><Data ss:Type="String" x:Ticked="1">操作員</Data></Cell> <Cell ss:StyleID="s22"><Data ss:Type="String" x:Ticked="1">時間</Data></Cell> <Cell ss:StyleID="s22"><Data ss:Type="String" x:Ticked="1">備忘</Data></Cell> </Row>
<Row ></Row>部分描述的這一行的預設屬性,它也可以指定樣式,比如<Row ss:AutoFitHeight="0" ss:StyleID="s22">,這樣的話,在這一行上面,任何沒有特殊指定樣式的表格都是這個預設樣式.
<Cell><Cell/>部分描述具體一個表格的樣式,必須使用前面你已經定義好的<Style>.
四 .資料尾部
就是這個樣子:
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel"> <Unsynced/> <Selected/> <Panes> <Pane> <Number>3</Number> <ActiveRow>6</ActiveRow> </Pane> </Panes> <ProtectObjects>False</ProtectObjects> <ProtectScenarios>False</ProtectScenarios> </WorksheetOptions> </Worksheet>
這些一般用處不大,沒有仔細研究.
其他:在程式中可以用TinyXML來操作XML,另外還有編碼問題要考慮,檔案儲存為*.xml,你發現即使安裝的Excle,這個問預設的開啟檔案可能也不是Excle,有個技巧,將你檔案的頭部插入2 個位元組,內容為[0xFF,0xFE].