如何用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()
用法示例
- 指定X轴列和排除列
# 假设CSV中有"日期"(字符串)、"销售额"、"利润"、"备注"列,要排除"备注" save_to_excel_with_chart(csv_string, "销售报表", exclude_columns=["备注"], x_axis_column="日期")
- 自动识别X轴列
如果你的CSV中只有一个字符串列(比如"时间点"),其余都是数值列,无需额外指定:
save_to_excel_with_chart(csv_string, "运营数据")
关键细节说明
- 列筛选逻辑:自动排除非数值列(除X轴列)和用户指定的排除列,确保图表只使用有效数据
- 图表配置:设置X轴为类别轴,完美适配字符串类型的X轴数据,和Excel手动操作的效果一致
- 系列添加:批量遍历数值列,自动用表头作为折线的系列名称,无需手动命名
- 位置控制:图表插入在
A10位置,可根据数据量调整(比如A20)避免覆盖原始数据
内容的提问来源于stack exchange,提问作者PloniStacker
相关产品推荐
相关产品推荐

