当前位置:   article > 正文

python 基于-docx库解决docx自动编号识别问题的一种参考方案_python docx删除自动编号

python docx删除自动编号

本人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 版权协议,转载请附上原文出处链接和本声明。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/795953
推荐阅读
相关标签
  

闽ICP备14008679号