当前位置: 首页 > article >正文

使用python-docx在word文档中查找书签,并在书签处写入数据

from docx import Document,oxml
from docx.oxml.shared import qn
from docx.text.paragraph import Paragraph
from docx.oxml import OxmlElement
def get_bookmark_par_element_start(document, bookmark_name):
    """查找标签的起始位置(所在的段落)"""
    doc_element = document.part.element
    bookmarks_list = doc_element.findall('.//' + qn('w:bookmarkStart'))
    for bookmark in bookmarks_list:
        name = bookmark.get(qn('w:name'))
        if name == bookmark_name:
            par = bookmark.getparent()
            if not isinstance(par, oxml.CT_P):
                print('par不是CT_P类型,返回2')
                return 2
            else:
                print(type(par))
                #return par, bookmark.get(qn('w:id'))
                return par
    print('没找到书签,返回1')
    return 1
#查找书签的结束位置(所在的段落)
def get_bookmark_par_element_end(document, bookmark_id):
    doc_element = document.part.element
    bookmarks_list = doc_element.findall('.//' + qn('w:bookmarkEnd'))
    for bookmark in bookmarks_list:
        name = bookmark.get(qn('w:id'))
        if name == bookmark_id:
            par = bookmark.getparent()
            if not isinstance(par,oxml.CT_P):
                return 2
            else:
                return par
    return 1
def insert_paragraph_after(paragraph, text=""):
    """在paragraph后添加新的段落"""
    new_p = OxmlElement("w:p")
    paragraph._p.addnext(new_p)
    new_para = Paragraph(new_p, paragraph._parent)
    print(new_para)
    print(text)
    new_para.add_run(text)
    return new_para
def set_bookmark_values(document, bookmark_name, text_list: list):
    """
    :param document:
    :param bookmark_name:
    :param text_list: 待添加的文本列表
    :return:
    """
    bookmark_par = get_bookmark_par_element_start(document, bookmark_name)
    if bookmark_par == 1 or bookmark_par==2:
        print('未到书签或类型错误')
        return
    bookmark_par_parent = bookmark_par.getparent()
    #获得书签索引
    index = bookmark_par_parent.index(bookmark_par)
    for _i, _text in enumerate(text_list):
        base_paragraphs = document.paragraphs[index + _i]
        result_with_space = " ".join(_text)
        insert_paragraph_after(base_paragraphs, result_with_space)

http://www.kler.cn/a/148431.html

相关文章:

  • 深入解析贪心算法及其应用实例
  • SystemVerilog学习笔记(六):控制流
  • C++ 的协程
  • [运维][Nginx]Nginx学习(1/5)--Nginx基础
  • influxDB 时序数据库安装 flux语法 restful接口 nodjsAPI
  • 《情商》提升:增强自我意识,学会与情绪共处
  • PHP 针对人大金仓KingbaseES自动生成数据字典
  • 计算机基础知识60
  • 零基础学Python第三天||写一个简单的程序
  • 数据结构——链式二叉树的实现(详解)
  • Springboot实现增删改差
  • 如何把 Oracle 19C RAC+DG加入到ORACLE EM 13C监控
  • 使用 sync.Cond 来协调并发 goroutine 的访问共享资源
  • Python实现Windows服务自启动、禁用、启动、停止、删除
  • 【传智杯】儒略历、评委打分、萝卜数据库题解
  • 【漫谈】信创
  • 位运算总结
  • linux下的工具---yum
  • 为第一个原生Spring5应用程序添加上Log4J日志框架!
  • Vue2问题:如何全局使用less和sass变量?
  • TypeScript 学习笔记 第二部分 webpack 创建typescript项目
  • vue3中shallowReactive与shallowRef
  • Kotlin语言的一些技术点
  • Redis 与其他数据库的不同之处 | Navicat
  • 【业务实战】mysql数据库中<标签tag功能>一般是怎么设计的?
  • 【RLChina2023】CCF 苏州 记录