7人参与 • 2025-12-12 • Python
在工程师的日常工作中,80%的办公时间都耗费在重复的excel数据整理、word文档生成、pdf格式转换和邮件批量发送上。python凭借其丰富的第三方库生态,成为自动化办公的首选工具——它就像一把“瑞士军刀”,能精准解决各类重复办公场景的痛点。本文适用读者:python开发者、需要落地办公自动化的工程师、希望通过技术减少重复工作的职场人。
在动手写代码前,先搞懂python自动化办公的核心逻辑:本质是通过第三方库封装的接口,替代人工对办公文件的“读取-处理-写入”操作,其底层依赖于办公文件的格式规范(如excel的ooxml、pdf的pdf格式标准)和网络协议(如邮件的smtp/pop3)。这是避免后续踩坑的关键——只有理解了底层逻辑,才能在遇到问题时精准定位原因。
不同场景的核心依赖库各有侧重,以下是经过实测的稳定版本组合(适配python 3.7-3.11,数据来源:各库官方文档+自建测试环境验证):
# 批量安装核心依赖库(指定稳定版本,避免版本兼容问题)
# pip install openpyxl==3.1.2 pandas==2.0.3 python-docx==0.8.16 pypdf2==2.12.1 pdfplumber==0.9.0
# 环境验证代码
import openpyxl
import pandas as pd
import docx
import pypdf2
import pdfplumber
import smtplib
print("环境验证通过:")
print(f"openpyxl版本:{openpyxl.__version__}")
print(f"pandas版本:{pd.__version__}")
print(f"python-docx版本:{docx.__version__}")
print(f"pypdf2版本:{pypdf2.__version__}")
print(f"pdfplumber版本:{pdfplumber.__version__}")
print(f"smtplib版本:{smtplib.__version__}") # python内置,版本与python一致
每个场景均遵循“底层原理→核心实现→场景适配”的逻辑拆解,拒绝表面化讲解,聚焦工程师实际会遇到的问题。
excel自动化是办公场景中最高频的需求,核心痛点是“重复的单元格编辑”和“大规模数据整理”。不同需求对应不同的库选型,关键是搞懂“什么时候用openpyxl,什么时候用pandas”。
可以把excel文件比作“一个装满数据的文件夹”:
场景1:批量生成带格式的excel报表(用openpyxl)
from openpyxl import workbook
from openpyxl.styles import font, patternfill, alignment
from openpyxl.utils.dataframe import dataframe_to_rows
def batch_generate_excel_reports(data_list, save_dir):
"""
批量生成带格式的excel报表
:param data_list: 数据列表,每个元素是字典(含报表数据)
:param save_dir: 保存目录
"""
for idx, data in enumerate(data_list):
# 1. 创建工作簿
wb = workbook()
ws = wb.active
ws.title = "月度报表"
# 2. 写入标题并设置样式
ws["a1"] = f"{data['部门']}2024年{data['月份']}度报表"
ws["a1"].font = font(name="微软雅黑", size=16, bold=true)
ws["a1"].fill = patternfill(start_color="e6f3ff", end_color="e6f3ff", fill_type="solid")
ws["a1"].alignment = alignment(horizontal="center")
ws.merge_cells("a1:d1") # 合并单元格
# 3. 写入表头
headers = ["序号", "项目", "金额(元)", "备注"]
for col, header in enumerate(headers, 1):
cell = ws.cell(row=3, column=col, value=header)
cell.font = font(name="微软雅黑", size=12, bold=true)
cell.fill = patternfill(start_color="d9e2f3", end_color="d9e2f3", fill_type="solid")
# 4. 写入数据
for row, item in enumerate(data["details"], 4):
ws.cell(row=row, column=1, value=item["序号"])
ws.cell(row=row, column=2, value=item["项目"])
ws.cell(row=row, column=3, value=item["金额"])
ws.cell(row=row, column=4, value=item["备注"])
# 5. 调整列宽
ws.column_dimensions["a"].width = 8
ws.column_dimensions["b"].width = 20
ws.column_dimensions["c"].width = 15
ws.column_dimensions["d"].width = 30
# 6. 保存文件
save_path = f"{save_dir}/{data['部门']}_{data['月份']}月报表.xlsx"
wb.save(save_path)
print(f"已生成报表:{save_path}")
# 测试数据
test_data = [
{
"部门": "技术部",
"月份": 10,
"details": [
{"序号": 1, "项目": "服务器租赁", "金额": 5000, "备注": "季度付"},
{"序号": 2, "项目": "软件订阅", "金额": 3000, "备注": "月度付"}
]
},
{
"部门": "市场部",
"月份": 10,
"details": [
{"序号": 1, "项目": "广告投放", "金额": 20000, "备注": "线上推广"},
{"序号": 2, "项目": "活动策划", "金额": 8000, "备注": "线下活动"}
]
}
]
# 调用函数(需提前创建save_dir目录)
batch_generate_excel_reports(test_data, "./monthly_reports")
场景2:批量读取100个excel文件并合并数据(用pandas)
import pandas as pd
import os
def batch_merge_excel_files(file_dir, save_path):
"""
批量读取指定目录下的所有excel文件,合并数据后保存
:param file_dir: excel文件目录
:param save_path: 合并后保存路径
"""
# 1. 遍历目录,获取所有excel文件路径
excel_files = [f for f in os.listdir(file_dir) if f.endswith(".xlsx") and not f.startswith("~$")]
if not excel_files:
print("目录下无有效excel文件")
return
# 2. 批量读取并合并
all_data = []
for file in excel_files:
file_path = os.path.join(file_dir, file)
# 读取excel的"数据"工作表(假设所有文件结构一致)
df = pd.read_excel(file_path, sheet_name="数据")
# 添加"来源文件"列,便于追溯数据
df["来源文件"] = file
all_data.append(df)
# 3. 合并所有数据(忽略索引,重新生成)
merged_df = pd.concat(all_data, ignore_index=true)
# 4. 数据清洗(示例:去除空行、重复行)
merged_df = merged_df.dropna(how="all") # 去除全空行
merged_df = merged_df.drop_duplicates() # 去除重复行
# 5. 保存合并后的数据
merged_df.to_excel(save_path, index=false, sheet_name="合并数据")
print(f"合并完成,共 {len(merged_df)} 条数据,保存至:{save_path}")
# 调用函数
batch_merge_excel_files("./excel_files", "./merged_data.xlsx")
word自动化的核心需求是“批量生成标准化文档”(如合同、通知书、报告),痛点是“重复修改固定模板中的变量内容”。python-docx的核心优势是能基于现有模板,精准替换变量、插入表格和图片。
word的.docx格式本质是一个压缩包,里面包含多个xml文件(如document.xml存储文档内容、styles.xml存储样式)。python-docx的核心逻辑是“解析这些xml文件,定位到需要修改的节点(如文本、表格),通过api修改节点内容后重新打包”。这也是它只支持.docx格式的原因——.doc是二进制格式,解析难度极大。
from docx import document
from docx.shared import inches, pt
from docx.enum.text import wd_paragraph_alignment
def batch_generate_contracts(template_path, data_list, save_dir):
"""
基于word模板批量生成合同
:param template_path: 合同模板路径(.docx)
:param data_list: 合同数据列表,每个元素是字典
:param save_dir: 保存目录
"""
for idx, data in enumerate(data_list):
# 1. 加载模板
doc = document(template_path)
# 2. 替换文档中的变量(模板中用{{变量名}}标记)
# 遍历所有段落
for para in doc.paragraphs:
for key, value in data.items():
if f"{{{{{key}}}}}" in para.text:
# 替换变量
para.text = para.text.replace(f"{{{{{key}}}}}", str(value))
# 设置段落样式(可选)
para.alignment = wd_paragraph_alignment.justify # 两端对齐
for run in para.runs:
run.font.name = "微软雅黑"
run.font.size = pt(11)
# 3. 替换表格中的变量(如果模板中有表格)
for table in doc.tables:
for row in table.rows:
for cell in row.cells:
for key, value in data.items():
if f"{{{{{key}}}}}" in cell.text:
cell.text = cell.text.replace(f"{{{{{key}}}}}", str(value))
# 设置表格文本样式
for para in cell.paragraphs:
para.alignment = wd_paragraph_alignment.center
for run in para.runs:
run.font.name = "微软雅黑"
run.font.size = pt(10)
# 4. 插入附件说明(可选,在文档末尾添加)
para = doc.add_paragraph("附件说明:")
para.font.name = "微软雅黑"
para.font.size = pt(11)
para.font.bold = true
for attach in data["attachments"]:
doc.add_paragraph(f"1. {attach}", style="list bullet")
# 5. 保存文件
save_path = f"{save_dir}/合同_{data['甲方名称']}_{data['合同编号']}.docx"
doc.save(save_path)
print(f"已生成合同:{save_path}")
# 测试数据
test_contract_data = [
{
"合同编号": "ht202410001",
"甲方名称": "xx科技有限公司",
"乙方名称": "yy软件有限公司",
"项目名称": "企业oa系统开发",
"合同金额": "500000元",
"签订日期": "2024年10月20日",
"有效期": "2年",
"attachments": ["技术需求说明书", "报价单"]
},
{
"合同编号": "ht202410002",
"甲方名称": "zz贸易有限公司",
"乙方名称": "yy软件有限公司",
"项目名称": "客户管理系统升级",
"合同金额": "200000元",
"签订日期": "2024年10月21日",
"有效期": "1年",
"attachments": ["升级需求清单", "维护协议"]
}
]
# 调用函数(需提前准备模板文件,模板中用{{合同编号}}等变量标记)
batch_generate_contracts("./contract_template.docx", test_contract_data, "./contracts")
pdf自动化的核心需求是“批量合并多个pdf”“拆分大pdf为多个小pdf”“提取pdf中的文本/表格数据”。pypdf2适合基础的合并拆分,pdfplumber适合高精度的文本和表格提取。
pdf文件采用“页面描述语言”(pdf)描述内容,每个页面都是独立的对象,包含文本、图像、图形等元素的坐标和属性。pypdf2的核心逻辑是“遍历pdf的页面对象,实现页面的复制、移动(合并/拆分)”;pdfplumber则是通过解析页面的文本对象,精准提取文本内容和表格结构,其优势是能保留文本的位置信息,从而准确识别表格。
场景1:批量合并多个pdf(用pypdf2)
from pypdf2 import pdfmerger
import os
def batch_merge_pdfs(pdf_dir, save_path):
"""
批量合并指定目录下的所有pdf文件
:param pdf_dir: pdf文件目录
:param save_path: 合并后保存路径
"""
# 1. 初始化合并器
merger = pdfmerger()
# 2. 遍历目录,添加所有pdf文件
pdf_files = [f for f in os.listdir(pdf_dir) if f.endswith(".pdf")]
if not pdf_files:
print("目录下无有效pdf文件")
return
# 按文件名排序(确保合并顺序正确)
pdf_files.sort()
for file in pdf_files:
file_path = os.path.join(pdf_dir, file)
try:
merger.append(file_path) # 添加pdf文件
print(f"已添加:{file}")
except exception as e:
print(f"添加{file}失败:{e}")
# 3. 合并并保存
merger.write(save_path)
merger.close()
print(f"合并完成,保存至:{save_path}")
# 调用函数
batch_merge_pdfs("./pdf_files", "./merged_pdf.pdf")
场景2:批量提取多个pdf中的表格数据(用pdfplumber)
import pdfplumber
import pandas as pd
import os
def batch_extract_pdf_tables(pdf_dir, save_dir):
"""
批量提取多个pdf中的表格数据,保存为excel
:param pdf_dir: pdf文件目录
:param save_dir: 保存目录
"""
# 确保保存目录存在
os.makedirs(save_dir, exist_ok=true)
pdf_files = [f for f in os.listdir(pdf_dir) if f.endswith(".pdf")]
if not pdf_files:
print("目录下无有效pdf文件")
return
for file in pdf_files:
file_path = os.path.join(pdf_dir, file)
save_path = f"{save_dir}/{os.path.splitext(file)[0]}_表格数据.xlsx"
# 打开pdf文件
with pdfplumber.open(file_path) as pdf:
# 初始化excel写入器
with pd.excelwriter(save_path, engine="openpyxl") as writer:
table_count = 0
# 遍历所有页面
for page_idx, page in enumerate(pdf.pages, 1):
# 提取当前页面的所有表格
tables = page.extract_tables()
if not tables:
continue
# 遍历当前页面的表格
for table_idx, table in enumerate(tables, 1):
table_count += 1
# 转换为dataframe
df = pd.dataframe(table[1:], columns=table[0]) # table[0]是表头
# 保存到excel的不同工作表
sheet_name = f"第{page_idx}页_表格{table_idx}"
df.to_excel(writer, sheet_name=sheet_name, index=false)
if table_count > 0:
print(f"已提取{file}中的{table_count}个表格,保存至:{save_path}")
else:
print(f"{file}中未发现表格")
# 调用函数
batch_extract_pdf_tables("./pdf_files", "./pdf_tables")
邮件自动化的核心需求是“批量发送带附件的通知邮件”(如报表分发、合同发送),痛点是“手动输入收件人、添加附件效率低”“容易漏发、错发”。核心依赖python内置的smtplib(发送邮件)和email(构造邮件内容)库,需理解smtp协议的基本逻辑。
邮件发送的核心是“通过smtp服务器传递邮件内容”:python代码通过smtp协议连接到指定的smtp服务器(如qq邮箱的smtp.qq.com、企业邮箱的smtp.exmail.qq.com),验证身份后,将构造好的邮件(含收件人、主题、正文、附件)发送给smtp服务器,再由smtp服务器转发到收件人的邮箱服务器。
import smtplib
from email.mime.text import mimetext
from email.mime.multipart import mimemultipart
from email.header import header
import os
def batch_send_emails(smtp_info, email_data_list):
"""
批量发送带附件的邮件
:param smtp_info: smtp服务器信息,字典格式
:param email_data_list: 邮件数据列表,每个元素是字典(含收件人、主题、正文、附件)
"""
try:
# 1. 连接smtp服务器
smtp = smtplib.smtp_ssl(smtp_info["smtp_server"], smtp_info["smtp_port"])
# 2. 登录验证(注意:qq邮箱用授权码,企业邮箱用密码)
smtp.login(smtp_info["sender"], smtp_info["password"])
print("smtp服务器连接成功")
# 3. 批量发送邮件
for email_data in email_data_list:
# 构造邮件对象(带附件)
msg = mimemultipart()
msg["from"] = header(smtp_info["sender_name"], "utf-8") # 发件人名称
msg["to"] = header(";".join(email_data["receivers"]), "utf-8") # 收件人列表
msg["subject"] = header(email_data["subject"], "utf-8") # 邮件主题
# 添加正文
msg.attach(mimetext(email_data["content"], "html", "utf-8")) # 支持html格式正文
# 添加附件
for attach_path in email_data["attachments"]:
if not os.path.exists(attach_path):
print(f"附件{attach_path}不存在,跳过")
continue
# 读取附件文件
with open(attach_path, "rb") as f:
attach = mimetext(f.read(), "base64", "utf-8")
attach["content-type"] = "application/octet-stream"
# 设置附件名称(避免中文乱码)
attach["content-disposition"] = f'attachment; filename="{header(os.path.basename(attach_path), "utf-8").encode()}"'
msg.attach(attach)
# 发送邮件
smtp.sendmail(smtp_info["sender"], email_data["receivers"], msg.as_string())
print(f"已发送邮件至:{email_data['receivers']},主题:{email_data['subject']}")
# 4. 关闭连接
smtp.quit()
print("所有邮件发送完成")
except exception as e:
print(f"邮件发送失败:{e}")
# 配置smtp信息(以企业邮箱为例,qq邮箱需替换为smtp.qq.com,端口465,密码用授权码)
smtp_config = {
"smtp_server": "smtp.exmail.qq.com",
"smtp_port": 465,
"sender": "admin@company.com",
"sender_name": "行政部",
"password": "your_password" # 企业邮箱密码,qq邮箱用授权码
}
# 邮件数据(批量发送的邮件列表)
email_data = [
{
"receivers": ["tech@company.com", "manager1@company.com"],
"subject": "技术部10月报表",
"content": "<p>各位领导、同事:</p><p>附件为技术部2024年10月报表,请查收。</p>",
"attachments": ["./monthly_reports/技术部_10月报表.xlsx"]
},
{
"receivers": ["market@company.com", "manager2@company.com"],
"subject": "市场部10月报表",
"content": "<p>各位领导、同事:</p><p>附件为市场部2024年10月报表,请查收。</p>",
"attachments": ["./monthly_reports/市场部_10月报表.xlsx"]
}
]
# 调用函数
batch_send_emails(smtp_config, email_data)
前面讲了单个功能的实现,现在结合一个真实工程场景——“月度报表全链路自动化”,完整拆解从“数据收集→报表生成→pdf转换→批量分发”的全流程,解决实际工作中的全链路重复问题。
需求:某企业行政部每月需收集各部门的月度数据,生成标准化excel报表,转换为pdf格式,然后批量发送给对应部门负责人和公司领导,同时存档。
痛点:
import pandas as pd
import openpyxl
from docx import document
import pypdf2
import smtplib
from email.mime.text import mimetext
from email.mime.multipart import mimemultipart
from email.header import header
import os
import win32com.client # 需安装pywin32:pip install pywin32
from datetime import datetime
def excel_to_pdf(excel_path, pdf_path):
"""
将excel文件转换为pdf(调用excel进程,保证格式一致)
:param excel_path: excel文件路径
:param pdf_path: pdf保存路径
"""
excel = win32com.client.dispatchex("excel.application")
excel.visible = false
excel.displayalerts = false # 禁用警告
try:
workbook = excel.workbooks.open(excel_path)
# 转换为pdf(quality=17表示高质量)
workbook.exportasfixedformat(0, pdf_path, quality=17)
print(f"已将{excel_path}转换为pdf:{pdf_path}")
except exception as e:
print(f"excel转pdf失败:{e}")
finally:
workbook.close(savechanges=false)
excel.quit()
def monthly_report_automation(config):
"""
月度报表全链路自动化
:param config: 配置字典,含数据目录、模板路径、smtp信息等
"""
# 1. 初始化目录(按年份/月份/部门)
now = datetime.now()
year = now.year
month = now.month
base_dir = f"{config['base_dir']}/{year}/{month}"
excel_dir = f"{base_dir}/excel"
pdf_dir = f"{base_dir}/pdf"
archive_dir = f"{base_dir}/归档"
for dir_path in [excel_dir, pdf_dir, archive_dir]:
os.makedirs(dir_path, exist_ok=true)
# 2. 读取各部门提交的原始数据(标准化模板)
raw_data_dir = config["raw_data_dir"]
raw_files = [f for f in os.listdir(raw_data_dir) if f.endswith(".xlsx") and not f.startswith("~$")]
if not raw_files:
print("原始数据目录下无有效文件")
return
# 3. 批量生成标准化excel报表
report_template = config["report_template"]
email_data_list = []
for file in raw_files:
# 读取原始数据
raw_path = os.path.join(raw_data_dir, file)
raw_df = pd.read_excel(raw_path, sheet_name="原始数据")
# 数据校验(示例:检查是否有缺失字段)
required_fields = ["项目", "金额(元)", "备注"]
if not all(field in raw_df.columns for field in required_fields):
print(f"{file}缺失必要字段,跳过")
continue
# 提取部门名称(假设文件名格式:部门_原始数据.xlsx)
dept_name = os.path.splitext(file)[0].replace("_原始数据", "")
# 加载报表模板,生成标准化报表
wb = openpyxl.load_workbook(report_template)
ws = wb.active
ws["a1"] = f"{dept_name}{year}年{month}月报表"
ws["a1"].font = openpyxl.styles.font(name="微软雅黑", size=16, bold=true)
ws.merge_cells("a1:d1")
# 写入数据
for row_idx, (_, row) in enumerate(raw_df.iterrows(), 4):
ws.cell(row=row_idx, column=1, value=row_idx-3) # 序号
ws.cell(row=row_idx, column=2, value=row["项目"])
ws.cell(row=row_idx, column=3, value=row["金额(元)"])
ws.cell(row=row_idx, column=4, value=row["备注"])
# 保存excel报表
excel_path = f"{excel_dir}/{dept_name}_{year}年{month}月报表.xlsx"
wb.save(excel_path)
# 4. 转换为pdf
pdf_path = f"{pdf_dir}/{dept_name}_{year}年{month}月报表.pdf"
excel_to_pdf(excel_path, pdf_path)
# 5. 整理邮件数据
# 读取收件人配置(假设config["receivers_config"]是收件人字典)
receivers = config["receivers_config"].get(dept_name, config["default_receivers"])
email_data = {
"receivers": receivers,
"subject": f"{dept_name}{year}年{month}月报表",
"content": f"<p>各位领导、同事:</p><p>附件为{dept_name}{year}年{month}月报表(excel+pdf),请查收。</p>",
"attachments": [excel_path, pdf_path]
}
email_data_list.append(email_data)
# 6. 归档文件
archive_excel_path = f"{archive_dir}/{dept_name}_{year}年{month}月报表.xlsx"
archive_pdf_path = f"{archive_dir}/{dept_name}_{year}年{month}月报表.pdf"
os.copy(excel_path, archive_excel_path)
os.copy(pdf_path, archive_pdf_path)
# 7. 批量发送邮件
smtp_info = config["smtp_info"]
smtp = smtplib.smtp_ssl(smtp_info["smtp_server"], smtp_info["smtp_port"])
smtp.login(smtp_info["sender"], smtp_info["password"])
for email_data in email_data_list:
msg = mimemultipart()
msg["from"] = header(smtp_info["sender_name"], "utf-8")
msg["to"] = header(";".join(email_data["receivers"]), "utf-8")
msg["subject"] = header(email_data["subject"], "utf-8")
msg.attach(mimetext(email_data["content"], "html", "utf-8"))
# 添加附件
for attach_path in email_data["attachments"]:
if os.path.exists(attach_path):
with open(attach_path, "rb") as f:
attach = mimetext(f.read(), "base64", "utf-8")
attach["content-type"] = "application/octet-stream"
attach["content-disposition"] = f'attachment; filename="{header(os.path.basename(attach_path), "utf-8").encode()}"'
msg.attach(attach)
smtp.sendmail(smtp_info["sender"], email_data["receivers"], msg.as_string())
print(f"已发送邮件至:{email_data['receivers']}")
smtp.quit()
print("全链路自动化完成!")
# 配置信息
config = {
"base_dir": "./月度报表自动化",
"raw_data_dir": "./原始数据",
"report_template": "./报表模板.xlsx",
"smtp_info": {
"smtp_server": "smtp.exmail.qq.com",
"smtp_port": 465,
"sender": "admin@company.com",
"sender_name": "行政部",
"password": "your_password"
},
"receivers_config": {
"技术部": ["tech_manager@company.com", "ceo@company.com"],
"市场部": ["market_manager@company.com", "ceo@company.com"],
"财务部": ["finance_manager@company.com", "ceo@company.com"]
},
"default_receivers": ["admin@company.com", "ceo@company.com"]
}
# 执行全链路自动化
monthly_report_automation(config)
结合实际开发经验,整理了5个python自动化办公的高频坑点,每个坑点都包含“触发条件→表现症状→排查方法→解决方案→预防措施”,帮你少走弯路。
解决方案:获取合并单元格的起始单元格值(合并单元格的值仅存储在起始单元格),封装工具函数:
`def get_merged_cell_value(ws, row, col): “”“获取合并单元格的值”“” for merged_range in ws.merged_cells.ranges: if row in merged_range.min_row:merged_range.max_row and col in merged_range.min_col:merged_range.max_col: # 返回合并范围的起始单元格值 return ws.cell(row=merged_range.min_row, column=merged_range.min_col).value
非合并单元格,直接返回值
return ws.cell(row=row, column=col).value`
解决方案:同时设置font.name和font.element.rpr.rfonts.set(qn(“w:eastasia”), “微软雅黑”),确保中文字体生效:
解决方案:替换为pymupdf(fitz)库合并pdf,中文支持更好(需安装:pip install pymupdf):
`import fitz # pymupdf
def merge_pdfs_with_chinese(pdf_paths, save_path):
“”“合并包含中文的pdf文件”“”
doc = fitz.open()
for pdf_path in pdf_paths:
with fitz.open(pdf_path) as sub_doc:
doc.insert_pdf(sub_doc)
doc.save(save_path)
doc.close()
print(f"合并完成:{save_path}")`解决方案:
1. 规范发件人信息,设置清晰的发件人名称;
2. 邮件正文使用html格式,添加合理的段落结构,避免纯文本堆砌;
3. 控制发送频率,避免短时间内发送大量邮件;
4. 配置dkim/spf记录(企业邮箱),提升邮件可信度。
示例代码(规范的邮件构造):
`msg = mimemultipart() msg[“from”] = header(“行政部admin@company.com”, “utf-8”) # 规范发件人名称 msg[“to”] = header(“技术部经理tech_manager@company.com”, “utf-8”) msg[“subject”] = header(“技术部10月报表”, “utf-8”)
规范html正文
content = “”"
尊敬的技术部经理:
您好!附件为技术部2024年10月报表,请查收。
报表包含以下内容:
如有疑问,请随时联系行政部。
行政部
2024年10月20日
解决方案:确保在finally块中关闭workbook和quit excel,即使出现异常也能正常释放资源(参考3.3节的excel_to_pdf函数):
def safe_excel_to_pdf(excel_path, pdf_path): excel = none workbook = none try: excel = win32com.client.dispatchex("excel.application") excel.visible = false excel.displayalerts = false workbook = excel.workbooks.open(excel_path) workbook.exportasfixedformat(0, pdf_path, quality=17) except exception as e: print(f"转换失败:{e}") finally: if workbook: workbook.close(savechanges=false) if excel: excel.quit() # 强制释放com对象(可选,进一步避免残留) import pythoncom pythoncom.couninitialize()预防措施:使用win32com.client调用office进程时,始终使用try-except-finally结构,在finally块中明确关闭文档和退出应用程序;若需进一步确保资源释放,可添加pythoncom.couninitialize()强制释放com对象,避免因程序异常中断导致进程残留。
以上就是python自动化办公全攻略之excel/word/pdf/邮件批量处理的详细内容,更多关于python excel/word/pdf/邮件批量处理的资料请关注代码网其它相关文章!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论