Python绘制Excel折线图 openpyxl完整代码

Python绘制Excel折线图 openpyxl完整代码

> 本文用 Python openpyxl 在 Excel 里自动插入折线图,含完整可运行代码,适合周报、实验报告等场景。

场景说明

每周五下午,你都要对着销售数据手动拖拽生成折线图:选中 A 列日期、B 列销售额,插入图表,调整标题颜色,保存。这一套操作 10 分钟打底,还容易点错数据范围。更扎心的是,下周数据变了,又得重来一遍。

用 openpyxl 写个脚本,30 行代码自动搞定:读取数据 → 创建折线图 → 设置样式 → 保存文件。跑一次 3 秒,以后每周更新数据源,双击运行就出图。

完整脚本

python 复制代码
# -*- coding: utf-8 -*-

# 依赖安装:pip install openpyxl

import openpyxl
from openpyxl.chart import LineChart, Reference
from openpyxl.chart.label import DataLabelList
from openpyxl.styles import Font, Color
from openpyxl.utils import get_column_letter
import random
from datetime import datetime, timedelta

# ---------- 1. 创建模拟数据(实际使用时替换成你的 Excel 文件)----------
def create_sample_data():
    """生成一份模拟的销售周报数据(7天)"""
    wb = openpyxl.Workbook()
    ws = wb.active
    ws.title = "销售数据"
    
    

# 标题行
    ws['A1'] = '日期'
    ws['B1'] = '销售额(元)'
    
    

# 生成最近7天数据
    base_date = datetime.now() - timedelta(days=7)
    for i in range(7):
        date_str = (base_date + timedelta(days=i)).strftime('%Y-%m-%d')
        ws.cell(row=i+2, column=1, value=date_str)
        ws.cell(row=i+2, column=2, value=random.randint(3000, 8000))
    
    return wb, ws

# ---------- 2. 核心:插入折线图 ----------
def insert_line_chart(ws, data_start_row=2, data_end_row=8):
    """
    在指定工作表插入折线图
    :param ws: openpyxl 工作表对象
    :param data_start_row: 数据起始行(含标题行下一行)
    :param data_end_row: 数据结束行
    """
    

# 创建折线图对象
    chart = LineChart()
    chart.title = "本周销售额趋势"
    chart.style = 10  

# 使用内置样式
    chart.y_axis.title = "销售额(元)"
    chart.x_axis.title = "日期"
    chart.width = 18  

# 图表宽度(英寸)
    chart.height = 10
    
    

# 引用数据区域(B列销售额)
    data = Reference(ws, min_col=2, min_row=1, max_row=data_end_row)
    

# 引用类别轴(A列日期)
    cats = Reference(ws, min_col=1, min_row=data_start_row, max_row=data_end_row)
    
    

# 添加数据系列
    chart.add_data(data, titles_from_data=True)
    chart.set_categories(cats)
    
    

# 设置系列样式
    s = chart.series[0]
    s.graphicalProperties.line.solidFill = "4F81BD"  

# 线条颜色
    s.graphicalProperties.line.width = 25000  

# 线条粗细(EMUs)
    
    

# 显示数据标签
    s.dLbls = DataLabelList()
    s.dLbls.showVal = True
    
    

# 添加图表到工作表(放在 E5 单元格位置)
    ws.add_chart(chart, "E5")

# ---------- 3. 主程序 ----------
def main():
    

# 创建或加载工作簿
    wb, ws = create_sample_data()
    
    

# 插入折线图
    insert_line_chart(ws, data_start_row=2, data_end_row=8)
    
    

# 保存文件
    output_path = "销售周报_自动折线图.xlsx"
    wb.save(output_path)
    print(f"✅ 图表已生成,文件保存在:{output_path}")
    
    

# 提示:实际使用时,替换 create_sample_data() 为你自己的数据加载逻辑

if __name__ == "__main__":
    main()

使用步骤

  1. 安装依赖

打开终端(Win+R → cmd),输入:

bash 复制代码
   pip install openpyxl
   
  1. 运行脚本

把上面的代码保存为 auto_chart.py,在终端执行:

bash 复制代码
   python auto_chart.py
   
  1. 查看结果

同目录下生成 销售周报_自动折线图.xlsx,打开就能看到折线图。

  1. 替换真实数据
  • 方法一:把 create_sample_data() 改成读取你自己的 Excel 文件:
python 复制代码
     wb = openpyxl.load_workbook("你的周报.xlsx")
     ws = wb.active  

# 或 ws = wb["Sheet1"]
     
  • 方法二:手动把数据粘贴进生成的模板文件,再运行脚本。

常见坑(排查清单)

| 问题 | 原因 | 解决 |

|------|------|------|

| 图表空白 | 数据区域引用错了 | 检查 min_rowmax_row 是否覆盖了数据行,确认标题行在第1行 |

| 日期显示为数字 | 日期列是文本格式 | 用 datetime 对象存储日期,或用 str 格式化 |

| 图表太大/太小 | width/height 参数不合适 | 调整 chart.widthchart.height(单位:英寸) |

| 颜色没变化 | 颜色代码写错 | 使用标准颜色名(如 "FF0000" 红色)或 RGB 十六进制 |

| 找不到 openpyxl | 没安装或虚拟环境错 | 运行 pip list 检查,确认在正确的 Python 环境里 |

调试小技巧 :在 insert_line_chart 函数开头加 print(data, cats) 打印引用范围,看是否与预期一致。

可改参数

  • 图表位置ws.add_chart(chart, "E5") 改成其他单元格,如 "A10"

  • 数据范围 :修改 data_start_rowdata_end_row,例如周报有30天数据就改成 data_end_row=31

  • 图表类型 :把 LineChart() 换成 BarChart()PieChart() 即可生成柱状图/饼图

  • 多系列 :添加第二个数据列(如C列"利润"),在 data 引用时包含更多列:

python 复制代码
  data = Reference(ws, min_col=2, max_col=3, min_row=1, max_row=data_end_row)
  
  • 标题字体 :修改 chart.title 后加字体设置:
python 复制代码
  chart.title = "本周销售额趋势"
  chart.title.font = Font(name='微软雅黑', size=14, bold=True, color='333333')
  

进阶推荐 :如果数据量很大(>1000行),建议先用 pandas 清洗数据再写入 openpyxl,配合 pandas.DataFrame.to_excel() 一步到位。想知道怎么把 pandas 和 openpyxl 结合做自动化周报?评论区告诉我你的具体场景,下期安排!