python-docx处理Word必备工具
我的理解
为什么会用到python-docx,因为近段时间下载了大量网文,但格式都是html的,我个人习惯使用word处理文字,于是就想法设法把html文档转换为word,首先要考虑的问题就是从html中提取的文字怎么存word里呢,之前用了pandoc直接转换,带转换后的效果太不理想,没什么格式,不符合我这种对word格式有严格要求强迫症人的需要,于是就到处搜寻其他方法,终于功夫不负有心人,通过几天研究python-docx,感觉很适合我,就一边分析html文档,一边思考怎么用python-docx存想要的格式word,因为我的word排版,一般习惯 页面要设置成5678页边距的,大小A4的,正文主标题 方正小标宋,其他标题要么黑体,要么加粗,正文要首行缩进2字符 仿宋_GB2312,页脚要加页码显示,大概这些样式。
python-docx 创建一篇文档也差不多是这么个思路,一篇文档也就是Document()对象 首先要分成不同的节,也就是由sections对象控制,然后每节中又分成不同的段落paragraphs对象,每段又由不同的块run对象组成,针对不同的节(section)可以设置页面的一些属性,针对不同的段落(paragraph),可以设置间距和缩进、换行和分页等,针对不同块(run)可以设置字体的字型、颜色、大小等。可以先设置好整篇文章的大致段落、字体等格式,然后针对不同段落和块可以单独再进行设置。
我主要讲讲自己用到的几个内容是怎么设置的。
安装库:
1 | pip install python - docx |
用到的库
1 2 3 4 5 6 | from docx import Document(文档读写) from docx.shared import Pt,Cm,Inches (字体大小,不一定全用到) from docx.oxml.ns import qn(设置字体格式,分栏等用到) from docx.shared import RGBColor (设置字体颜色) from docx.enum.text import WD_ALIGN_PARAGRAPH (设置对其方式) from docx.enum.section import WD_ORIENTATION (纸张方向用到) |
设置大致格式
这样设置完了之后有一个好处就是,后往里面写入文档的时候回自动按这个格式,如果有需要改动的再单独写入时改。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | docment = docx.Document(docx_tamplate) # 读取模板文档,这里可以不用模板文档,因为python-docx没法设置页码,所以我先建了一个有页码的空白文档作为模板文档 # 设置正文默认格式 # 字体大小三号字(16) docment.styles[ 'Normal' ].font.size = Pt( 16 ) # 字体仿宋_GB2312 docment.styles[ 'Normal' ].font.name = u '仿宋_GB2312' docment.styles[ 'Normal' ]._element.rPr.rFonts. set (qn( 'w:eastAsia' ), u '仿宋_GB2312' ) # 行间距 28磅 段前、段后不留空 docment.styles[ 'Normal' ].paragraph_format.line_spacing = Pt( 29 ) docment.styles[ 'Normal' ].paragraph_format.space_before = Pt( 0 ) docment.styles[ 'Normal' ].paragraph_format.space_after = Pt( 0 ) # 首行缩进2字符 docment.styles[ 'Normal' ].paragraph_format.first_line_indent = 406400 # 关闭孤行控制 docment.styles[ 'Normal' ].paragraph_format.widow_control = False # 设置页面大小 docment.sections[ 0 ].page_height = Cm( 29.7 ) # 设置A4纸的高度 docment.sections[ 0 ].page_width = Cm( 21 ) # 设置A4纸的宽 # 设置页边距 docment.sections[ 0 ].top_margin = Cm( 3.7 ) docment.sections[ 0 ].bottom_margin = Cm( 3.4 ) docment.sections[ 0 ].left_margin = Cm( 2.8 ) docment.sections[ 0 ].right_margin = Cm( 2.6 ) |
单独设置段格式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | doc = Document() #创建一个空白文档 p1 = doc.add_paragraph() #初始化建立一个自然段 p1.alignment = WD_ALIGN_PARAGRAPH.CENTER #对齐方式为居中,没有这句话默认左对齐。另外右对齐:RIGHT,两端对齐:JUSTIFY,分散对齐:DISTRIBUTE p1.paragraph_format.line_spacing = 1.5 #设置该段落,行间距为1.5倍,也可以像上面设默认值那样用Pt单位来设置 p1.paragraph_format.first_line_indent = Inches( 0.5 ) #段落缩进0.5英寸,我还是习惯设置2字符 值为:406400 p1.paragraph_format.left_line_indent = Inches( 0.5 ) #设置左缩进0.5英寸。一般用不到 p1.paragraph_format.right_line_indent = Inches( 0.5 ) #设置右缩进0.5英寸,一般用不到 p1.paragraph_format.keep_together = False # 段前分页 p1.paragraph_format.keep_with_next = False # 与下段同页 p1.paragraph_format.page_break_before = True # 段中不分页 p1.paragraph_format.widow_control = False # 孤行控制 p1.space_after = Pt( 5 ) #设置段后距离为5磅 p1.space_before = Pt( 5 ) #设置段前距离为5磅 run1 = p1.add_run( '你好' ) #写入段落的中的文本“你好” run1.font.size = Pt( 12 ) #单独设置字体大小为24 run1.font.bold = True #样式设置加粗 run1.italic = True #字形设置斜体 run1.font.underline = True # 下划线 run1.font.color.rgb = RGBColor( 255 , 0 , 0 ) # 颜色 |
插入图片
1 2 | #添加图片,设置图片大小 doc.add_picture(r "图片路径" , width = Cm( 10 )) |
插入表格
1 2 3 4 5 6 7 8 | tab = doc.add_table(rows = 5 , cols = 8 , style = 'Table Grid' ) # 创建一个5行8列的表格,样式为Table Grid tab.cell( 0 , 0 ).text = '表角' # 0行0列的内容为表角 cell = tab.cell( 0 , 1 ).merge(tab.cell( 0 , 3 )) # 合并0行1列到0行3列 p = cell.paragraphs[ 0 ] run = p.add_run(‘合并’) #在单元格内容创建一个段落,并写入‘合并’文本 run.font.size = Pt( 10.5 ) # 字体大小设置,和word里面的字号相对应5号字 run.bold = True p.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER # 设置为加粗 居中显示 |
顺带说下,如果文档是doc格式的需要转换成docx,可以用pywin32 模块转换
模块安装
1 | pip install pypiwin32 |
下面是写好的一个简单转换函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | from win32com import client import pythoncom def doc_docx(old_path): """单个.doc文件转换为.docx文件""" # 我们首先调用win32com模块并打开word应用软件,执行程序: pythoncom.CoInitialize() # 初始化线程 word = client.Dispatch( "Word.Application" ) # vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv doc = word.Documents. Open (old_path) new_path = old_path.split( '.' , 1 )[ 0 ] + '.docx' doc.SaveAs(new_path, 16 ) # 数字16表示将.doc文件另存为.docx格式文件 doc.Save() # 一定注意 另存后这里要再保存下 防止报错 # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ # 释放资源 doc.Close() word.Quit() pythoncom.CoUnInitialize() # 初始化线程 return new_path |
如果一次转换的比较多,因为多进程基本都会报错 , 那么可以构造类或函数进行操作 ,主要是我框起来的那4行代码,前面初始化操作先执行,然后循环中间段代码,最后等全部转换完成后再释放资源
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具