Python 自动化办公:基于 openpyxl 实现 Excel 数据汇总与填充
一、背景与需求
在日常的安全运营或数据分析工作中,我们经常需要处理大量的 Excel 表格数据。例如,在漏洞管理场景中,需要将分散在不同行的漏洞信息(如漏洞名称、IP 地址、误报证明状态等)进行汇总,并填充到特定的统计行中。手动操作不仅效率低下,而且容易出错。
基于 Python openpyxl 库实现 Excel 数据自动汇总与填充。通过遍历表格行,根据漏洞名称及误报/整改证明状态筛选 IP 地址,将结果写入指定单元格。解决了手动核对大量安全漏洞数据的低效问题,提升了办公自动化水平。

在日常的安全运营或数据分析工作中,我们经常需要处理大量的 Excel 表格数据。例如,在漏洞管理场景中,需要将分散在不同行的漏洞信息(如漏洞名称、IP 地址、误报证明状态等)进行汇总,并填充到特定的统计行中。手动操作不仅效率低下,而且容易出错。
本文介绍如何使用 Python 的 openpyxl 库,编写脚本自动读取 Excel 文件,根据特定条件筛选数据,并将结果汇总填充至指定单元格,从而实现办公自动化。
假设我们有一个包含漏洞扫描结果的 Excel 文件,其中每一行代表一个具体的漏洞实例。我们需要针对特定的漏洞名称(如 OpenSSH 相关漏洞),统计以下信息:
最终目标是将这些统计结果写入表格底部的汇总行中。
在使用脚本之前,请确保您的开发环境中已安装 Python 以及必要的第三方库。
pip install openpyxl
测试.xlsx 的文件,确保其结构与代码逻辑中的行列对应一致。本方案的核心在于遍历 Excel 的每一行,提取关键字段,并根据预设规则进行分类和聚合。
假设 Excel 文件的列结构如下:
以下是优化后的完整代码示例,增加了异常处理和更清晰的注释。
import openpyxl
from typing import List, Optional
def fill_table(bug_name: str, sheet, row_number: int):
"""
根据漏洞名称汇总数据并填充到指定行。
:param bug_name: 需要处理的漏洞名称
:param sheet: openpyxl 的工作表对象
:param row_number: 目标填充的行号
"""
# 初始化 IP 地址列表
ip_list_misreport = [] # 已提供误报证明的 IP
ip_list_fixed_prove = [] # 已提供无法整改证明的 IP
ip_list_no_proof = [] # 没有误报和无法整改证明的 IP
has_misreport = False
has_fixed_prove = False
# 遍历工作表中的每一行
# 假设数据从第 2 行开始,第 1 行为标题
for row in range(2, sheet.max_row + 1):
try:
system_name = sheet.cell(row=row, column=1).value
vulnerability_name = sheet.cell(row=row, column=2).value
ip = sheet.cell(row=row, column=3).value
is_provided_misreport = sheet.cell(row=row, column=4).value
is_provided_fixed_prove = sheet.cell(row=row, column=5).value
# 过滤掉空行
if not all([vulnerability_name, ip]):
continue
# 判断漏洞名称是否匹配
if vulnerability_name == bug_name:
# 检查误报证明
if is_provided_misreport == '是':
has_misreport = True
ip_list_misreport.append(ip)
# 检查整改证明
elif is_provided_fixed_prove == '是':
has_fixed_prove = True
ip_list_fixed_prove.append(ip)
# 两者皆否的情况
else:
ip_list_no_proof.append(ip)
except Exception as e:
print(f"跳过第 {row} 行,发生错误:{e}")
continue
# 填写 C 列 (Column 3) - 是否提供误报证明
sheet.cell(row=row_number, column=3).value = '是' if has_misreport else '否'
# 填写 D 列 (Column 4) - 误报证明 IP 列表
sheet.cell(row=row_number, column=4).value = ','.join(ip_list_misreport) if ip_list_misreport else ''
# 填写 E 列 (Column 5) - 是否提供整改证明
sheet.cell(row=row_number, column=5).value = '是' if has_fixed_prove else '否'
# 填写 F 列 (Column 6) - 整改证明 IP 列表
sheet.cell(row=row_number, column=6).value = ','.join(ip_list_fixed_prove) if ip_list_fixed_prove else ''
# 填写 G 列 (Column 7) - 无证明 IP 列表
if not ip_list_no_proof:
sheet.cell(row=row_number, column=7).value = "无"
else:
sheet.cell(row=row_number, column=7).value = ','.join(ip_list_no_proof)
if __name__ == '__main__':
# 配置参数
file_path = '测试.xlsx'
output_path = 'updated_excel_file.xlsx'
target_rows = [
("OpenSSH 'schnorr.c'远程内存破坏漏洞(CVE-2014-1692)", 15),
("OpenSSH 'x11_open_helper()'函数安全限制绕过漏洞(CVE-2015-5352)", 16)
]
try:
# 打开 Excel 文件
workbook = openpyxl.load_workbook(file_path)
sheet = workbook.active
# 执行填充逻辑
for bug_name, row_num in target_rows:
fill_table(bug_name, sheet, row_num)
# 保存修改后的文件
workbook.save(output_path)
print(f"处理完成,文件已保存至:{output_path}")
except FileNotFoundError:
print(f"错误:找不到文件 {file_path}")
except PermissionError:
print(f"错误:文件 {file_path} 被占用,请关闭后重试")
except Exception as e:
print(f"发生未知错误:{e}")
auto_fill.py。测试.xlsx 文件,且格式符合预期。python auto_fill.py
updated_excel_file.xlsx 文件,确认底部汇总行的数据是否正确填充。如果 Excel 文件非常大(例如超过 10 万行),使用 openpyxl 逐行读取可能会较慢。此时可以考虑使用 pandas 库进行批量处理,速度会显著提升。
Excel 中的日期或数字有时会被读取为特殊类型。建议在代码中添加类型转换逻辑,例如使用 str(value) 确保字符串拼接不会报错。
代码中已加入基本的空值检查,但在实际业务中,可能需要处理更多边缘情况,例如单元格为空、文本中包含空格等。建议增加 .strip() 方法清理字符串。
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| openpyxl | 支持复杂样式,读写灵活 | 大文件处理慢 | 中小规模数据,需保留格式 |
| pandas | 数据处理速度快,API 丰富 | 样式支持较弱 | 大规模数据分析,无需保留样式 |
| xlrd/xlwt | 仅支持旧版 .xls | 不支持 .xlsx | 维护老旧系统 |
对于本案例,由于涉及单元格样式的潜在需求及中等规模数据,openpyxl 是最合适的选择。若后续数据量激增,可考虑迁移至 pandas 方案。
通过本教程,我们掌握了如何利用 Python 自动化处理 Excel 数据汇总任务。这种方法可以大幅减少人工重复劳动,降低出错率,特别适用于安全报告、财务统计等场景。希望读者能根据实际需求灵活调整代码逻辑,构建适合自己的自动化办公工具。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online