本文面向python零基础学员,详细讲解如何使用python-docx库,遍历DataFrame数据并生成格式化的Word文档,为《财务大数据分析(基于python)》p283输出word部分的学习辅导读物。适用场景如将采集到投资者互动关系问答输出到WORD文档。
学习目标:
理解DataFrame的遍历方法
掌握python-docx库的基本操作
学会设置字体样式(大小、颜色)
理解循环结构在数据处理中的应用
第一部分:环境准备与库导入
【知识点1】库的安装与导入
python-docx 是一个用于创建和修改Word文档(.docx)的Python库。
安装命令(在命令行/终端中执行):pip install python-docx
或者使用国内镜像源加速安装:
pip install python-docx -i https://pypi.tuna.tsinghua.edu.cn/simple
安装完毕之后,再导入库,所以,多数的python代码第一部分均是导入库,相当于导入我们将使用的工具。如下:
from docx import Document # 导入Document类,用于创建Word文档from docx.shared import Pt, RGBColor # 导入字体大小和颜色设置工具import pandas as pd # 导入pandas,用于数据处理
第二部分:理解核心数据结构——DataFrame
【知识点2】什么是DataFrame?
DataFrame是pandas库中最核心的数据结构,可以理解为一个二维表格,类似于Excel中的工作表或数据库中的数据表。DataFrame的结构如下:
行(index):每一条记录的编号
列(columns):每个字段的名称
值(values):具体的数据内容
实际项目中,DataFrame数据通常来自数据库查询结果、API接口返回的JSON数据、Excel/CSV文件读取。我们也可以使用pd.DataFrame()将字典转换为DataFrame。如:
stock_irm_cninfo_df = pd.DataFrame(data)
第三部分:创建Word文档基础
【知识点3】Document对象——Word文档的载体
Document类是python-docx库的核心,代表一个Word文档。创建Document对象即创建一个新的空白Word文档。常用方法如下:
doc.add_paragraph() #添加一个新段落doc.add_heading() #添加标题doc.add_table() #添加表格doc.save() #保存文档到文件
以下代码可以牢记,至少应该是能看懂。
# 创建一个新的Word文档对象doc = Document()# 添加文档标题title = doc.add_heading('投资者关系问答记录', level=0)# 添加说明段落intro = doc.add_paragraph()intro.add_run('本文档由Python自动生成,记录了公司与投资者的互动问答内容。')# 添加空行分隔doc.add_paragraph()
第四部分:核心代码详解——遍历DataFrame并写入文档
【知识点4】DataFrame的遍历方法——iterrows()
iterrows()是DataFrame的行迭代器,每次循环返回两个值:
index: 当前行的索引号(从0开始)
row: 当前行的数据(Series类型,可通过列名访问值)
语法格式:
for index, row in dataframe.iterrows():# index: 行号# row['列名'], 获取该列的值
【知识点5】python-docx的段落和文本样式设置
1. 添加段落:
p = doc.add_paragraph() # 创建空段落
2. 添加文本(Run对象):
run = p.add_run('文本内容') # 在段落中添加文本
3. 设置字体大小:
run.font.size = Pt(12) # 设置字号为12磅(小四号)
常用字号对照:
- Pt(10.5) = 五号字
- Pt(12) = 小四号字
- Pt(14) = 四号字
- Pt(16) = 小三号字
- Pt(18) = 三号字
4. 设置字体颜色:
run.font.color.rgb = RGBColor(红, 绿, 蓝)
RGB颜色模型:
- RGBColor(0, 0, 0) = 黑色
- RGBColor(255, 0, 0) = 红色
- RGBColor(0, 0, 255) = 蓝色
- RGBColor(128, 128, 128) = 灰色
每个颜色通道取值范围:0-255
# 遍历问题和回答并添加到文档中for index, row in stock_irm_cninfo_df.iterrows():# ------------------- 打印当前处理进度(便于理解) -------------------print(f"\n正在处理第 {index + 1} 条记录...")print(f" 提问时间: {row['提问时间']}")
【代码详解】
p = doc.add_paragraph()
解释:调用Document对象的add_paragraph()方法,创建一个新的空白段落。 返回的p是一个Paragraph对象,代表这个段落。
run = p.add_run(f"时间: {row['提问时间']}")
解释:在段落p中添加文本。f"时间: {row['提问时间']}" 是Python的f-string格式化字符串;row['提问时间'] 从当前行数据中获取"提问时间"列的值,最终文本如:"时间: 2024-01-15";run是一个Run对象,代表一段具有相同样式的文本。
run.font.size = Pt(12)
解释:设置run对象(即这段文本)的字体大小为12磅。Pt是python-docx中用于表示磅值的单位类。
run.font.color.rgb = RGBColor(0, 0, 0)
解释:设置文本颜色为纯黑色。RGBColor(0, 0, 0)表示红色=0、绿色=0、蓝色=0,即黑色。
p = doc.add_paragraph()run = p.add_run(f"时间: {row['提问时间']}")run.font.size = Pt(12) # 设置字体大小为12磅run.font.color.rgb = RGBColor(0, 0, 0) # 设置字体颜色为黑色run.font.bold = True # 加粗显示(新增:增强可读性)
【拓展】使用不同颜色区分不同类型的内容
在实际应用中,我们常常用颜色来区分信息类型:
黑色:基本信息(时间、编号等)
蓝色:问题/提问内容
绿色:回答/回复内容
红色:重要提示或警告
p = doc.add_paragraph()run = p.add_run(f"提问: {row['提问内容']}")run.font.size = Pt(12)run.font.color.rgb = RGBColor(0, 0, 255) # 蓝色,表示提问
================== 添加回答内容(深绿色) ==================
p = doc.add_paragraph()run = p.add_run(f"回答: {row['回答内容']}")run.font.size = Pt(12)run.font.color.rgb = RGBColor(0, 128, 0) # 深绿色,表示回答
================== 添加回答时间(灰色) ==================
p = doc.add_paragraph()run = p.add_run(f"回复时间: {row['回答时间']}")run.font.size = Pt(10.5) # 稍小字号run.font.color.rgb = RGBColor(128, 128, 128) # 灰色,表示辅助信息run.font.italic = True # 斜体(新增)
================== 步骤5:添加分隔线 ==================
# 添加空行作为分隔doc.add_paragraph()# 添加一条水平分隔线(使用下划线段落)separator = doc.add_paragraph()separator_run = separator.add_run("─" * 50)separator_run.font.color.rgb = RGBColor(200, 200, 200)separator_run.font.size = Pt(8)# 再添加一个空行doc.add_paragraph()
第五部分:保存文档
【知识点6】保存文档
doc.save('文件名.docx')
将内存中的Document对象保存为.docx文件
如果文件已存在,会被覆盖
保存路径可以是相对路径或绝对路径
# 保存文档output_filename = '投资者关系问答记录.docx'doc.save(output_filename)print(f"\n文档已保存为: {output_filename}")print("\n提示:请使用Microsoft Word或WPS打开查看效果。")
【进阶技巧】
1. 设置中文字体:
run.font.name = '微软雅黑'
2. 设置段落间距:
p.paragraph_format.space_before = Pt(6) # 段前间距
p.paragraph_format.space_after = Pt(6) # 段后间距
3. 设置行距:
p.paragraph_format.line_spacing = 1.5 # 1.5倍行距
4. 添加表格:
table = doc.add_table(rows=3, cols=2)
table.cell(0, 0).text = '项目'
table.cell(0, 1).text = '内容'
5. 添加页眉页脚:
header = doc.sections[0].header
header.paragraphs[0].text = '机密文件'
【要点回顾】
print("\n【学习要点回顾】")print("1. DataFrame.iterrows() 用于逐行遍历表格数据")print("2. doc.add_paragraph() 创建新段落")print("3. p.add_run() 在段落中添加文本并设置样式")print("4. Pt() 设置字体大小(磅值)")print("5. RGBColor() 设置字体颜色(红绿蓝三通道)")print("6. doc.save() 保存文档到文件")