news 2026/5/14 2:20:35

六、处理Word文件的实用操作

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
六、处理Word文件的实用操作

添加分页

from docx import Document doc = Document(r"C:\Users\1.docx") # 需要处理文件的位置 doc.add_page_break() #添加分页符 doc.save(r"C:\Users\2.docx") # 添加分页符后文件保存位置

插入图片

doc.add_picture(r"C:\Users\f8.jpg",width=Cm(5),height=Cm(6)) # 设置宽度、高度

添加页眉页脚,页眉添加文字或logo

from docx import Document from docx.shared import Cm, Pt from docx.enum.text import WD_ALIGN_PARAGRAPH, WD_LINE_SPACING from docx.oxml.shared import OxmlElement, qn def fix_header_img_position(doc_path, save_path, header_text, logo_path=None): # def fix_header_img_position(doc_path, save_path, header_text, right_text=None): # 页眉右侧不插入logo,改为文本 """ 调整制表位位置:让图片停在页眉右侧合理区域 """ doc = Document(doc_path) for section in doc.sections: # ========== 1. 页眉置顶的核心边距 ========== section.top_margin = Cm(3.0) section.header_distance = Cm(1.0) # ========== 2. 清空页眉 + 无格式段落 ========== header = section.header header.paragraphs.clear() header_para = header.add_paragraph() header_para.paragraph_format.left_indent = Cm(0) header_para.paragraph_format.right_indent = Cm(1.0) # 页眉整体右缩进1cm,避免图片超页 header_para.paragraph_format.first_line_indent = Cm(0) header_para.paragraph_format.space_before = Pt(0) header_para.paragraph_format.space_after = Pt(0) header_para.paragraph_format.line_spacing_rule = WD_LINE_SPACING.SINGLE # ========== 3. 页眉文字 ========== text_run = header_para.add_run(header_text) text_run.font.name = "宋体" text_run.font.size = Pt(10) text_run.font.position = 0 # ========== 4. 添加logo/文字 ========== if logo_path: #if right_text: #判断是否传右侧文字 # 制表位(适配A4纸) # 偏右,可减小(如14cm);偏左则增大(如17cm) tab_position = Cm(14.7) # Word默认页边距调整值为14.7,显示最合适 header_para.paragraph_format.tab_stops.add_tab_stop(tab_position, WD_ALIGN_PARAGRAPH.RIGHT) header_para.add_run().add_tab() img_run = header_para.add_run() img_run.add_picture(logo_path, width=Cm(2), height=Cm(1)) # 添加右侧文字(替换原图片代码) # right_run = header_para.add_run(right_text) # right_run.font.name = "宋体" # right_run.font.size = Pt(10) # 和左侧文字字号一致 # right_run.font.position = 0 # 垂直置顶 # 图片垂直置顶 r_element = img_run._element rPr_element = r_element.find(qn('w:rPr')) if rPr_element is None: rPr_element = OxmlElement('w:rPr') r_element.append(rPr_element) v_align = OxmlElement('w:vAlign') v_align.set(qn('w:val'), 'top') rPr_element.append(v_align) # ========== 5. 页脚设置 ========== footer = section.footer footer.paragraphs.clear() footer_para = footer.add_paragraph() footer_para.alignment = WD_ALIGN_PARAGRAPH.CENTER footer_para.add_run("第") page_num = OxmlElement('w:fldSimple') page_num.set(qn('w:instr'), 'PAGE') footer_para._p.append(page_num) footer_para.add_run("页 共") total_pages = OxmlElement('w:fldSimple') total_pages.set(qn('w:instr'), 'NUMPAGES') footer_para._p.append(total_pages) footer_para.add_run("页") for run in footer_para.runs: run.font.name = "宋体" run.font.size = Pt(9) doc.save(save_path) print(f"图片位置!保存路径:{save_path}") print(f"若存在偏右/左,调整代码中tab_position的值(14-17cm之间)") # ===================== 调用代码 ===================== if __name__ == "__main__": DOC_PATH = r"C:\Users\测试1.docx" SAVE_PATH = r"C:\Users\测试_图片位置修复.docx" HEADER_TEXT = "XX公司内部文档 | 保密" LOGO_PATH = r"C:\Users\f8.jpg" # 无logo设为None # 传右侧要显示的文字(替换原LOGO_PATH) # RIGHT_TEXT = "2026年第1期" fix_header_img_position(DOC_PATH, SAVE_PATH, HEADER_TEXT, LOGO_PATH)

添加表格

from docx import Document # 1. 打开文档+定义数据源 doc = Document(r"C:\Users\测试.docx") # 写入内容在列表中 list1 = [ ["","",""], ["","",""], ["","",""], ["","",""], ["","",""], ] list2 = [ ["","",""], ["","",""], ["","",""], ["","",""], ["","",""] ] # 2. 封装成通用函数(更简洁,一次封装终身复用) def fill_table(doc, data): """ 用enumerate优化的表格填充函数 :param doc: 文档对象 :param data: 二维列表数据源 :return: 创建的表格对象 """ # 动态获取行数/列数(去掉硬编码,适配任意大小的data) rows_num = len(data) cols_num = len(data[0]) if rows_num > 0 else 0 # 避免空列表报错 # 创建表格 table = doc.add_table(rows=rows_num, cols=cols_num) # 核心优化:用enumerate遍历行(同时拿行索引+行数据) for row_idx, row_data in enumerate(data): # 获取当前行的所有单元格 cells = table.rows[row_idx].cells # 内层优化:用enumerate遍历列(同时拿列索引+列数据) for col_idx, cell_data in enumerate(row_data): cells[col_idx].text = str(cell_data) # 直接用cell_data,不用list1[row][col] return table # 3. 调用函数填充表格 fill_table(doc, list1) doc.add_paragraph("----------------------------------") fill_table(doc, list2) # 4. 保存文档 doc.save(r"C:\Users\测试_添加表格.docx") print("代码运行完成!")

提取表格内容写入Excel

from docx import Document from openpyxl import Workbook # 1. 打开Word文档,获取第一个表格 doc = Document(r"C:\Users\测试.docx") t0 = doc.tables[0] # Word里的第一个表格 # 2. 创建Excel工作簿和工作表 workbook = Workbook() sheet = workbook.active # 3. 正确遍历Word表格,写入Excel for i in range(len(t0.rows)): # 遍历Word表格的每一行 list1 = [] # 初始化:存储当前行的所有单元格内容 # 用len(t0.rows[i].cells)获取当前行的列数 for j in range(len(t0.rows[i].cells)): # 获取当前单元格的文本(去掉多余空格/换行,优化数据) cell_text = t0.cell(i, j).text.strip() list1.append(cell_text) # 把当前列的内容加入行列表 # 内层列循环结束后,一次性append整行数据到Excel sheet.append(list1) # 4. 保存Excel文件 workbook.save(filename=r"C:\Users\测试_提取出表格.xlsx") print("Word表格已成功导出到Excel!")
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/7 2:16:59

四大 AI 模型结果对比实测:揭秘未来前后端开发的三大黄金趋势

当 AI 技术浪潮席卷各行各业,前端的交互体验革新与后端的架构效能升级,正迎来前所未有的变革拐点。作为技术决策与开发实践的核心风向标,前后端领域的未来趋势从不缺讨论,但这一次,我们将依托四大 AI 模型的深度数据分…

作者头像 李华
网站建设 2026/5/11 17:49:02

【毕业设计】SpringBoot+Vue+MySQL web酒店客房管理系统平台源码+数据库+论文+部署文档

摘要 随着旅游业的快速发展和酒店行业的日益繁荣,酒店客房管理的效率和智能化水平成为行业竞争的关键因素。传统的酒店管理模式依赖人工操作,存在信息滞后、管理成本高、客户体验差等问题。为了提升酒店运营效率、优化客户服务体验,设计并实现…

作者头像 李华
网站建设 2026/5/8 13:37:17

期货反向跟单-无人化探索

谈到期货反向跟单,市场共识始终聚焦于 “人性” 二字。期货市场的盈亏博弈,本质是人性弱点的放大,多数交易者的亏损源于四大陷阱:贪婪让盈利持仓迟迟不离场,最终利润回吐甚至转亏;侥幸心理主导下&#xff0…

作者头像 李华
网站建设 2026/5/12 12:02:17

使用rosbag::Bag bag(“20130110.bag“)出现段错误

使用 rosbag::Bag 出现段错误问题:分析:解决:问题: Starting program: /bin/test_rosbag_io [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1&…

作者头像 李华
网站建设 2026/5/5 20:03:03

模拟信号到FFT频谱图分析过程

这是一个从连续到离散,再到频域分析的完整链条,涉及多个关键变换。 一、起点:连续时间模拟信号 我们有一个真实的物理信号: xa(t)(连续、模拟) x_a(t) \quad \text{(连续、模拟)} xa​(t)(连续、模拟) 其连续时间傅里叶变换(CTFT)为: Xa(jΩ)=∫−∞∞xa(t)e−jΩtdt X…

作者头像 李华
网站建设 2026/5/5 9:47:58

mysql in相关的知识

MySQL 会先对in子查询结果去重, 会启用using <auto_distinct_key>&#xff0c;生成临时的去重键&#xff0c;把 [1,1,2] 变成 [1,2]

作者头像 李华