# OfficeXml ## 概述 将docx、pptx、xlsx等文件中的xml转为tsl对象 ```xml 最小申购、赎回单位 (份) ``` 上述是一个docx中的段落的xml,序列化为tsl过程如下 ```go namespace "DOCX" // 设置命名空间为DOCX p := new P(); // 创建一个P对象(段落w:p) p.Init(node); // 假设node节点是上面的xml指向的Node对象 p.Deserialize(); // 将node对象的xml序列化到tsl对象 // 序列化完毕后,可直接对应取值 echo p.PPr.Jc.Val; // 输出:left // 如果需要修改内容,通过Serialize()回写到node p.PPr.Jc.Val := "center"; // 回写方法1,适合修改单个对象 p.PPr.Jc.Serialize(); // 回写方法2,大量修改,不同的对象 p.Serialize(); // 或p.PPr.Serialize() // 在获取存在多个节点的对象时,比如上述的w:r对象是复数的,则需要通过Rs()获取 // 直接调用Rs()会获取所有的R对象,加上索引会获取第N+1个 echo p.Rs(1).T.Text; // 输出:(份) ``` ## 基类 `OpenXmlElement.tsf`提供了一些常用的方法,具体可见`tsf`文件 ## 部件 ### Components 一共有三个部件,分别是`Components@DOCX.tsf`,`Components@XLSX.tsf`,`Components@PPTX.tsf` 以`Components@DOCX.tsf`为例,使用这个类,可以获取到对应的docx文件的xml对象 ```go namespace "DOCX" component := new Components(); // 创建对象 component.Open("", "xxx.docx"); // 打开文件 document := component.Document; // 获取document.xml,生成Document对象 document.Deserialize(); // 将xml对象的数据反序列化到tsl对象中 document.Body.Elements(); // 可以获取document的body下的所有对象列表 // 反序列化后,可进行读写 styles := component.Styles; // 获取styles.xml,生成Styles对象 ``` document.xml内容如下 ```xml 分栏前 ``` ### 单位装饰器UnitDecorator 每个对象都有一个单位装饰器,能统一转成磅(point)单位(如果有配置属性转换),还能保留原来的接口 装饰器`tsf`统一命名是`原本对象名+UnitDecorator@命名空间`,如`docx`的`SectPr`对象的装饰器是`SectPrUnitDecorator@DOCX` 如:有下面一段xml,其中的`pgSz.w = "11906", pgSz.h = "16838"`都需要转换成point ```xml ``` ```go namespace "DOCX" component := new Components(); // 创建对象 component.Open("", "xxx.docx"); // 打开文件 document := component.Document; // 获取document.xml,生成Document对象 document.Deserialize(); // 将xml对象的数据反序列化到tsl对象中 sect_pr := document.Body.SectPr; // 获取SectPr对象 sect_pr_unit_decorator := new SectPrUnitDecorator(sect_pr); // 装饰器构造需要原本的对象 echo "w = ", sect_pr.PgSz.W; // 输出的是字符串,原本的单位是twips echo "\n"; echo "w = ", sect_pr_unit_decorator.PgSz.W; // 此时输出的是数字类型,单位是point ``` ### 适配器Adapter 适配器是通过key获取对应的对象,比如样式可以通过样式ID获取对应的样式对象 只有部分对象才有适配器(具体可见`autoclass/adapter`),比如`Styles`的适配器是`StylesAdapter@DOCX` styles.xml部分如下 ```xml ``` ```go namespace "DOCX" component := new Components(); // 创建对象 component.Open("", "xxx.docx"); // 打开文件 document := component.Document; // 获取document.xml,生成Document对象 document.Deserialize(); // 将xml对象的数据反序列化到tsl对象中 styles := document.Styles; // 现在需要通过styleId获取Style对象 styles_adapter := new StylesAdapter(styles); // 通过StyleId获取Style对象 style := styles_adapter.GetStyleByStyleId("a6"); echo style.Name; // 输出的是"页脚 字符" ```