相关文章推荐
喝醉的电脑桌  ·  Gitlab的CICD - 知乎·  1 年前    · 
冷静的帽子  ·  asp.net mvc form ...·  2 年前    · 
狂野的橡皮擦  ·  DateTimePicker ...·  2 年前    · 

文本每段会分配一个 numId ilvl ,每个numId对应一个 abstractNumId ,每个abstractNumId对应一组格式,这个格式是个序列通过 ilvl 的值作为索引。document.xml文件中需要的标签的作用:

<w:ilvl w:val="0"/> : 用来确定是同个abstractNumId的不同格式

<w:numId w:val="1"/> :每个numId对应一个abstractNumId,一种自动编号用两次就会生成两个numId,两个abstracNumId。如 一、......二、...... ,此时这两段标题的numId是一样的。如 一、......一、...... ,此时这两段的numId是不同的,相应的会对应两个不同的abstractNumId。不带自动编号的段落的numId为0,且没有对应的abstractNumId

numbering.xml文件中的需要的标签的作用:

<w:abstractNum w:abstractNumId="17"> :对应 一组 格式

<w:lvl w:ilvl="0" w:tentative="0"> :对应这 一组 格式中的 一种 格式

<w:start w:val="1"/> :表示这 格式从几开始,如为1时,一、,为二时,二、。这个值只是表示这 格式时从几开始自动编号,不是表示编号的顺序。

<w:numFmt w:val="decimal"/> :表示这种格式是什么类型的

<w:lvlText w:val="%1、"/> :表示这种格式的样式。

简单叙述一下word怎么实现自动编号的,带编号的段落在document.xml生成一个numId和ilvl,每个numId对应一个abstractNumId,每个abstractNumId有一组格式序列,每个ilvl对应改组格式序列的一种格式。每个格式有start确定起始编号,numFmt确定格式类型,lvlText确定格式样式。通过numFmt和lvlText的组合确定自动编号的最终的样式。

2.python-docx获取word中的自动编号

了解word的文件构成之后,利用python-docx获取上述的信息。

安装命令: pip install python-docx

from docx import Document
d = Document('标题.docx')
for p in d.paragraphs: # 获取每个段落
    # 获取numId
    print('numId', p._element.pPr.numPr.numId.val, end='  ')
    # 获取ilvl的值,注意纯文本段落没有ilvl,其ilvl是None
        print('ilvl', p._element.pPr.numPr.ilvl.val, end='  ')
    except AttributeError:
        print('ilvl', p._element.pPr.numPr.ilvl, end='  ')
    # 获取每个段落的文本信息
    print('text', p.text)
# 获取numbering.xml文件中的信息
ct_numbering = d.part.numbering_part._element
numXML = d.part.numbering_part.numbering_definitions._numbering
for num in ct_numbering.num_lst:
    # 获取numId和abstractNmuId的对应关系
    print('numId:', num.numId, end='  ')
    print('abstractId:', num.abstractNumId.val)
for i in numXML.abstractNum_lst:
    # 获取每个abstractNumId里面的每个ilvl里的lvlText,numFmt,start
    for j in i.lvl_lst:
        print('lvlText:', j.lvlText_lst[0].val, end='  ')
        print('start:', j.start_lst[0].val, end='  ')
        print('numFmt:', j.numFmt_lst[0].val)

word内容

代码运行结果:

3.尚未解决的问题

(1)、单级编号的顺序没办法直接确定

同一个标号的不同顺序的numId相同,ilvl值相同。如一、......二、......,其中段落一、......和段落二、......的numId和ilvl值相同,意味着abstractNumId、start、numFmt、lvlText都相同。所以如何解决标号的顺序,目前我没有发现可以直接获取到顺序的方法。

但是可以通过计算相同numId的出现次数来确定顺序。

(2)、多级编号的顺序没办法直接确定,计数的也行不通

“1.,1.1,1.2,2.,2.1,2.2”这类的多级编号,这几个段落的numId全部相同,其中1.,2.的ilvl值相同,1.1,1.2,2.1,2.2的ilvl值相同。

对于这两个问题请能够解决的大佬给予指导。

python docx 读取 自动 编号 最近需要用 python 读取docx文档,然后遇到 python-docx 无法读取到 自动 编号 的问题,例如我们要读取的docx文档: 接下来我们读取文档的文本内容: from docx import Document doc = Document('simple.docx') for para in doc.paragraphs: text = para.text print(text) 运行结果: 这是一个示例docx文档 下面是 自动 编号 Word 标题 样式好用(如上图),可以方便设置同一级 标题 的样式,但是在 标题 样式设置中的“ 编号 ”(如下图)却无法达到我们想要的多级 自动 编号 的需求。 搞不好,就会弄得全盘皆乱,让人头疼,就像下图一样,令人抓狂: 0x02 标题 样式中的多级 自动 编号 我想要的很简单,只是想在 标题 样式中设置多级 自动 编号 而已,就像下面这样 1.这是一级 标题 1.1.这是二级 标题 1.1.1.这是三级 标题 前面写了如何处理 word 中的表格:利用 python 批量处理 Word 文件——表格 ,其实我觉得 word 正文应该很少用到批处理,不过万一有朋友需要呢,我们要处理的文件内容千奇百怪,但我觉得难点其实是如何对我们想处理的内容进行读写,所以这篇博客的主要内容就是 word 文件的读写。我把 word 文件中的内容分为三类:一是表格;二是图片;三是其它内容。表格和图片的处理我在另外的博客中有详细说明,这里主要谈谈wo... 1、 Word 表格 自动 填充在 Word 表格里选中要填入相同内容的单元格,单击“格式→项目符 编号 ”,进入“ 编号 ”选项卡,选择任意一种样式,单击“自定义”按钮,在“自定义 编号 列表”窗口中“ 编号 格式”栏内输入要填充选择“无”,依次 编号 样式”栏内选择“无”,依次单击“确定”退出后即可。2、 Word 中巧输星期单击“格式一项目符 编号 ”,进入“ 编号 ”选项卡,单击“自定义”按钮,在“ 编号 样式”栏内选择“一... 这个方法的重点在于打开时套用的模板module.docx,这个模板打开后,在代码中编辑的doc文档就会 自动 套用模板中设置好的样式(比如代码里的add_heading,套用的分别是 标题 123),2.右键点击工具栏里的样式,这里以 标题 123为例,因为 python-docx 里可以直接简单调用预设好名称的样式。5.点击高级按钮展开后,设置需要的级别,这里是第一个重点,要将级别链接到你选择的样式,这里以 标题 1为例。6.然后是子级 编号 的设置,要额外设置一项,如下图。7.其它要设置的样式都设置好,然后保存文档即可。 <w:abstractNum w:abstractNumId="20" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="74A24434"/> <w:multiLevelType w:val="multilevel"/> <w:tmpl w:val="74A24434"/> Python 读取 word 文本操作详解发布时间:2020-08-28 04:27:34来源:脚本之家阅读:105作者:熊猫大哥大本文研究的主要问题时 Python 读取 word 文本操作,分享了相关概念和实现代码,具体如下。一,docx模块 Python 可以利用 python-docx 模块处理 word 文档,处理方式是面向对象的。也就是说 python-docx 模块会把 word 文档,文档中的段落、文本、字体等都看...