处理飞书在线文档导出Word后无法自动编号问题


最近工作中经常编写一些文档,有些文档需要多人协作完成。这两天需要完成一个可研的初稿,同事使用了飞书的在线文档。第一次使用飞书进行文档协作,体验还不错,没有了金山Office在线文档的保存会导致其它同事页面自动刷新并定位到文档开头的功能,但在完成一个170多页的Word文档并导出后,发现里面的标题的编号全部是单个字符,不能在自动编号了。这个问题导致后续在Word中进行内容调整时,所有的后续编号需要手动全部更改一遍。由于文档是给客户的,也不可能一直使用飞书的在线文档(飞书的在线文档,编辑功能较弱,更适合多人一起码定,相比在线文档的格式处理,金山的功能更强大)。

飞书的文档标题,使用了类似的1.2.3.4.5的多级编码,导出后不再对应Word的标题一,标题二,标题三…,但仍然保留了类似1.2.3.4.5这样的文字,需要尝试使用这个类似1.2.3.4.5的信息进行文档修复。

解题思路:

  1. 读取文档的每个自然段,使用正则表达式分析是否存在编号信息。如果存在,则认为是标题信息,如果不存在,则认为是正文信息。
  2. 提取标题自然段的编号,使用.进行分隔,判断是几级标题。根据标题的层级,设置该自然段的样式(标题一,标题二,标题三…)。
  3. 对于正文,设置文档的左缩进,右缩进,首行缩进,文字开头的定格等。
  4. 保存文档。

处理效果

经处理后,文档的标题一到标题五,可以自动设置对应的标题,并保留了正确的多级编号,对于第6级标题,虽然成功设置成了标题六,但对应的多级编号并没有出现,原因未知。

处理代码

from docx import Document
from docx.shared import Pt
from docx.enum.text import WD_LINE_SPACING
import re

pattern = "^(\d\.)+\d?"

def get_header_level(s):
    result = re.match(pattern, s)

    level = 0
    content = s

    if result is not None:
        start = result.start()

        end = result.end()
        cols = end - start

        if cols > 0:
            idx = s[start:end]
            nums = idx.split('.')
            level = len(nums)

            if level == 2:
                if nums[1] == '':
                    level = 1

            content = s[end:]


    return level, content



file_name = r'd:\数据血缘分析与管理v0.4.docx'

word = Document(file_name)

style_heading1 = word.styles['Heading 1']    	# 使用标准样式
style_heading1.font.name = '微软雅黑'     		# 使用 "微软雅黑" 字体

style_heading2 = word.styles['Heading 2']    	# 使用标准样式
style_heading2.font.name = '微软雅黑'     		# 使用 "微软雅黑" 字体

style_heading3 = word.styles['Heading 3']    	# 使用标准样式
style_heading3.font.name = '微软雅黑'     		# 使用 "微软雅黑" 字体

style_heading4 = word.styles['Heading 4']    	# 使用标准样式
style_heading4.font.name = '微软雅黑'     		# 使用 "微软雅黑" 字体

style_heading5 = word.styles['Heading 5']    	# 使用标准样式
style_heading5.font.name = '微软雅黑'     		# 使用 "微软雅黑" 字体

style_heading6 = word.styles['Heading 6']    	# 使用标准样式
style_heading6.font.name = '微软雅黑'     		# 使用 "微软雅黑" 字体

style_Normal = word.styles['Normal']    		# 使用标准样式
style_Normal.font.name = '微软雅黑'     		# 使用 "微软雅黑" 字体

for para in word.paragraphs:

    style_name = para.style.name
    content = para.text

    level, title = get_header_level(content)

    if level == 1:
        para.style = style_heading1
        para.paragraph_format.left_indent = Pt(0)
        para.paragraph_format.first_line_indent = Pt(0)
        para.add_run('').bold = True
        para.add_run('').name = "微软雅黑"
        para.style.font.size = 279400
    elif level == 2:
        para.style = style_heading2
        para.paragraph_format.left_indent = Pt(0)
        para.paragraph_format.first_line_indent = Pt(0)
        para.add_run('').bold = True
        para.add_run('').name = "微软雅黑"
        para.style.font.size = 203200
    elif level == 3:
        para.style = style_heading3
        para.paragraph_format.left_indent = Pt(0)
        para.paragraph_format.first_line_indent = Pt(0)
        para.add_run('').bold = True
        para.style.font.size = 203200
    elif level == 4:
        para.style = style_heading4
        para.paragraph_format.left_indent = Pt(0)
        para.paragraph_format.first_line_indent = Pt(0)
        para.add_run('').bold = True
        para.style.font.size = 177800
    elif level == 5:
        para.style = style_heading5
        para.paragraph_format.left_indent = Pt(0)
        para.paragraph_format.first_line_indent = Pt(0)
        para.add_run('').bold = True
        para.style.font.size = 177800
    elif level == 6:
        para.style = style_heading6
        para.paragraph_format.left_indent = Pt(0)
        para.paragraph_format.first_line_indent = Pt(0)
        para.add_run('').bold = True
        para.style.font.size = 152400
    else:
        para.paragraph_format.left_indent = Pt(0)
        # para.paragraph_format.first_line_indent = Pt(20)

    if level < 6:
        para.text = title

    if level > 0:
        print("%s:%d" % (content, level))

    if para.style.name == "Normal":
        para.paragraph_format.first_line_indent = Pt(20)
        para.paragraph_format.line_spacing_rule = WD_LINE_SPACING.ONE_POINT_FIVE
        para.text = content.lstrip()

word.save(r'd:\数据血缘分析与管理v0.6.docx')

测试数据

1. 概述	- 5 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
1.1 项目背景	- 5 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
1.2 项目依据	- 5 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
1.3 项目目标	- 6 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
1.3.1 建立完善的数据血缘追踪机制:	- 6 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
1.3.2 数据质量监控和管理	- 7 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
1.3.3 资源利用率优化	- 7 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
1.3.4 资源调度策略制定	- 7 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
1.3.5 自动化资源管理工具开发	- 7 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
1.3.6 应用监控和故障排除机制	- 7 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
1.3.7 安全策略和措施制定:	- 7 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
1.3.8 合规性检查和审计机制	- 8 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
1.3.9 绩效评估和改进计划	- 8 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
1.3.10 持续创新和优化实践	- 8 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
1.4 项目范围	- 8 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
1.4.1 业务范围	- 8 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
1.4.2 建设单位	- 8 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
1.4.3 应用范围	- 9 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
1.4.4 数据范围	- 9 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
1.4.5 数据血缘分析和管理内容	- 9 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
2. 项目必要性分析	- 10 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
2.1 现状分析	- 10 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
2.1.1 数据中心架构现状	- 10 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
2.1.2 数据中心面临的问题与挑战	- 11 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
2.1.3 发展趋势分析	- 13 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
2.2 需求分析	- 14 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
2.2.1 业务需求	- 14 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
2.2.2 数据需求	- 15 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
2.2.3 应用需求	- 15 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
2.2.4 组件需求	- 16 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
2.2.5 高效的数据血缘计算	- 16 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
2.2.6 数据集成需求	- 17 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
2.2.7 数据安全需求	- 17 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
2.2.8 数据质量需求	- 17 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
2.3 项目必要性	- 18 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
2.3.1 支撑“4321+”工程建设	- 18 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
2.3.2 全域数据融合贯通	- 18 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
2.3.3 提升数据分析处理能力	- 18 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
2.3.4 数据安全与自主可控	- 18 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
2.3.5 适应业界技术趋势	- 19 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
2.3.6 支持大数据平台的升级	- 19 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
3. 项目方案	- 19 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
3.1 总体建设思路	- 19 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
3.2 业务架构	- 19 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
3.3 技术线路	- 21 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
3.4 功能架构	- 23 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
3.4.1 应用模块	- 23 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
3.4.2 应用功能	- 24 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
3.4.3 技术架构	- 108 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
3.4.4 数据架构	- 109 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
3.4.5 自主可控要求	- 109 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
3.4.6 系统部署方式及软硬件资源需求	- 110 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
3.5 安全方案	- 112 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
3.5.1 总体安全防护要求	- 112 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
3.5.2 安全保护等级	- 113 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
3.5.3 物理和环境安全	- 113 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
3.5.4 网络和通信安全	- 113 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
3.5.5 设备和计算安全	- 115 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
3.5.6 应用和数据安全	- 115 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
3.5.7 终端安全设计	- 118 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
3.5.8 安全管理	- 118 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
3.6 运维管理建议	- 119 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
3.7 实施方案	- 120 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
3.7.1 实施内容	- 120 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
3.8 实施策略及计划	- 127 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
3.8.1 实施策略	- 128 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
3.8.2 实施计划	- 129 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
3.8.3 实施任务分解	- 131 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
4. 项目投资估算	- 145 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
4.1 投资依据说明	- 145 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
4.2 总投资	- 149 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
4.3 各单位投资分项表	- 151 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
4.4 资金计划建议	- 154 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
5. 项目效益分析	- 157 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
5.1 管理效益分析	- 157 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
5.2 经济效益分析	- 158 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
5.3 社会效益分析	- 158 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
6. 项目风险分析	- 158 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
6.1 项目风险分析	- 158 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
6.2 实施保障措施	- 161 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
6.2.1 成立领导小组,指导和推动建设工作	- 161 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
6.2.2 建立总部及分子公司各部门与项目的配合联动机制	- 162 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
6.2.3 加强项目团队建设	- 163 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
6.2.4 严格的质量管理体系支撑	- 164 -
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
     对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
09-30 02:52