You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Excel批量处理脚本失效排查:直方图、统计与Word报告生成异常

问题排查与修复方案

核心错误点

  1. 硬编码文件路径:plot_histogram函数中读取Excel时使用固定字符串r'file path',而非传入的file_path参数,导致无法正确读取目标文件,后续所有操作均未执行。
  2. Excel统计数据写入逻辑错误:原代码用pd.concat横向拼接统计数据,会新增列但仅第一行有值,其余行全为NaN,且未实现将直方图插入Excel的需求。
  3. Word模块引用错误:create_word_document中doc.shared.Inches应为docx.shared.Inches,缺少对应模块导入。
  4. 缺少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} 处理失败,跳过")

修复说明

  1. 修复文件读取问题:将Excel读取路径改为传入的file_path,指定openpyxl引擎以支持插入图片操作。
  2. 优化Excel写入逻辑:新增统计结果工作表存放统计数据和直方图,避免破坏原始数据结构。
  3. 修复Word模块引用:导入docx.shared.Inches并正确使用。
  4. 完善错误处理:保留各函数的异常捕获,便于排查问题。
  5. 增强输出规范性:调整图表尺寸、文档格式,使结果更易读。

内容的提问来源于stack exchange,提问作者Maysa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 09:47:02