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 的整体结构:

office 文档的存储格式 -- ooxml


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快速入门

如何用代码读取Office Online Server2016的文档的备注信息

猜猜密码 OOXML 文档的应用?

为啥Excel无法打开二进制数据?