以XML爲中間文檔格式的Excel電子表格向SVG圖轉換
1. 引 言
隨着辦公自動化、電子政務的發展,無紙化辦公已經是大勢所趨。當前主流的文檔格式有:
Microsoft Office, OpenOffice, PDF 等。其中企業的統計數據、內部報表多以Excel 電子表格
來呈現。不一樣企業間數據交換每每存在平臺的差別,所以如何保證能在不一樣的平臺上瀏覽
Excel 電子表格成爲急需解決的問題。此外,近年來,移動互聯網飛速發展,也帶來了許多
新的需求。移動化辦公已經是將來的發展趨勢。移動用戶但願經過本身的手持終端(手機、PDA
等)也能訪問保存於網絡上的公文文檔信息。而傳統的電子表格是爲PC 設計的,在一個屏
幕受限的終端設備上沒法正常顯示。
本文正是基於這樣的需求,提出了一種以XML 爲中間文檔格式的Excel 電子表格向
SVG 圖轉換的解決方案。該方案經過將一個Excel 電子表格轉化成一個SVG 圖,來提供公
文文檔的跨平臺瀏覽。同時,經過SVG 圖的可縮放性,知足了手機等屏幕受限設備的訪問
需求。
2. SVG 技術簡介
SVG(Scalable Vector Graphics,可伸縮矢量圖形)[1][2]是W3C 組織爲適應Internet 應用飛
速發展的須要而制定的一套基於XML 語言的可伸縮矢量圖形語言描述規範。SVG 提供了四
種類型的圖形對象:矢量圖形、圖像、漸變填充和文本,圖形對象還可進行分組、添加樣式、
變換、組合等操做。SVG 徹底由元素和屬性等標記組成,可以描述任意複雜的圖像。SVG
標準中有專門用於矢量圖形描述的標記,如矩形、圓、橢圓、直線、折線、多邊形等,還可
經過<path>標記進行Bezier 曲線的定義和操做,同時可對相應路徑進行勾勒、填充、裁剪、
蒙板和合成等一系列操做。
SVG 與目前因特網上經常使用的gif、jpg 等點陣圖像文件相比具備圖像無級縮放、便於網
絡傳輸、交互性、便於檢索等優勢。3. Excel 文件到XML 格式的轉換
3.1 Excel 文件格式分析
3.1.1 Excel 文件的物理結構
微軟的 Excel 電子表格採用了一種名爲BIFF[3](二進制文件格式)的文件格式。它包含
了許多類型的BIFF 記錄。每一個記錄包含四個字節的頭部信息。其中前兩個字節用來講明記
錄的類型。後兩個字節用來講明記錄的長度。頭部的值是按照地址從高到低的順序存儲。其
餘的記錄爲數據部分。
BIFF 記錄頭
| 記錄頭 | 記錄體
字節數 | 0 1 2 3 | 0 1
記錄的內容 | XX | XX | XX | XX | XX | XX |…
| 操做碼 | 長度 | 數據
每個X 表明一個十六進制位。
3.1.2 Excel 文件的邏輯結構
一個 Excel 電子表格是有一個Workbook(工做薄)構成。一個Workbook 是有一系列
的Sheet(工做表)構成。每個Sheet 是有一系列的行和列組成。能夠經過行列索引定位
到具體的單元格。一個單元格的信息包括內容信息和格式信息。
3.2 Excel 文件的解析
3.2.1 Java Excel API 簡介
目前,支持 Excel 文檔解析的開源工具包有Apache POI,Java Excel API 等。本文采用
Java Excel API 來解析Excel 文檔。
Java Excel API 是一開放源碼項目,經過它Java 開發人員能夠讀取Excel 文件的內容、
建立新的Excel 文件、更新已經存在的Excel 文件。使用該API 非Windows 操做系統也能夠
經過純Java 應用來處理Excel 數據表。
Java Excel API 提供如下功能:
從 Excel 95-20003 等格式的文件中讀取數據;
讀取Excel 公式(能夠讀取Excel 97 之後的公式);
生成Excel 數據表;
支持字體、數字、日期的格式化;
支持單元格的陰影操做,以及顏色操做;
修改已經存在的數據表;
讀取圖表信息。
3.2.2 利用Java Excel API 提取Excel 文檔的信息
如下是部分 Java Excel API 提供的編程接口示例:
// 用來從一個Excel 文檔獲取一個Workbook 對象// 用來獲取一個Excel 文檔中sheets
Sheet[] sheets = workbook.getSheets();
// 獲取第row 行的全部單元格
Cell[] cells = sheet.getRow(row);
// 獲取一個單元格的內容信息
String content = cell.getContents();
// 獲取一個單元格的格式信息
CellFormat cellFormat = cell.getCellFormat();
下面是Excel 解析的流程圖:
圖 1. Excel 解析流程圖
3.3 XML 中間文檔格式的定義
實現從 Excel 文檔向XML 文檔[4]的轉換,除了要解析Excel 文檔外,還須要把解析出來
的信息經過創建XML Dom[5]樹保存到XML 文件中,所以須要根據文檔內容和格式信息定
義一個恰當的XML。元素主要包括頁面,段落,行,單元格,文本,圖像等。這樣設計XML文檔Schema 的目的是爲了對XML 文檔進行下一步的內容提取和文檔轉換等工做。下面給
出了定義的XML Schema 的部份內容。
段落元素:段落能夠包含許多其餘元素,因爲內容比較長,這裏經過inline 元素組來間
接定義段落包含的元素。此外段落還有位置,文本格式等其餘屬性,分別經過引用
PositionGroup, TextFormatGroup 等屬性組定義。
<!—如下是段落元素的描述-->
<xs:element name="PARAGRAPH">
<xs:complexType mixed="true">
<xs:sequence>
<!—關於段落內容的詳細信息見後面的"inline"引用-->
<xs:group ref="inline" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attributeGroup ref="PositionGroup"/><!—位置屬性組-->
<xs:attributeGroup ref="TextFormatGroup"/><!—文本格式屬性組-->
……
</xs:complexType>
</xs:element>
這裏對上面的段落屬性組中引用的inline 進行了定義,能夠發現段落能夠包含文本,圖
像……等元素。
<!—對應上面」PARAGRAPH」中對」inline」的引用-->
<xs:group name="inline">
<xs:choice>
<xs:element ref="SPECIALTEXT"/><!—文本-->
<xs:element ref="LINK"/><!—連接-->
<xs:element ref="IMAGE"/><!—圖像-->
<xs:element ref="FIELD"/><!—域-->
……
</xs:choice>
</xs:group>
文本採用字符串類型存儲,這裏也定義了它的文本格式
<!—對文本的定義-->
<xs:element name="SPECIALTEXT" type="xsd:string">
<xs:attributeGroup ref="TextFormatGroup"/>
……
</xs:element>
這裏是對文本格式的定義,包括字體,顏色,粗體……等信息。
<!—對文本格式屬性組的定義-->
<xs:attributeGroup name="TextFormatGroup">
<xs:attribute name="font" type="xs:string" use="optional"/><!—字體名-->
<xs:attribute name="font-size" type="xs:decimal" use="optional"/><!—字號-->
<xs:attribute name="font-color" type="xs:string" use="optional"/><!—字符顏色-->
<xs:attribute name="bold" type="Boolean" use="optional"/><!—粗體-->
<xs:attribute name="italic" type="Boolean" use="optional"/><!—斜體--><xs:attribute name="underline" type="Boolean" use="optional"/><!—下劃線-->
……
</xs:attributeGroup>
3.4 生成XML 的中間文檔格式
由 3.2 小節可知,經過對Excel 文檔的解析,能夠獲取Excel 文檔的內容信息和格式信
息。經過將這些內容信息和格式信息按照 3.3 小結定義的XML 格式從新組裝起來,即可獲
得一個格式良好的XML 文件。
4. XML 文件到SVG 圖的轉換
4.1 Batik 的使用[6]
Batik 是Apache 軟件基金會(Apache Software Foundation)開發的一個開源項目。該項
目的目標是提供一組核心模塊,經過使用這些模塊能夠實現特定的SVG 解決方案。
Batik 是基於Java 技術的工具集,用於使用Scalable Vector Graphics (SVG) 圖像的應用
程序,其功能範圍包括圖像顯示、生成和操做。工具集提供了一組核心模塊,包括:
SVG 文檔對象模型的實現(SVG DOM),用於其生成和操做SVG 內容;
Transcoder 模塊可以將SVG 文檔轉換爲光柵圖像;
JSVGCanvas 模塊,一個swing 組件,能夠用於渲染靜態或動態的SVG 內容。
SVG DOM API 定義了一個接口叫作DOMImplementation,這個接口用來表現任意DOM
implementation 之間的鏈接。這個類的做用是經過提供方法建立一個document 來鏈接一個指
定的DOM實例。而後具體的Document 表現爲一個XML Document 而且跟各類各樣的DOM
對象工廠好比Element,Attr,Text 那樣動做。
如下例子展現如何獲取一個具體的 DOMImplementation 對象:
import org.w3c.dom.DOMImplementation;
import org.apache.batik.dom.svg.SVGDOMImplementation;
DOMImplementation impl = SVGDOMImplementation.getDOMImplementation();
一旦你已經建立了一個DOMImplementation 實例,你就可使用DOM API 了。
建立一個 Doucument 的示例以下:
import org.apache.batik.dom.svg.SVGDOMImplementation;
import org.w3c.dom.Document;
// 在SVGDOMImplementation 中咱們使用了一個不變的常量
// but we could have used "
http://www.w3.org/2000/svg
".
String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;
DOMImplementation impl = SVGDOMImplementation.getDOMImplementation();
Document doc = impl.createDocument(svgNS, "svg", null);
當咱們已經建立了一個 SVG Document 時,若是須要的話,我門能夠映射這個document
到一個SVGDocument。
下面的代碼片斷顯示怎樣在一個(400,450)範圍的SVG 屏幕中,在(10,20)點建立一
個大小爲(100,50)的紅色矩形。
import org.apache.batik.dom.svg.SVGDOMImplementation;import org.w3c.dom.Document;
import org.w3c.dom.Element;
DOMImplementation impl = SVGDOMImplementation.getDOMImplementation();
String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;
Document doc = impl.createDocument(svgNS, "svg", null);
// 得到根元素('svg' 元素).
Element svgRoot = doc.getDocumentElement();
// 設置'svg'根元素的寬,高屬性.
svgRoot.setAttributeNS(null, "width", "400");
svgRoot.setAttributeNS(null, "height", "450");
// 建立矩形
Element rectangle = doc.createElementNS(svgNS, "rect");
rectangle.setAttributeNS(null, "x", "10");
rectangle.setAttributeNS(null, "y", "20");
rectangle.setAttributeNS(null, "width", "100");
rectangle.setAttributeNS(null, "height", "50");
rectangle.setAttributeNS(null, "fill", "red");
// 綁定 rectangle 到'svg'根元素.
svgRoot.appendChild(rectangle);
4.2 利用Batik 實現XML 到SVG 圖的轉換
遍歷由 Excel 生成的XML DOM,逐行輸出Excel 中的信息。對於Excel 中的單元格的
邊框則對應一個SVG 的<rect>元素,單元格的內容則能夠經過drawString 方法來生成。當遍
歷結束時,一個XML DOM 就轉換成一個SVG DOM。能夠將SVG DOM 輸出到文件系統
或轉入其餘的後續處理。
5. 結論
本文經過將 Excel 轉換爲SVG 圖,實現了Excel 電子表格在不一樣平臺上的瀏覽。同時,
因爲SVG 支持可縮放性,能夠在提供SVG 支持的智能設備上瀏覽電子表格中的信息。該方
案在處理Excel 中既有圖表方面還需進一步的研究。該方案也爲文檔轉換提供了新思路。
歡迎關注本站公眾號,獲取更多信息