以编程方式创建(编辑)Word、Excel文档是实现任务自动化、生成报告或制作专业文档的一种强大方法。在Python中自动化操作Word文档,最常用的模块是python-docx。python-docx是一个Python库,用于创建、修改Word (.docx)文件。
以计算分层土的自重应力并绘图为例,Python代码如下
from docx import Document
from docx.oxml.ns import qn # 实际构建Font对象时需要使用qn来指定字体属性
from docx.oxml import OxmlElement
from docx.shared import Pt # 用于设置字体大小
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.shared import RGBColor # 设置字体颜色,需导入rgb颜色模块
import matplotlib.pyplot as plt
import numpy as np
defcompute(gamma, dh):
sigma = gamma * dh
plot_h = dh.cumsum()
plot_sigma = sigma.cumsum()
plt.rcParams['font.sans-serif'] = ['MiSans'] # 这个字体能够支持中英文字符
plt.rcParams['axes.unicode_minus'] = False # 正常显示负号
fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(5,3.6),
facecolor='#f1f1f1', sharex=True)
plt.plot(plot_sigma, plot_h, color='g', linewidth=2)
plt.grid(True)
plt.title('土的自重应力', fontsize=15) # 设置标题和字体大小
ax.set_xlabel("σ_z(kPa)", fontsize = 12)
ax.set_ylabel("h(m)", fontsize = 12)
# 设置x轴和y轴的范围
ax.set_xlim(0, 135) # x轴范围
ax.set_ylim(0, 9) # y轴范围
plt.gca().invert_yaxis()
ax.xaxis.set_ticks_position('top')
ax.xaxis.set_label_position('top')
ax.fill_between(plot_sigma, plot_h, sum(plot_h),
color=plt.cm.magma(0.85),alpha=0.66)
for idx,item inenumerate(plot_sigma):
if idx > 0:
ax.annotate(f'{plot_sigma[idx]:<3.1f}kPa',
xy=(item,plot_h[idx]),
xytext=(item,plot_h[idx]-0.1) )
fig.savefig("土中自重应力.png", dpi=300)
"""
python-docx直接设置字体名称可能不总是有效,特别是在处理中文字体时。
一种常见的做法是通过修改段落中每个run的字体属性来实现。以下是一个示例函数,
它演示了如何为文档中的某个段落设置宋体字体、字体大小、加粗等样式:
"""
defset_font(obj, font_name, font_size, bold, italic, color,loc):
r = obj.add_run() ifnot obj.runs else obj.runs[0] # 获取或创建run
r.font.name = font_name
r._element.rPr.rFonts.set(qn('w:eastAsia'), font_name) # 为中文字符设置特定的字体(关键步骤)
r.font.size = Pt(font_size)
r.bold = bold # 设置加粗
r.italic = italic # 设置斜体
r.font.color.rgb = color # 设置字体颜色(颜色代码为RGB)WD_PARAGRAPH_ALIGNMENT.CENTER
obj.alignment = loc
defmain():
gamma = np.array( [0, 18.6, 10.6, 19.3] )
dh = np.array( [0, 1.56, 3.7, 2.8] )
# gamma和dh分别为土层的重度(kN/m3)和厚度(m)的数值。
compute(gamma, dh)
doc1 = Document() # 创建计算书文档
h0 = doc1.add_heading('土应力计算书',0) # 文档标题
set_font(h0,'宋体', 22,True, False, RGBColor(0,0,0), WD_PARAGRAPH_ALIGNMENT.CENTER)
# 创建段落对象p1
p1 = doc1.add_paragraph(r'本计算程序可以计算分层土的自重应力并绘图,'
r'函数清单中函数compute为采用线性代数点积法得到自重应力数值,'
r'并且通过数组累积求和得到自重应力数值,'
r'compute函数参数为输入土层的重度和厚度的数值。'
r'main函数生成计算书文档。'
)
p1.add_run('') # 修改p1(增加内容)
# 使用上述函数设置中文字体
set_font(p1,'宋体', 12,True, False, RGBColor(0,0,0), WD_PARAGRAPH_ALIGNMENT.LEFT)
# 创建段落对象p2
p2 = doc1.add_paragraph()
r = p2.add_run()
r.add_picture('D:/czuo/土中自重应力.png') # 插入图片
p2.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER # 图片位置居中
doc1.save('D:/czuo/文档5.docx') # 保存文档
if __name__ == "__main__":
main()
生成的Word文档效果