手把手教你用Python操作Excel和Word,告别重复劳动
前言
"帮我整理一下这个月的销售数据,做成报表。"
"这份合同模板,把甲方信息替换一下。"
"这些数据太乱了,帮我汇总算一下。"
如果你每天都在做这些重复性的表格和文档操作,那么是时候让 Python 来帮你分担了。
今天这篇文章,教你用 Python 操作 Excel 和 Word,实现报表自动生成、数据自动汇总、文档自动处理。无论你是财务、行政、运营还是开发,这套技能都能帮你省下大把时间。
一、准备工作
1.1 安装所需库
bash
pip install openpyxl pandas python-docx
| 库名 | 用途 |
|---|---|
| openpyxl | 读写 Excel 文件(.xlsx) |
| pandas | 数据分析和处理 |
| python-docx | 读写 Word 文件(.docx) |
1.2 测试安装
python
python
import openpyxl
import pandas as pd
from docx import Document
print("✅ 所有库安装成功!")
二、Excel 自动化
2.1 读取和写入 Excel
读取 Excel:
python
ini
import pandas as pd
# 读取整个表格
df = pd.read_excel("销售数据.xlsx")
print(df.head()) # 查看前5行
# 读取指定 Sheet
df = pd.read_excel("销售数据.xlsx", sheet_name="2024年")
# 读取指定列
df = pd.read_excel("销售数据.xlsx", usecols=["日期", "销售额", "客户"])
写入 Excel:
python
bash
# 创建数据
data = {
"姓名": ["张三", "李四", "王五"],
"销售额": [10000, 15000, 8000],
"地区": ["北京", "上海", "广州"]
}
df = pd.DataFrame(data)
# 保存到 Excel
df.to_excel("员工销售表.xlsx", index=False)
print("✅ 保存成功!")
2.2 实战:自动汇总月度报表
场景: 每个月都要把多个 Excel 文件合并成一份汇总报表,手动复制粘贴太麻烦。
文件夹结构:
code
erlang
销售数据/
├── 1月.xlsx
├── 2月.xlsx
├── 3月.xlsx
└── ...
解决方案:
python
python
import pandas as pd
import os
from openpyxl import load_workbook
from openpyxl.styles import Font, PatternFill, Alignment
def generate_monthly_report(data_folder, output_file):
"""
自动汇总多个月份的数据,生成月度报表
参数:
data_folder: 存放月份数据的文件夹
output_file: 输出报表路径
"""
# 获取所有 Excel 文件
excel_files = [f for f in os.listdir(data_folder) if f.endswith('.xlsx')]
all_data = []
monthly_summary = {}
for file in sorted(excel_files):
file_path = os.path.join(data_folder, file)
# 读取数据
df = pd.read_excel(file_path)
all_data.append(df)
# 提取月份名称
month_name = file.replace('.xlsx', '')
monthly_summary[month_name] = {
"总销售额": df["销售额"].sum(),
"订单数": len(df),
"平均订单额": df["销售额"].mean(),
"最高销售额": df["销售额"].max(),
"最低销售额": df["销售额"].min()
}
print(f"已读取: {file} ({len(df)} 条记录)")
# 合并所有数据
merged_df = pd.concat(all_data, ignore_index=True)
# 创建汇总表
summary_df = pd.DataFrame(monthly_summary).T
summary_df = summary_df.round(2) # 保留2位小数
# 保存到 Excel(多个 Sheet)
with pd.ExcelWriter(output_file, engine='openpyxl') as writer:
# Sheet 1: 汇总报表
summary_df.to_excel(writer, sheet_name="月度汇总")
# Sheet 2: 明细数据
merged_df.to_excel(writer, sheet_name="明细数据", index=False)
print(f"\n✅ 报表生成完成!")
print(f"📁 保存位置: {output_file}")
print(f"\n📊 月度汇总预览:")
print(summary_df)
# 使用示例
if __name__ == "__main__":
generate_monthly_report(
data_folder=r"C:\销售数据",
output_file=r"C:\销售报表_汇总.xlsx"
)
2.3 实战:自动美化 Excel 表格
只生成数据不够,还要让它看起来专业:
python
ini
from openpyxl import load_workbook
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
def style_excel_report(file_path):
"""
给 Excel 报表添加样式
"""
wb = load_workbook(file_path)
# 定义样式
header_font = Font(name='微软雅黑', bold=True, size=12, color='FFFFFF')
header_fill = PatternFill(start_color='4472C4', end_color='4472C4', fill_type='solid')
header_alignment = Alignment(horizontal='center', vertical='center')
data_font = Font(name='微软雅黑', size=11)
data_alignment = Alignment(horizontal='left', vertical='center')
border = Border(
left=Side(style='thin'),
right=Side(style='thin'),
top=Side(style='thin'),
bottom=Side(style='thin')
)
# 遍历所有 Sheet
for sheet_name in wb.sheetnames:
ws = wb[sheet_name]
# 设置列宽
for col in ws.columns:
max_length = 0
col_letter = col[0].column_letter
for cell in col:
try:
if len(str(cell.value)) > max_length:
max_length = len(str(cell.value))
except:
pass
adjusted_width = min(max_length + 2, 30)
ws.column_dimensions[col_letter].width = adjusted_width
# 设置标题行样式
for cell in ws[1]:
cell.font = header_font
cell.fill = header_fill
cell.alignment = header_alignment
cell.border = border
# 设置数据行样式
for row in ws.iter_rows(min_row=2):
for cell in row:
cell.font = data_font
cell.alignment = data_alignment
cell.border = border
wb.save(file_path)
print("✅ 表格美化完成!")
# 使用示例
style_excel_report(r"C:\销售报表_汇总.xlsx")
效果:
- 标题行:蓝色背景 + 白色加粗字体 + 居中对齐
- 数据行:黑色字体 + 边框 + 自动调整列宽
2.4 实战:自动生成 Excel 图表
python
python
from openpyxl import Workbook
from openpyxl.chart import BarChart, LineChart, Reference
def add_chart_to_excel(file_path):
"""
给 Excel 添加图表
"""
wb = load_workbook(file_path)
ws = wb["月度汇总"]
# 创建柱状图
chart = BarChart()
chart.type = "col"
chart.title = "各月销售额对比"
chart.y_axis.title = "销售额(元)"
chart.x_axis.title = "月份"
# 数据范围(去掉标题行)
data = Reference(ws, min_col=2, min_row=1, max_row=ws.max_row)
cats = Reference(ws, min_col=1, min_row=2, max_row=ws.max_row)
chart.add_data(data, titles_from_data=True)
chart.set_categories(cats)
chart.shape = 4 # 4种颜色循环
# 将图表放到Sheet里
ws.add_chart(chart, "F2")
wb.save(file_path)
print("✅ 图表添加完成!")
# 使用示例
add_chart_to_excel(r"C:\销售报表_汇总.xlsx")
三、Word 自动化
3.1 读取和写入 Word
读取 Word 文档:
python
python
from docx import Document
doc = Document("合同模板.docx")
# 读取所有段落
for para in doc.paragraphs:
print(para.text)
# 读取所有表格
for table in doc.tables:
for row in table.rows:
for cell in row.cells:
print(cell.text, end="\t")
print()
创建 Word 文档:
python
python
from docx import Document
doc = Document()
# 添加标题
doc.add_heading("这是标题", level=1)
# 添加段落
doc.add_paragraph("这是一段正文内容。")
doc.add_paragraph("这是第二段,可以加", "重点内容", "。")
# 添加图片
doc.add_picture("截图.png", width=Inches(5))
# 保存
doc.save("新文档.docx")
3.2 实战:自动生成合同
场景: 律师或销售需要批量生成合同,每份只是客户名称、金额、日期不同。
模板文件格式:
code
css
合同编号:[编号]
甲方:[甲方名称]
乙方:[乙方名称]
签订日期:[日期]
合同金额:[金额]
兹甲乙双方就......达成如下协议:
1. 甲方应向乙方支付人民币 [金额] 元整。
2. 付款方式:[付款方式]
3. ...
自动替换生成:
python
python
from docx import Document
from docx.shared import Pt, Inches
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
import datetime
def generate_contract(template_path, output_path, replacements):
"""
根据模板自动生成合同
参数:
template_path: 模板文件路径
output_path: 输出文件路径
replacements: 替换内容字典,如 {"甲方名称": "张三", "金额": "100000"}
"""
# 打开模板
doc = Document(template_path)
# 替换文本
for para in doc.paragraphs:
for key, value in replacements.items():
if key in para.text:
# 找到占位符,替换内容
inline = para.runs
for run in inline:
if key in run.text:
run.text = run.text.replace(key, str(value))
# 替换表格中的内容
for table in doc.tables:
for row in table.rows:
for cell in row.cells:
for key, value in replacements.items():
if key in cell.text:
cell.text = cell.text.replace(key, str(value))
# 保存
doc.save(output_path)
print(f"✅ 合同生成成功: {output_path}")
# 使用示例
if __name__ == "__main__":
# 单个生成
replacements = {
"[编号]": "HT-2024-001",
"[甲方名称]": "北京某某科技有限公司",
"[乙方名称]": "上海某某贸易公司",
"[日期]": "2024年1月15日",
"[金额]": "¥ 50,000.00",
"[付款方式]": "银行转账"
}
generate_contract(
template_path=r"C:\合同模板.docx",
output_path=r"C:\生成的合同_北京某某公司.docx",
replacements=replacements
)
3.3 实战:批量生成多份合同
python
python
def batch_generate_contracts(template_path, output_folder, contract_list):
"""
批量生成合同
参数:
template_path: 模板文件路径
output_folder: 输出文件夹
contract_list: 合同列表,每项为替换内容字典
"""
import os
os.makedirs(output_folder, exist_ok=True)
for i, contract in enumerate(contract_list):
# 生成文件名
company_name = contract.get("[甲方名称]", f"合同{i+1}")
filename = f"合同_{company_name}.docx"
output_path = os.path.join(output_folder, filename)
# 生成合同
generate_contract(template_path, output_path, contract)
print(f"\n✅ 批量生成完成!共 {len(contract_list)} 份合同")
# 使用示例
if __name__ == "__main__":
contract_list = [
{
"[编号]": "HT-2024-001",
"[甲方名称]": "北京某某科技有限公司",
"[乙方名称]": "上海某某贸易公司",
"[日期]": "2024年1月15日",
"[金额]": "¥ 50,000.00",
"[付款方式]": "银行转账"
},
{
"[编号]": "HT-2024-002",
"[甲方名称]": "广州某某电子有限公司",
"[乙方名称]": "深圳某某软件公司",
"[日期]": "2024年1月20日",
"[金额]": "¥ 80,000.00",
"[付款方式]": "分期付款"
},
{
"[编号]": "HT-2024-003",
"[甲方名称]": "成都某某文化传媒",
"[乙方名称]": "杭州某某科技公司",
"[日期]": "2024年2月1日",
"[金额]": "¥ 120,000.00",
"[付款方式]": "一次性付清"
}
]
batch_generate_contracts(
template_path=r"C:\合同模板.docx",
output_folder=r"C:\生成的合同",
contract_list=contract_list
)
四、实战项目:日报自动生成器
4.1 需求分析
做一个完整的工具,输入今日的工作内容,自动生成一份 Word 格式的日报。
功能点:
- 接收结构化或非结构化的工作数据
- 自动整理、分类、汇总
- 生成格式规范的 Word 报告
- 支持添加表格、图表
4.2 完整代码
python
python
from docx import Document
from docx.shared import Pt, RGBColor, Inches
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.oxml.ns import qn
from datetime import datetime
import pandas as pd
class DailyReportGenerator:
"""日报生成器"""
def __init__(self):
self.doc = Document()
self.today = datetime.now().strftime("%Y年%m月%d日")
def add_header(self, title="工作日报"):
"""添加页眉"""
self.doc.add_heading(title, level=0)
# 添加日期和基本信息
info = self.doc.add_paragraph()
info.add_run(f"日期:{self.today}").bold = True
info.add_run("\t")
info.add_run(f"部门:技术部")
info.add_run("\t")
info.add_run(f"姓名:填写你的名字")
self.doc.add_paragraph() # 空行
def add_section(self, title, content):
"""添加章节"""
self.doc.add_heading(title, level=1)
self.doc.add_paragraph(content)
def add_task_table(self, tasks):
"""
添加任务表格
参数:
tasks: 任务列表,格式为 [{"任务": "...", "状态": "...", "耗时": "..."}]
"""
# 添加标题
self.doc.add_heading("📋 今日任务", level=1)
# 创建表格
table = self.doc.add_table(rows=1, cols=4)
table.style = 'Table Grid'
# 表头
header_cells = table.rows[0].cells
headers = ['序号', '任务内容', '完成状态', '耗时']
for i, header in enumerate(headers):
header_cells[i].text = header
header_cells[i].paragraphs[0].runs[0].bold = True
# 填充数据
for i, task in enumerate(tasks, 1):
row_cells = table.add_row().cells
row_cells[0].text = str(i)
row_cells[1].text = task.get('任务', '')
row_cells[2].text = task.get('状态', '')
row_cells[3].text = task.get('耗时', '')
self.doc.add_paragraph() # 空行
def add_statistics(self, stats):
"""
添加数据统计
参数:
stats: 统计数据字典
"""
self.doc.add_heading("📊 今日数据统计", level=1)
for key, value in stats.items():
p = self.doc.add_paragraph()
p.add_run(f"• {key}:").bold = True
p.add_run(str(value))
def add_tomorrow_plan(self, plans):
"""添加明日计划"""
self.doc.add_heading("📅 明日计划", level=1)
for i, plan in enumerate(plans, 1):
self.doc.add_paragraph(f"{i}. {plan}")
def add_notes(self, notes):
"""添加备注"""
self.doc.add_heading("📝 备注", level=1)
self.doc.add_paragraph(notes)
def save(self, output_path):
"""保存文档"""
self.doc.save(output_path)
print(f"✅ 日报生成成功!")
print(f"📁 保存位置: {output_path}")
# 使用示例
if __name__ == "__main__":
# 创建日报生成器
generator = DailyReportGenerator()
# 设置基本信息
generator.add_header("技术部工作日报")
# 添加今日工作总结
generator.add_section(
"今日工作总结",
"""1. 完成了用户管理模块的接口开发
2. 修复了登录模块的 Bug(验证码超时问题)
3. 参加了项目评审会议,讨论了下个版本的需求
4. 完成了 2 个代码 Review"""
)
# 添加任务表格
tasks = [
{"任务": "用户管理模块接口开发", "状态": "✅ 已完成", "耗时": "4小时"},
{"任务": "登录 Bug 修复", "状态": "✅ 已完成", "耗时": "2小时"},
{"任务": "项目评审会议", "状态": "✅ 已完成", "耗时": "1小时"},
{"任务": "代码 Review", "状态": "✅ 已完成", "耗时": "1小时"}
]
generator.add_task_table(tasks)
# 添加数据统计
stats = {
"完成功能点": "8 个",
"修复 Bug": "3 个",
"代码提交": "5 次",
"会议参与": "1 次"
}
generator.add_statistics(stats)
# 添加明日计划
plans = [
"开始订单模块的开发",
"对接第三方支付接口",
"编写接口文档"
]
generator.add_tomorrow_plan(plans)
# 添加备注
generator.add_notes("下周需要重点关注性能优化问题")
# 保存
filename = f"日报_{datetime.now().strftime('%Y%m%d')}.docx"
generator.save(filename)
4.3 进阶:自动从 Excel 读取数据生成日报
python
python
def generate_report_from_excel(excel_path, output_path):
"""
从 Excel 读取数据,自动生成日报
"""
# 读取 Excel
df = pd.read_excel(excel_path)
# 创建日报
generator = DailyReportGenerator()
generator.add_header()
# 生成任务表格
tasks = df.to_dict('records')
generator.add_task_table(tasks)
# 保存
generator.save(output_path)
# 使用示例
# Excel 格式:列名为【任务、状态、耗时】
generate_report_from_excel(
excel_path=r"C:\今日工作.xlsx",
output_path=r"C:\今日日报.docx"
)
五、更进一步:自动发送邮件
生成完报表后,还可以自动发给领导:
python
python
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
def send_report_with_attachment(email_config, subject, content, attachment_path):
"""
发送带附件的报告邮件
参数:
email_config: 邮件配置(发件人、密码、收件人等)
subject: 邮件主题
content: 邮件正文
attachment_path: 附件路径
"""
msg = MIMEMultipart()
msg['From'] = email_config['sender']
msg['To'] = email_config['receiver']
msg['Subject'] = subject
# 添加正文
msg.attach(MIMEText(content, 'plain', 'utf-8'))
# 添加附件
with open(attachment_path, 'rb') as f:
part = MIMEBase('application', 'octet-stream')
part.set_payload(f.read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', f'attachment; filename="{attachment_path}"')
msg.attach(part)
# 发送
with smtplib.SMTP_SSL('smtp.qq.com', 465) as server:
server.login(email_config['sender'], email_config['password'])
server.send_message(msg)
print("✅ 邮件发送成功!")
# 使用示例
email_config = {
'sender': 'your_email@qq.com',
'password': 'your_authorization_code',
'receiver': 'boss@company.com'
}
send_report_with_attachment(
email_config=email_config,
subject=f"【日报】技术部 - {datetime.now().strftime('%Y年%m月%d日')}",
content="领导您好,请查收今日工作日报,详见附件。",
attachment_path=r"C:\今日日报.docx"
)
六、总结
今天我们学了:
| 技能 | 场景 |
|---|---|
| 读取/写入 Excel | 数据导入导出 |
| 合并多表数据 | 月度/年度汇总报表 |
| 美化表格 | 让报表更专业 |
| 添加图表 | 数据可视化 |
| 读取/写入 Word | 文档处理 |
| 批量替换模板 | 合同/证书生成 |
| 日报自动生成器 | 完整项目实战 |
| 邮件自动发送 | 报告自动推送 |
一句话总结:
所有重复性的表格操作和文档处理,都可以用 Python 自动化。
💡 互动时间
你工作中最头疼的 Excel/Word 操作是什么?
- 👍 点赞收藏这篇教程
- 💬 评论告诉我,我来帮你想自动化方案
- ➕ 关注我,持续更新办公自动化系列
有任何具体问题,评论区见!✨