office 文档的存储格式 -- ooxml
Posted Web手艺人
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了office 文档的存储格式 -- ooxml相关的知识,希望对你有一定的参考价值。
office 作为日常的办公软件,最开始只能通过 office 客户端进行使用,在 web application 的时代,office 的功能渐渐被搬到了 web 上。
业内比较出色的有 google doc,only office,金山文档,微软在线 office,实现了比较完美的迁移和兼容。
在将 office 搬到 web 上必不可少的一步是对 office 产出文档格式的兼容,从而实现 导入 和 导出 功能。在进行 web 的数据格式和 office 的数据格式转换时,需要了解 office 文档的存储格式 ooxml。
OOXML 是由微软公司为 Office 2007 产品开发的技术规范,现已成为国际文档格式标准,于2006年12月成为ECMA标准。
word,ppt,excel 三种格式的文档的 ooxml 格式有些不同,这里以 word 进行介绍。
word 的 ooxml 格式
以 docx 为后缀的文档其实是一个压缩包,将后缀改为 zip, 然后进行解压,将会看到解压后的文件夹,其中有一个 document.xml 是整个 word 文档内容的核心。word 的 ooxml 结构主要有两种容器,一种是段落 paragraph,另一种是 table。
文档解压后的目录结构如下:
paragraph 容器中包含了 ppr 和 run,ppr 主要是当前段落的样式,run 表示的是当前段落中的内容, 结构如下:
ppr 的整体结构:
run 的整体结构:
将 word 进行解压后,打开 document.xml, 格式化后看到的数据如下:
其中 <w:b /> 表示字体加粗,当在 word 中给一个元素设置字体加粗的时候,具体的数据存储就会添加该标签。
<w: sz val="32" /> 表示的是字体的大小,其中的取值 32 表示的不是 css 常用的 px。而是 half-points。在将其对应到 css 中的 px 取值时需要进行一套换算规则。
<w:t>Word</w:t> 表示的 word 文档中具体的文本内容,所有输入的文本内容最终在 word 中的存储的时候都是放到了 <w: t> 标签中。
详细的参考文档可以看 http://officeopenxml.com。
ooxml 中的单位
在 html 页面中,表示一个元素的尺寸时常用的单位是 px,此外还有用于响应式的 百分比,rem,em 等等。
但是在 ooxml 中,表示元素的尺寸的单位和 web 中元素尺寸的单位不一样,ooxml 中常用的单位有 dxa, Half-points, EMUs,这些单位最终都可以转为 point,point 可以转换为 px,一般认为 72pt = 96px。
dxa
dxa 的意思是 Twentieths of a point,也就是 20 分之一点。是一个在 ooxml 中很常用的单位,在设置段落行距,缩进,行高的时候都会应用这个单位。
比如下面表示段前段后几行的时候,w:before 表示段前几行,其中 312 的单位就是 dxa,通过 312 / 20 = 15.6 point 换算,可以最终换算到 point 。
<w:pPr>
<w:spacing
w:beforeLines="100" w:before="312"
w:afterLines="100" w:after="312"
/>
</w:pPr>
// 设置页面尺寸
<w:pgSz w:w="11900" w:h="16840"/>
Half-points
Half-points 的意思是半个点,比如在设置字体大小的时候就会用到。
<w:rPr>
<w:sz w:val="24"/>
</w:rPr>
这里字体的取值是 24 Half-points,除以 2 换算为点位。就是 24 / 2 = 12 point。
EMU
EMU 用于矢量图形和嵌入图片中的坐标。EMU 是一个虚拟的单位,可以连接 centimeters 和 inches。1 inches 等于 914400 emu。
之所以使用这样的比较大的单位,据我所知是为了确保了可以在整数 100 英寸、毫米和像素之间来回转换,而不需要任何浮点。
下面的数据表示了一张图片的尺寸:
<w:drawing>
<wp:inline distT="0" distB="0" distL="0" distR="0" wp14:anchorId="134B47D2" wp14:editId="4A0F0274">
// 图片的尺寸
<wp:extent cx="5270500" cy="2453005"/>
...
</wp:inline>
单位的之间的换算规则是 1in = 914400 EMUs = 72pt 。
所以换算之后图片的次尺寸是 5270500 * (96 / 914400) point * 2453005 * (96 / 914400) point 。
结语
初步介绍了 ooxml 对 word 文档的表示,以及常用单位的转换,了解了这些知识,就能进一步了解 ooxml 文档的数据格式,从而进行解析转换为我们需要的数据格式。更多细节参考官方文档。
以上是关于office 文档的存储格式 -- ooxml的主要内容,如果未能解决你的问题,请参考以下文章
如何使用集成在 SharePoint 中的开源 ONLYOFFICE 文档替代微软 Office
PHPWordPHPOffice 套件之PHPWord快速入门
PHPWordPHPOffice 套件之PHPWord快速入门