导出固定格式的word编码思路
True
导出固定格式的word编码思路

本文主要给出导出固定格式word的思路,以及需要使用的一些库。

第一部分是 导出思路:

第二部分是奇特的bug:

第三部分是需要使用的库:

第一部分:思路整理

docx 后缀的word 可以修改 docx 为 zip,解压后看到word内的所有资源。以下信息源于笔者实测,资料较少,故具体xml 的解释暂不讨论。

doc 不讨论。

如果word内有图片,需要在[Content_Types].xml里加上 <Default Extension="png" ContentType="image/png"/>


只关注 word 文件夹,其余文件夹不需要更改。打开word文件夹:


_rels文件夹内只有一个文件 :document.xml.rels  这是存放图片引用的文件:


Id 属性 会在其他地方用到,Target 属性 格式必须为 "media/xxx" ,其余内容一致即可



media 文件夹内存放图片资源,图片的名称与上文 Target属性后的名称一致



document.xml


w:p 一个段落

w:r 写内容

w:u 下划线

w:drawing 图片xml

需要关注 r:embed 这里就写document.xml.rels  内 id的值

wp:extent 后跟的 cx  cy 是 长度和宽度 剩下的资源可以不变,例如wp:docPr 后面的内容,应该是可以都一样的。



word资源文件的解说就差不多了,我们要做的就是使用模板引擎用占位符的方式在 document.xml 里 替换掉我们需要输出的关键点 。然后有图片的话把图片资源放到media文件夹下,修改引用地址,最后再到模板里填写。


模板属性赋值


或者循环


最后将整个文件夹打包为zip格式,再重命名文件,将文件后缀名修改为 docx


第二部分:bugs

值得注意的地方,pycharm 调试模式下可以正常输出docx ,但是再运行模式下会报错。    

下图是 zipfile 源码里报错的部分。这里看了下官方的解释,但没0用。

报错的原因是 zipfile 无法压缩 1980年以前创建的文件!!!

因为这个word的所有资源是我们通过修改后缀名的方式来得到的,所以在这个文件夹内看到部分文件实际上是没有文件创建\修改 时间的!!

解决办法就是 格式化一下这些xml ,这样文件就有修改日期了。 详细问题描述下面。


程序提示错误:"ZIP DOES NOT..."


下面分别是调试模式和运行模式下zipfile 打包时候得到的文件修改日期,调试模式下是 1980 年 ,运行模式下是1979 年。





在插入图片的时候可以考虑将图片压缩插入。这样能节省word大小。

第三部分:常用类库

1.对文件、文件夹的操作,例如打包、移动、删除考虑使用 shutil 


2.对JinJia2模版引擎的简单使用

第一步:path = r'c:\xxx\xxx\xxx\'    这是模版文件路径 

第二步:env=Environment(load=FileSystemLoader(path),keep_trailing_newline=true)   创建包加载这个路径

第三步:temp = env.path('moban')  获取模版文件

第四步:hellotxt = temp.render(object=传入模版的参数)  渲染模版文件

剩下的就是文件读写操作,打开 moban 文件,清空这里面的内容,然后将上面渲染吼的hellotxt写入进去。


3.如果word内有图片,需要在[Content_Types].xml里加上 <Default Extension="png" ContentType="image/png"/> ,否则打开word会报错。


4.Word 内所XML资源最好通过格式化工具 全都格式化一遍,以免出现 ZipFile 无法压缩的问题。




odoo shell +ipython +pycharm 代码调试
True