赞
踩
本人3月底0基础入门python,平时工作文字处理较多,想编一个工具用于常用文档实现自动调整对的格式。在一边学习python语法、-docx库规则,一边完善代码过程中,遇到一个瓶颈:无法直接识别docx的自动编码,导致出来的文本不完整。对此,我从网上查找解决方法,看过比较多文章都没有好办法,最后看到博主@莫魇 (不知博主是否已经解决了问题,或已经找到了更好的解决方案)莫魇 python-docx获取word的自动编号_numbering.xml-CSDN博客 里面披露了重要信息,于是顺藤摸瓜,到后台对照XML文件,把两个关键位置信息找到:
一是记载了“文档自动编号样式信息”的位置 ;
二是记载了“在文档的什么位置发生了自动编号”的位置 。
————————————————
自动编码有一本“字典”,记录了numId 和abstractNumId 的对应关系。打个比方,numId是将来被外部调用时的编号,而abstractNumId是原始编号。位置信息在:
doc.paragraphs[i].part.numbering_part.numbering_definitions._numbering.num_lst.abstractNumId.val
第一步:把标题样式信息找出,然后记录到字典中。
List_of_dict是这些放了一本本字典的列表。用字典承载自动编号的样式信息,包括numID(被外部调用时的编号)、abstractNumId(原始编号)、lvlText(自动编号具体样子)等。
第二步:识别自动编号的起始数字。
有一些时候,自动编号并非从1开始,所以先要确认起始数字。这个 start_lv123 的意思是记录一级标题、二级标题、三级标题的起始数字,0就是没有发生自动编号。因为我接触的文档最多是三级标题,所以我只需要关注有没有发生一级、二级、三级自动编号。如果实际不止3个层级,可以拓展列表,变成start_lv123456789 都是ok的。
第三步:识别文档在哪里发生了哪种样子的编号。
对于每个段落,逐个尝试是否存在numId这个属性,没有就赋值None。如果存在numId这个属性,下一步就拿val_d去查字典,读取应该替换哪种格式是%1、还是(%1) %1。如果对应一级标题的numId没对上号,就找二级标题、三级标题,对上号了,读取对应的编号格式。这样遍历完所有段落之后,实现了把自动编号变成纯文本文字。
在调试过程中我遇到了AttributeError、NotImplementedError两种报错情况,我在外层套了try...except...pass 跳过去,并没有影响排版效果。其他新的问题暂时没有发现。
回想当时牛角尖钻了1个星期,还好最后找到了出路。希望这些资料能帮到遇到同样情况的战友!
————————————————
参考文章:https://blog.csdn.net/qq_55639354/article/details/121681414
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。