以XML为中间文档格式的Excel电子表格向SVG图转换

独自空忆成欢 提交于 2019-12-10 17:40:47
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 中既有图表方面还需进一步的研究。该方案也为文档转换提供了新思路。 
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!