python-docx库的奇妙之旅


以下是一篇关于使用 python-docx 库(通过 from docx import Document 导入)来创建和操作 DOCX 文件的内容。


使用 Python 的 python-docx 库创建和操作 DOCX 文件

引言

在现代办公环境中,处理文档是一个常见的任务。虽然 Microsoft Word 提供了强大的文档编辑功能,但在自动化文档生成和批量处理方面,编程工具往往更加高效。Python 的 python-docx 库就是一个强大的工具,它允许你通过代码来创建、修改和保存 Word 文档(.docx 格式)。

安装 python-docx

在使用 python-docx 之前,你需要先安装它。你可以通过 pip 来完成安装:

pip install python-docx
创建一个简单的 DOCX 文件

安装完成后,我们可以开始创建一个简单的 DOCX 文件。以下是一个基本的示例:

from docx import Document

# 创建一个新的 Document 对象
doc = Document()

# 添加一个标题
doc.add_heading('这是一个标题', level=1)

# 添加一个段落
doc.add_paragraph('这是一个段落。你可以在这里添加任何文本内容。')

# 添加一个带有格式的段落
p = doc.add_paragraph('这是一个带有格式的段落。')
run = p.add_run('粗体文本')
run.bold = True
run = p.add_run(' 和 ')
run = p.add_run('斜体文本')
run.italic = True

# 保存文档
doc.save('example.docx')

上述代码会创建一个名为 example.docx 的文件,其中包含一个一级标题、一个普通段落以及一个带有粗体和斜体格式的段落。

添加图片和表格

除了文本,python-docx还支持向文档中添加 图片和表格。以下是添加图片和表格的示例:

# 添加图片
doc.add_picture('path/to/your/image.jpg', width=Inches(1.25))

# 添加表格
table = doc.add_table(rows=2, cols=2)
table.cell(0, 0).text = '单元格1,1'
table.cell(0, 1).text = '单元格1,2'
table.cell(1, 0).text = '单元格2,1'
table.cell(1, 1).text = '单元格2,2'

# 保存文档
doc.save('example_with_image_and_table.docx')

注意,在添加图片时,你需要从 docx.shared 中导入 InchesCm 来设置图片的宽度和高度(可选)。

from docx.shared import Inches
样式和格式

python-docx 还允许你自定义文档的样式和格式,包括字体、段落对齐方式、行间距等。例如:

p = doc.add_paragraph('这是一个自定义格式的段落。')
p.style.font.name = 'Arial'
p.style.font.size = Pt(14)
p.alignment = 2  # 2 表示居中对齐
p.space_after = Pt(12)  # 段落后的间距

同样,你需要从 docx.shared 中导入 Pt 来设置字体大小和间距。

from docx.shared import Pt
结论

通过 python-docx 库,Python 程序员可以轻松地创建和操作 DOCX 文件,实现文档的自动化生成和批量处理。无论是简单的文本段落,还是复杂的图片和表格,python-docx 都提供了直观易用的 API。如果你需要处理大量的文档或者需要自动化一些文档生成任务,python-docx 绝对是一个值得学习和使用的工具。


最后

附上我的一个小demo直接开箱即用的,主要实现的功能是

  • 插入表格
  • 标题字体设置宋体
  • 段落字体设置为宋体
'''
@Project :langchain_excel_doc 
@File    :pythondoc-test.py
@IDE     :PyCharm 
@Author  :xzy
@Date    :2024/12/30 9:06 
@explain: 
'''
from docx import Document
from docx.shared import RGBColor
from docx.oxml.ns import qn
# 创建一个新的Word文档
doc = Document()

# 设置字体为宋体
def set_font_to_songti(run):
    run.font.name = '宋体'
    run._r.rPr.rFonts.set(qn('w:eastAsia'), '宋体')

# 添加标题
heading = doc.add_heading('故障分析报告', 0).runs[0]
set_font_to_songti(heading)
heading.font.color.rgb = RGBColor(0, 0, 0)
# doc.add_heading('故障分析报告', 0).runs[0].font.color.rgb = RGBColor(0, 0, 0)

# 添加背景
background = doc.add_heading('1.背景', 1).runs[0]
set_font_to_songti(background)
background.font.color.rgb = RGBColor(0, 0, 0)

paragraph = doc.add_paragraph('本报告旨在分析 2023 年与 2024 年的设备故障情况,评估故障原因及其对运营的影响。通过同比和环比分析,识别趋势并提出改进建议,以提高系统的稳定性和可靠性。')
set_font_to_songti(paragraph.runs[0])
# 添加故障的详细情况
fault_info = doc.add_heading('2.故障的详细情况', 1).runs[0]
set_font_to_songti(fault_info)
fault_info.font.color.rgb = RGBColor(0, 0, 0)
# doc.add_heading('2.故障的详细情况', 1).runs[0].font.color.rgb = RGBColor(0, 0, 0)
fault_info1 = doc.add_heading('2.1 按机组分类的故障数量', 2).runs[0]
set_font_to_songti(fault_info1)
fault_info1.font.color.rgb = RGBColor(0, 0, 0)
# doc.add_heading('2.1 按机组分类的故障数量', 2).runs[0].font.color.rgb = RGBColor(0, 0, 0)

doc.add_table(rows=6, cols=2).style = 'Table Grid'
table = doc.tables[0]
table.cell(0, 0).text = '机组'
table.cell(0, 1).text = '故障数'
table.cell(1, 0).text = 'F-01 组'
table.cell(1, 1).text = '2'
table.cell(2, 0).text = 'F-02 组'
table.cell(2, 1).text = '1'
table.cell(3, 0).text = 'F-03 组'
table.cell(3, 1).text = '4'
table.cell(4, 0).text = 'F-04 组'
table.cell(4, 1).text = '2'
table.cell(5, 0).text = 'F-05 组'
table.cell(5, 1).text = '1'

fault_info2 = doc.add_heading('2.2 按月份分类的故障数量', 2).runs[0]
set_font_to_songti(fault_info2)
fault_info2.font.color.rgb = RGBColor(0, 0, 0)
# doc.add_heading('2.2 按月份分类的故障数量', 2).runs[0].font.color.rgb = RGBColor(0, 0, 0)
doc.add_table(rows=5, cols=2).style = 'Table Grid'
table = doc.tables[-1]
table.cell(0, 0).text = '月份'
table.cell(0, 1).text = '故障数'
table.cell(1, 0).text = '2023-07'
table.cell(1, 1).text = '1'
table.cell(2, 0).text = '2023-08'
table.cell(2, 1).text = '3'
table.cell(3, 0).text = '2024-07'
table.cell(3, 1).text = '4'
table.cell(4, 0).text = '2024-08'
table.cell(4, 1).text = '2'

# 添加分析
analyse = doc.add_heading('3 分析', 1).runs[0]
set_font_to_songti(analyse)
analyse.font.color.rgb = RGBColor(0, 0, 0)
# doc.add_heading('3 分析', 1).runs[0].font.color.rgb = RGBColor(0, 0, 0)

yoy = doc.add_heading('3.1 同比分析:', 2).runs[0]
set_font_to_songti(yoy)
yoy.font.color.rgb = RGBColor(0, 0, 0)
# doc.add_heading('3.1 同比分析:', 2).runs[0].font.color.rgb = RGBColor(0, 0, 0)
paragraph = doc.add_paragraph('2023 年故障次数:4 次')
set_font_to_songti(paragraph.runs[0])
paragraph = doc.add_paragraph('2024 年故障次数:6 次')
set_font_to_songti(paragraph.runs[0])
paragraph = doc.add_paragraph('比较 2024 年与 2023 年的设备故障次数,得出 2024 年相对于 2023 年的设备故障同比增长 50%。')
set_font_to_songti(paragraph.runs[0])

qoq = doc.add_heading('3.2 环比分析:', 2).runs[0]
set_font_to_songti(qoq)
qoq.font.color.rgb = RGBColor(0, 0, 0)
# doc.add_heading('3.2 环比分析:', 2).runs[0].font.color.rgb = RGBColor(0, 0, 0)
paragraph = doc.add_paragraph('2024 年 7 月故障次数:4 次')
set_font_to_songti(paragraph.runs[0])
paragraph = doc.add_paragraph('2024 年 8 月故障次数:2 次')
set_font_to_songti(paragraph.runs[0])
paragraph = doc.add_paragraph('比较 2024 年 7 月与 2024 年 8 月的设备故障次数,得出 2024 年 7 月相对于 2024 年 8 月的设备故障环比减少了 50%。')
set_font_to_songti(paragraph.runs[0])

# 添加建议
suggestion=doc.add_heading('4.建议', 1).runs[0]
set_font_to_songti(suggestion)
suggestion.font.color.rgb = RGBColor(0, 0, 0)
# doc.add_heading('4.建议', 1).runs[0].font.color.rgb = RGBColor(0, 0, 0)
paragraph = doc.add_paragraph('2024 年设备故障频发,主要原因包括信号丢失、风扇故障和过热。针对这些问题,建议采取以下改进措施:')
set_font_to_songti(paragraph.runs[0])
paragraph = doc.add_paragraph('对于信号丢失,应检查传感器连接和电源,确认传感器未损坏。')
set_font_to_songti(paragraph.runs[0])
paragraph = doc.add_paragraph('对于风扇故障,应更换故障风扇,确保通风系统正常运行。')
set_font_to_songti(paragraph.runs[0])
paragraph = doc.add_paragraph('对于过热现象,应增加散热措施,清理散热器上的灰尘,检查冷却液是否充足。')
set_font_to_songti(paragraph.runs[0])

# 保存文档
doc.save('故障分析报告.docx')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值