运维人不会写代码,照样批量处理100个Excel
上周一个朋友跟我吐槽,说月底要处理200多个代理商的Excel报表,纯手动复制粘贴,搞了两天两夜还没弄完。
我问他,你听说过Python操作Excel吗?
他说,我又不是程序员,代码这东西跟我有什么关系。
其实关系大了。今天这篇文章,我就把这段时间帮客户做自动化报表整理的经验整理出来,从最基础的批量处理Excel,到自动填充腾讯文档,一步步拆解给你看。
场景一,批量处理200个代理商Excel
先说背景。代理商每个月要提交一份销售数据报表,格式是统一的Excel模板。到了月底,负责人要把200份报表里的关键数据提取出来,汇总到一张总表里。
手动操作的话,打开一个文件,复制指定单元格,粘贴到总表,关闭文件,再来下一个。200个文件,每个大概2分钟,算下来差不多7个小时。还不算中间手抖粘贴错行的情况。
核心思路是这样的,用Python的openpyxl库读取Excel文件,循环遍历目标文件夹里的每一个xlsx文件,把指定单元格的值提取出来,写到汇总表对应的位置。
先装依赖,只需要一个包。
pip install openpyxl
然后核心代码其实就30行不到。
import os
from openpyxl import load_workbook, Workbook
# 汇总表路径
output_file = '汇总表.xlsx'
# 代理商报表所在文件夹
source_folder = './代理商报表/'
# 创建汇总表
wb_out = Workbook()
ws_out = wb_out.active
ws_out.title = '汇总'
# 写表头
ws_out.append(['代理商名称', '销售额', '订单数', '回款金额'])
# 遍历文件夹里的每一个Excel文件
row_idx = 2 # 从第2行开始写数据
for filename in os.listdir(source_folder):
if not filename.endswith('.xlsx'):
continue # 跳过非Excel文件
filepath = os.path.join(source_folder, filename)
wb = load_workbook(filepath)
ws = wb.active
# 按模板格式提取数据
# 代理商名称在B2,销售额在C5,订单数在C6,回款金额在C7
name = ws['B2'].value
sales = ws['C5'].value
orders = ws['C6'].value
payment = ws['C7'].value
ws_out.append([name, sales, orders, payment])
row_idx += 1
wb.close()
wb_out.save(output_file)
print(f'处理完成,共汇总 {row_idx - 2} 个代理商数据')
跑一下,10秒钟搞定200个文件。
这里有几个踩坑点值得说一下。
踩坑一,openpyxl默认只认xlsx格式,老版本的xls文件得用xlrd库。如果你的代理商还在用Excel 2003格式,记得先转存一下,或者换成xlrd来读。
踩坑二,有些Excel文件里会有合并单元格,openpyxl读取合并单元格时,只有左上角的那个格子有值,其他都是None。遇到这种情况要提前确认模板的合并规则。
踩坑三,文件编码问题。如果Excel文件里包含中文路径或者中文文件名,在Windows下一般没问题,但到了Linux服务器上可能需要检查文件系统的编码设置。
进阶一步,如果每个代理商的模板格式不完全一样怎么办?比如有些代理商的销售额在C5,有些在D5。
这种情况我一般建议加一个配置文件,用JSON格式把每个代理商的数据位置映射好。
# config.json
{
"default": {
"name_cell": "B2",
"sales_cell": "C5",
"orders_cell": "C6",
"payment_cell": "C7"
},
"exceptions": {
"华南大区代理商A": {
"sales_cell": "D5",
"payment_cell": "D7"
}
}
}
代码里先读配置,遇到特殊代理商就用特殊规则,其他的走默认逻辑。这样不管代理商怎么折腾模板,你只需要改JSON配置文件,不用动代码。
场景二,数据自动填到腾讯文档
Excel汇总完了,下一步往往是填到协作文档里。很多团队用腾讯文档做线上协作,每周的运营报表、客户拜访记录这些,都需要填到指定的腾讯文档表格里。
问题来了,从Excel复制到腾讯文档,格式经常乱。数字变成文本,日期格式对不上,每列宽度还得重新调一遍。如果是一周一次还好,天天这么搞谁也受不了。
解决方案是直接通过API写入腾讯文档。
腾讯文档提供了开放API,支持通过HTTP请求读写在线文档。整体流程分三步走。
▶ 第一步,在腾讯文档开放平台创建应用,获取AppID和AppSecret
▶ 第二步,通过API获取文档的访问令牌(access_token)
▶ 第三步,调用写接口,把数据写入指定单元格
获取access_token的代码。
import requests
def get_access_token(app_id, app_secret):
url = 'https://docs.qq.com/openapi/auth/get_token'
payload = {
'app_id': app_id,
'app_secret': app_secret
}
resp = requests.post(url, json=payload)
result = resp.json()
if result.get('error_code') == 0:
return result['access_token']
else:
raise Exception(f'获取token失败: {result}')
token = get_access_token('你的AppID', '你的AppSecret')
print(f'token: {token[:20]}...')
拿到token之后,往文档里写数据。
def write_to_sheet(token, sheet_id, data_list):
"""
批量写入数据到腾讯文档在线表格
sheet_id: 在线表格的ID(从URL里拿)
data_list: 二维数组,比如 [['张三', 10000, 50], ['李四', 8000, 30]]
"""
url = f'https://docs.qq.com/openapi/sheet/v2/spreadsheets/{sheet_id}/sheets/values'
headers = {
'Authorization': f'Bearer {token}',
'Content-Type': 'application/json'
}
# 写入A2起始的区域
payload = {
'range': 'A2',
'values': data_list
}
resp = requests.post(url, headers=headers, json=payload)
result = resp.json()
if result.get('error_code') == 0:
print('写入成功')
else:
print(f'写入失败: {result}')
# 把之前汇总的数据写进去
data = [
['华南大区代理商A', 150000, 320, 120000],
['华东大区代理商B', 98000, 215, 85000],
['华北大区代理商C', 220000, 480, 195000]
]
write_to_sheet(token, '你的sheet_id', data)
这样Excel汇总完的数据,直接通过API推到腾讯文档,中间不需要任何手动复制粘贴。
实际使用中,一般会把两个场景串起来,做成一个完整的自动化流程。
场景三,串联成一个自动化流水线
把前面两步合在一起,整个流程就是这样的。
▶ 1)从指定文件夹读取所有代理商Excel报表
▶ 2)按配置规则提取关键数据,生成汇总Excel
▶ 3)通过腾讯文档API把汇总数据写入在线表格
▶ 4)可选,发送企业微信通知告诉相关人员报表已更新
如果还想更进一步,可以用Windows的任务计划程序或者Linux的crontab设置定时执行。比如每周一早上8点自动跑一次,周一上班的时候打开腾讯文档,数据已经全填好了。
# crontab 定时任务,每周一早上8点执行
0 8 * * 1 cd /data/report-automation && python3 main.py >> /var/log/report.log 2>&1
再说说企业微信通知这个环节。腾讯文档更新完了,怎么让相关人员知道?
企业微信机器人Webhook是最简单的方式,往群聊里推一条消息就行。
def send_wework_notice(webhook_url, content):
payload = {
'msgtype': 'text',
'text': {'content': content}
}
resp = requests.post(webhook_url, json=payload)
return resp.json()
webhook = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你的key'
send_wework_notice(webhook, '本周代理商报表已自动更新,请查看腾讯文档链接。')
到这里,一个从Excel批量处理到腾讯文档自动填写的完整自动化流水线就搭好了。
几个实际落地要注意的事
跑了一段时间之后,有几个经验值得记录。
关于数据校验。自动化的最大风险不是脚本跑不通,而是跑通了但数据错了你还不知道。建议在写入腾讯文档之前加一步校验逻辑,比如检查数值是否在合理范围内、汇总行数是否和文件数匹配、有没有空值等。发现异常就中断并报警,不要把错误数据写进去。
关于异常处理。文件找不到、网络超时、API限流、Excel格式被改了,这些都是常见异常。每个关键步骤都要加try-except,异常信息要写到日志文件里,方便排查。不要让脚本静默失败。
关于权限管理。腾讯文档的API调用需要应用有对应文档的编辑权限。如果文档权限被改了,API就会报错。建议用一个专门的服务账号来管理这些文档权限,不要用个人账号。
关于WPS和腾讯文档的区别。很多人搞混这两个东西。WPS是金山办公的本地/云端办公套件,腾讯文档是腾讯的在线协作文档。它们都有开放API,但接口和鉴权方式完全不同。如果你的团队用的是WPS云文档而不是腾讯文档,那就需要换成WPS开放平台的API,代码结构类似但接口地址和参数不一样。
写在最后
回到开头那个朋友的例子。我帮他把脚本写好之后,他试了一下,10秒钟处理完200个文件。他说了一句让我印象很深的话,「这东西我早该学了」。
其实不是「早该学」,而是没人告诉他这件事可以这么简单。
运维人的日常工作中,有大量重复性的文档操作。Excel汇总、报表填写、数据搬运,这些事情本身不难,就是烦。一旦你掌握了用代码处理这些文档的方法,效率提升不是一倍两倍,是十倍百倍。
而且这件事的门槛真的没有想象中那么高。Python操作Excel的核心就那么几个API,腾讯文档的接口也就读写两个。一个下午就能搞定的事情,可以省掉后面每个月几十个小时的重复劳动。
值得投入。
— END —
夜雨聆风