Python自动化办公:让Excel和Word自己动起来

手把手教你用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 格式的日报。

功能点:

  1. 接收结构化或非结构化的工作数据
  2. 自动整理、分类、汇总
  3. 生成格式规范的 Word 报告
  4. 支持添加表格、图表

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 操作是什么?

  • 👍 点赞收藏这篇教程
  • 💬 评论告诉我,我来帮你想自动化方案
  • ➕ 关注我,持续更新办公自动化系列

有任何具体问题,评论区见!✨

相关推荐
神经蛙199615 小时前
🌍 别再硬编码中文了!Python Web 项目国际化(i18n)完全指南
后端·python
颜酱15 小时前
14 | 验证并修正 LLM 生成的 SQL
人工智能·python
颜酱16 小时前
13 | 使用 LangChain 生成 SQL
人工智能·python·langchain
PieroPc16 小时前
Python 写的 Windows凭据添加工具 第二版 解决Win11 23H2, 25H2,26H1,共享文件和打印 一部份问题,不是全部!
开发语言·windows·python
颜酱16 小时前
12 | 组装 SQL 生成上下文
人工智能·python
The_Ticker17 小时前
大宗商品行情API接入教程
开发语言·python·websocket·程序人生·区块链
用户83562907805117 小时前
如何使用 Python 合并多个 Excel 文件
后端·python
颜酱17 小时前
11 | 合并过滤召回结果 - 确定需要的表、字段和指标
人工智能·python
circuitsosk17 小时前
AI系统的效果评测体系:从离线指标到线上业务反馈闭环
人工智能·python