如何使用 Python 在 Excel 中创建图表
图表将原始电子表格数据转化为可视化洞察。Aspose.Cells FOSS for Python 让您能够以编程方式创建柱形图、折线图、条形图和饼图,全面控制数据系列、类别标签、图表标题和位置,无需 Microsoft Excel。
为什么使用 Aspose.Cells FOSS 创建图表?
- 无需 Excel: 完全在 Python 中构建图表,适用于任何操作系统。
- 每种类型一个方法的 API: 使用
add_bar()、add_line()、add_pie()、add_area()等——每种图表类型对应一个方法。 - 命名系列: 使用
name=、category_data=关键字参数配置每个系列。 - 精确定位: 通过单元格坐标(top_row、left_col、bottom_row、right_col)控制图表边界。
分步指南
步骤 1:安装 Aspose.Cells FOSS for Python
pip install aspose-cells-foss步骤 2:创建工作簿并填充数据
创建一个新的工作簿并将数值数据以及类别标签写入单元格:
from aspose.cells_foss import Workbook, Cell
workbook = Workbook()
ws = workbook.worksheets[0]
ws.name = "Sales Data"
##Category labels in column A (rows 2-5, leaving row 1 for a header)
ws.cells["A1"].value = "Quarter"
ws.cells["A2"].value = "Q1"
ws.cells["A3"].value = "Q2"
ws.cells["A4"].value = "Q3"
ws.cells["A5"].value = "Q4"
##Revenue series in column B
ws.cells["B1"].value = "Revenue"
ws.cells["B2"].value = 50000
ws.cells["B3"].value = 62000
ws.cells["B4"].value = 71000
ws.cells["B5"].value = 89000
##Expense series in column C
ws.cells["C1"].value = "Expenses"
ws.cells["C2"].value = 32000
ws.cells["C3"].value = 38000
ws.cells["C4"].value = 41000
ws.cells["C5"].value = 47000步骤 3:添加柱形图
使用 ws.charts.add_bar(top_row, left_col, bottom_row, right_col) 插入柱状图。该方法直接返回一个图表对象:
##Insert a column chart occupying rows 7-22, columns 0-7
chart = ws.charts.add_bar(6, 0, 22, 7)行和列索引是从零开始的。
步骤 4:配置数据系列
使用 chart.n_series.add() 并通过关键字参数添加每个数据系列:
##Add Revenue series
chart.n_series.add("B2:B5", category_data="A2:A5", name="Revenue")
##Add Expenses series
chart.n_series.add("C2:C5", category_data="A2:A5", name="Expenses")category_data 参数指定 x 轴标签的单元格范围。name 参数设置系列图例标签。
步骤 5:设置图表标题和类别数据
将图表标题设置为普通字符串:
chart.title = "Quarterly Sales vs Expenses"
chart.category_data = "A2:A5" # x-axis labels at chart level
chart.show_legend = True
chart.legend_position = "bottom"第6步:保存工作簿
workbook.save("sales_chart.xlsx")
print("Workbook with chart saved.")完整柱形图示例:
from aspose.cells_foss import Workbook, Cell
workbook = Workbook()
ws = workbook.worksheets[0]
##Data
labels = ["Q1", "Q2", "Q3", "Q4"]
revenue = [50000, 62000, 71000, 89000]
expenses = [32000, 38000, 41000, 47000]
ws.cells["A1"].value = "Quarter"
ws.cells["B1"].value = "Revenue"
ws.cells["C1"].value = "Expenses"
for i, (label, rev, exp) in enumerate(zip(labels, revenue, expenses), start=2):
ws.cells[f"A{i}"].value = label
ws.cells[f"B{i}"].value = rev
ws.cells[f"C{i}"].value = exp
chart = ws.charts.add_bar(6, 0, 22, 7)
chart.title = "Quarterly Sales vs Expenses"
chart.category_data = "A2:A5"
chart.n_series.add("B2:B5", category_data="A2:A5", name="Revenue")
chart.n_series.add("C2:C5", category_data="A2:A5", name="Expenses")
chart.show_legend = True
chart.legend_position = "bottom"
workbook.save("quarterly_chart.xlsx")步骤 7:创建折线图
相同的模式适用于 add_line():
from aspose.cells_foss import Workbook, Cell
workbook = Workbook()
ws = workbook.worksheets[0]
months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"]
revenue = [42000, 47500, 53000, 49000, 61000, 68000]
ws.cells["A1"].value = "Month"
ws.cells["B1"].value = "Revenue"
for i, (m, r) in enumerate(zip(months, revenue), start=2):
ws.cells[f"A{i}"].value = m
ws.cells[f"B{i}"].value = r
chart = ws.charts.add_line(8, 0, 24, 8)
chart.title = "Monthly Revenue Trend"
chart.category_data = "A2:A7"
chart.n_series.add("B2:B7", category_data="A2:A7", name="Revenue")
chart.show_legend = True
workbook.save("trend_chart.xlsx")常见问题及解决方案
1. 图表显示为空白或空的
Cause: 传递给 n_series.add() 的数据范围不包含值,或单元格范围字符串不正确。
Fix: 验证单元格范围与您的数据匹配。检查 ws.cells["B2"].value 不是 None。
2. 类别标签未显示在 x 轴上
Cause: chart.category_data 未设置,或范围指向空单元格。
Fix: 在 A 列包含标签字符串的地方设置 chart.category_data = "A2:A5"。
3. 图表位置与数据重叠
Cause: add_bar() 中的行边界与数据区域重叠。
Fix: 将图表放在数据下方:ws.charts.add_bar(data_last_row + 2, 0, data_last_row + 18, 7)。
4. AttributeError: 'ChartCollection' object has no attribute 'add'
原因: FOSS 库使用每种类型一个方法的 API,而不是 add(ChartType.COLUMN, ...)。
修复: 使用 ws.charts.add_bar(...)、ws.charts.add_line(...)、ws.charts.add_pie(...) 或 ws.charts.add_area(...)。
常见问题
哪些图表类型受支持?
使用 add_bar()、add_line()、add_pie()、add_area() 和 add_stock() 来处理最常用的类型。这五种类型具备完整的 XML 序列化支持。请查看 ChartCollection 类,以获取可用的 add_* 方法的完整列表。
我可以在现有的 Excel 文件中创建图表吗?
是的。使用 Workbook("existing.xlsx") 加载工作簿,访问目标工作表,并使用适当的 ws.charts.add_*() 方法添加图表。
我如何设置图表标题?
分配一个普通字符串:chart.title = "My Chart Title"。没有.text子属性:标题本身就是该字符串。
这种方法与 pandas 兼容吗?
是的。将 pandas DataFrame 的值写入循环中的单元格,然后在该数据范围上添加图表。
相关资源: