Excel批量处理脚本失效排查:直方图、统计与Word报告生成异常
问题排查与修复方案
核心错误点
- 硬编码文件路径:
plot_histogram函数中读取Excel时使用固定字符串r'file path',而非传入的file_path参数,导致无法正确读取目标文件,后续所有操作均未执行。 - Excel统计数据写入逻辑错误:原代码用
pd.concat横向拼接统计数据,会新增列但仅第一行有值,其余行全为NaN,且未实现将直方图插入Excel的需求。 - Word模块引用错误:
create_word_document中doc.shared.Inches应为docx.shared.Inches,缺少对应模块导入。 - 缺少Excel插入图片的逻辑:原代码仅保存直方图图片,未将图片写入Excel文件。
修复后的完整代码
import os import pandas as pd import matplotlib.pyplot as plt from docx import Document from docx.shared import Inches from openpyxl import load_workbook from openpyxl.drawing.image import Image def plot_histogram(file_path, column_name='Feret'): try: # 使用传入的路径读取Excel,指定openpyxl引擎支持后续操作 df = pd.read_excel(file_path, engine='openpyxl') # 转换列为数值型并清理空值 df[column_name] = pd.to_numeric(df[column_name], errors='coerce') df_clean = df.dropna(subset=[column_name]) feret_values = df_clean[column_name] # 生成直方图 plt.figure(figsize=(10, 6)) plt.hist(feret_values, bins='auto', alpha=0.7, rwidth=0.85) plt.title(f'Histogram of {column_name}', fontsize=14) plt.xlabel(column_name, fontsize=12) plt.ylabel('Frequency', fontsize=12) plt.tight_layout() # 保存直方图图片 plot_filename = f"{os.path.splitext(file_path)[0]}_{column_name}_histogram.png" plt.savefig(plot_filename, dpi=100) plt.close() return plot_filename, feret_values, df except Exception as e: print(f"Error in plot_histogram: {e}") return None, None, None def update_excel_with_statistics(file_path, column_name, statistics, plot_filename, df): try: # 整理统计数据为DataFrame stats_df = pd.DataFrame({ '统计项': ['平均值', '最小值', '最大值'], '数值': [statistics['average'], statistics['min'], statistics['max']] }) # 写入Excel:新增工作表存放统计数据和直方图,保留原始数据 with pd.ExcelWriter(file_path, engine='openpyxl', mode='a', if_sheet_exists='replace') as writer: df.to_excel(writer, sheet_name='原始数据', index=False) stats_df.to_excel(writer, sheet_name='统计结果', index=False) # 插入直方图到统计结果工作表 wb = load_workbook(file_path) ws = wb['统计结果'] img = Image(plot_filename) img.width, img.height = 600, 400 ws.add_image(img, 'E2') wb.save(file_path) except Exception as e: print(f"Error in update_excel_with_statistics: {e}") def create_word_document(file_path, column_name, statistics, histogram_image): try: doc = Document() # 添加报告标题与文件信息 doc.add_heading('Feret列分析报告', level=1) doc.add_paragraph(f"处理文件:{os.path.basename(file_path)}") doc.add_paragraph(f"分析列名:{column_name}") # 添加统计数据 doc.add_heading('统计数据', level=2) doc.add_paragraph(f"平均值:{statistics['average']:.2f}") doc.add_paragraph(f"最小值:{statistics['min']:.2f}") doc.add_paragraph(f"最大值:{statistics['max']:.2f}") # 添加直方图 doc.add_heading('直方图', level=2) if os.path.exists(histogram_image): doc.add_picture(histogram_image, width=Inches(6)) else: doc.add_paragraph("直方图图片不存在") # 保存Word报告 output_word = f"{os.path.splitext(file_path)[0]}_分析报告.docx" doc.save(output_word) except Exception as e: print(f"Error in create_word_document: {e}") if __name__ == "__main__": folder_path = '.' # 替换为目标文件夹路径 for file_name in os.listdir(folder_path): if file_name.endswith('.xlsx'): file_path = os.path.join(folder_path, file_name) print(f"正在处理文件:{file_path}") # 生成直方图并获取数据 plot_file, feret_vals, df = plot_histogram(file_path) if plot_file and feret_vals is not None: # 计算统计数据 stats = { 'average': feret_vals.mean(), 'min': feret_vals.min(), 'max': feret_vals.max() } # 更新Excel文件 update_excel_with_statistics(file_path, 'Feret', stats, plot_file, df) # 生成Word报告 create_word_document(file_path, 'Feret', stats, plot_file) print(f"{file_path} 处理完成") else: print(f"{file_path} 处理失败,跳过")
修复说明
- 修复文件读取问题:将Excel读取路径改为传入的
file_path,指定openpyxl引擎以支持插入图片操作。 - 优化Excel写入逻辑:新增
统计结果工作表存放统计数据和直方图,避免破坏原始数据结构。 - 修复Word模块引用:导入
docx.shared.Inches并正确使用。 - 完善错误处理:保留各函数的异常捕获,便于排查问题。
- 增强输出规范性:调整图表尺寸、文档格式,使结果更易读。
内容的提问来源于stack exchange,提问作者Maysa
相关产品推荐
相关产品推荐

