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

如何用Python从已有CSV绘制指定格式的Excel折线图

解决方案

基于你已有的代码,我们可以用openpyxl(你已经在用的Excel引擎)直接在生成的Excel文件中添加折线图,完美复刻手动操作的效果。下面是扩展后的优雅实现:

完整代码

import pandas as pd
from io import StringIO
from openpyxl.chart import LineChart, Reference
from openpyxl.chart.label import DataLabelList

def save_to_excel_with_chart(csv, type, exclude_columns=None, x_axis_column=None):
    # 初始化默认参数
    exclude_columns = exclude_columns or []
    
    # 读取CSV数据到DataFrame
    csv_data_frame = pd.read_csv(StringIO(csv))
    
    # 处理X轴列:优先用户指定,否则自动识别唯一字符串列
    if not x_axis_column:
        string_cols = [col for col in csv_data_frame.columns if pd.api.types.is_string_dtype(csv_data_frame[col])]
        if len(string_cols) != 1:
            raise ValueError("请指定唯一字符串列作为X轴,或确保数据中仅存在一个字符串类型列")
        x_axis_column = string_cols[0]
    
    # 筛选需要保留的列:X轴列 + 非排除的数值列
    numeric_cols = [
        col for col in csv_data_frame.columns 
        if col != x_axis_column 
        and col not in exclude_columns 
        and pd.api.types.is_numeric_dtype(csv_data_frame[col])
    ]
    selected_df = csv_data_frame[[x_axis_column] + numeric_cols]
    
    # 写入Excel数据
    excel_writer = pd.ExcelWriter(f"{type}_results.xlsx", engine='openpyxl')
    selected_df.to_excel(excel_writer, index=False, sheet_name="results")
    
    # 获取工作表对象,开始构建图表
    workbook = excel_writer.book
    worksheet = workbook["results"]
    
    # 创建折线图并配置样式
    line_chart = LineChart()
    line_chart.title = f"{type} 趋势分析"
    line_chart.x_axis.title = x_axis_column
    line_chart.y_axis.title = "数值"
    line_chart.x_axis.type = "category"  # 设置X轴为类别轴(适配字符串)
    
    # 定义数据范围
    max_row = worksheet.max_row
    max_col = worksheet.max_column
    
    # 关联X轴数据(跳过表头,从第二行开始)
    x_data_ref = Reference(worksheet, min_col=1, min_row=2, max_row=max_row)
    line_chart.set_categories(x_data_ref)
    
    # 批量添加数值列作为折线系列
    for col_idx in range(2, max_col + 1):
        y_data_ref = Reference(worksheet, min_col=col_idx, min_row=1, max_row=max_row)
        line_chart.add_data(y_data_ref, titles_from_data=True)  # 用表头作为系列名称
    
    # 可选:显示数据标签
    line_chart.dataLabels = DataLabelList()
    line_chart.dataLabels.showVal = True
    
    # 将图表插入到数据下方(避免覆盖原始数据)
    worksheet.add_chart(line_chart, "A10")
    
    # 保存并关闭文件
    excel_writer.close()

用法示例

  1. 指定X轴列和排除列
# 假设CSV中有"日期"(字符串)、"销售额"、"利润"、"备注"列,要排除"备注"
save_to_excel_with_chart(csv_string, "销售报表", exclude_columns=["备注"], x_axis_column="日期")
  1. 自动识别X轴列
    如果你的CSV中只有一个字符串列(比如"时间点"),其余都是数值列,无需额外指定:
save_to_excel_with_chart(csv_string, "运营数据")

关键细节说明

  • 列筛选逻辑:自动排除非数值列(除X轴列)和用户指定的排除列,确保图表只使用有效数据
  • 图表配置:设置X轴为类别轴,完美适配字符串类型的X轴数据,和Excel手动操作的效果一致
  • 系列添加:批量遍历数值列,自动用表头作为折线的系列名称,无需手动命名
  • 位置控制:图表插入在A10位置,可根据数据量调整(比如A20)避免覆盖原始数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 11:07:09