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()
使用步骤
- 安装依赖
打开终端(Win+R → cmd),输入:
bash
pip install openpyxl
- 运行脚本
把上面的代码保存为 auto_chart.py,在终端执行:
bash
python auto_chart.py
- 查看结果
同目录下生成 销售周报_自动折线图.xlsx,打开就能看到折线图。
- 替换真实数据
- 方法一:把
create_sample_data()改成读取你自己的 Excel 文件:
python
wb = openpyxl.load_workbook("你的周报.xlsx")
ws = wb.active
# 或 ws = wb["Sheet1"]
- 方法二:手动把数据粘贴进生成的模板文件,再运行脚本。
常见坑(排查清单)
| 问题 | 原因 | 解决 |
|------|------|------|
| 图表空白 | 数据区域引用错了 | 检查 min_row 和 max_row 是否覆盖了数据行,确认标题行在第1行 |
| 日期显示为数字 | 日期列是文本格式 | 用 datetime 对象存储日期,或用 str 格式化 |
| 图表太大/太小 | width/height 参数不合适 | 调整 chart.width 和 chart.height(单位:英寸) |
| 颜色没变化 | 颜色代码写错 | 使用标准颜色名(如 "FF0000" 红色)或 RGB 十六进制 |
| 找不到 openpyxl | 没安装或虚拟环境错 | 运行 pip list 检查,确认在正确的 Python 环境里 |
调试小技巧 :在 insert_line_chart 函数开头加 print(data, cats) 打印引用范围,看是否与预期一致。
可改参数
-
图表位置 :
ws.add_chart(chart, "E5")改成其他单元格,如"A10" -
数据范围 :修改
data_start_row和data_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 结合做自动化周报?评论区告诉我你的具体场景,下期安排!