使用OPENPYXL自动创建报表时出现数据重复堆叠问题如何解决
问题根因
你当前的代码只在程序启动时创建了1次全局的Workbook对象和工作表对象ws,每次调用reporteador函数时都是往同一个工作表里追加数据,所以保存的新报表自然会包含之前所有旧数据。另外你的代码还存在重复的死循环、报表命名规则可能导致同天报表覆盖的问题。
修改后可直接运行的代码
import pandas as pd import time import datetime import openpyxl from openpyxl import Workbook def reporteador(año, mes, dia, hora, minuto): # 每次生成报表前创建全新的空白工作簿,避免历史数据累加 wb = Workbook() ws = wb.active # 读取当前数据源并写入表头 df = pd.read_csv("Data_cruda.csv") header = list(df.columns) ws.append(header) # 写入当前时间段对应的业务数据 current_data = list(df.loc[0]) ws.append(current_data) # 文件名增加时分后缀,避免同天生成的报表互相覆盖 wb.save(f"Report_{año}{mes:02d}{dia:02d}_{hora:02d}{minuto:02d}.xlsx") if __name__ == "__main__": last_minute = None while True: now = datetime.datetime.now() # 每分钟仅触发一次报表生成,避免重复执行 if now.minute != last_minute: reporteador(now.year, now.month, now.day, now.hour, now.minute) last_minute = now.minute # 每秒校验一次时间,降低CPU占用 time.sleep(1)
核心修改说明
- 将
Workbook和工作表的初始化逻辑移到reporteador函数内部,每次生成报表都创建全新的空白工作簿,从根源解决数据堆叠问题 - 重构了原代码中混乱的多层嵌套死循环逻辑,改为每分钟仅触发一次报表生成,符合需求的同时避免重复执行
- 文件名增加时分后缀,避免同一天生成的报表互相覆盖
- 优化时间判断逻辑,大幅降低程序CPU占用
内容的提问来源于stack exchange,提问作者Edwin Gavilan
相关产品推荐
相关产品推荐

