Python使用xlsxwriter库创建Excel图表完整指南
本文详细介绍如何使用Python的xlsxwriter库在Excel文件中生成各类图表。通过配置Series数据范围、设置坐标轴标题及样式,实现柱状图(含堆叠与百分比堆叠)和饼图的自动化创建。文章提供完整代码示例,涵盖数据写入、图表插入及偏移量设置,适用于周报统计等场景。
核心原理与准备工作
利用 xlsxwriter 库生成 Excel 图表的核心在于建立工作表数据与图表对象之间的引用关系。该库允许通过字符串引用(如 '=Sheet1!$B$2:$B$7')或列表索引(如 ['Sheet1', 1, 1, 6, 1])来指定图表的数据源。在开始编码前,需确保已安装 xlsxwriter 库,并理解 Excel 图表的基本构成要素:数据系列(Series)、坐标轴(Axis)以及图表样式(Style)。
基础图表创建流程
创建图表通常遵循“初始化工作簿 -> 写入数据 -> 定义图表类型 -> 配置系列 -> 插入图表”的步骤。以下代码展示了如何创建一个基础的柱状图,并详细解析关键配置项。
import xlsxwriter
# 1. 创建 Workbook 和 Worksheet
def create_basic_chart():
workbook = xlsxwriter.Workbook('chart_column.xlsx')
worksheet = workbook.add_worksheet()
# 定义表头和数据
headings = ['Number', 'Batch 1', 'Batch 2']
data = [
[2, 3, 4, 5, 6, 7],
[10, 40, 50, 20, 10, 50],
[30, 60, 70, 50, 40, 30],
]
# 写入数据到工作表
worksheet.write_row('A1', headings, workbook.add_format({'bold': True}))
worksheet.write_column('A2', data[0])
worksheet.write_column('B2', data[1])
worksheet.write_column('C2', data[2])
# 2. 创建图表对象,指定类型为 column
chart1 = workbook.add_chart({'type': 'column'})
# 3. 配置数据系列 (Series)
# 方法一:使用 Excel 公式字符串引用
chart1.add_series({
'name': '=Sheet1!$B$1',
'categories': '=Sheet1!$A$2:$A$7',
'values': '=Sheet1!$B$2:$B$7',
})
chart1.add_series({
'name': '=Sheet1!$C$1',
'categories': '=Sheet1!$A$2:$A$7',
'values': '=Sheet1!$C$2:$C$7',
})
# 方法二:使用列表索引(注释部分)
# chart1.add_series({
# 'name': ['Sheet1', 0, 1],
# 'categories': ['Sheet1', 1, 0, 6, 0],
# 'values': ['Sheet1', 1, 1, 6, 1],
# })
# 4. 设置图表标题和坐标轴标签
chart1.set_title({'name': 'Results of sample analysis'})
chart1.set_x_axis({'name': 'Test number'})
chart1.set_y_axis({'name': 'Sample length (mm)'})
# 5. 设置图表风格并插入到工作表
chart1.set_style(11)
worksheet.insert_chart('D2', chart1, {'x_offset': 25, 'y_offset': 10})
workbook.close()
高级图表类型:堆叠与百分比堆叠
除了基础柱状图,xlsxwriter 支持创建堆叠(Stacked)和百分比堆叠(Percent Stacked)图表。这两种类型通过 subtype 参数进行区分,适用于展示部分与整体的关系。
堆叠柱状图
堆叠图表将多个数据系列垂直堆叠,显示各部分对总值的贡献。配置方式与基础图表类似,仅需在初始化时指定 'subtype': 'stacked'。
def create_stacked_chart():
workbook = xlsxwriter.Workbook('chart_stacked.xlsx')
worksheet = workbook.add_worksheet()
# 写入相同的数据结构
headings = ['Number', 'Batch 1', 'Batch 2']
data = [
[2, 3, 4, 5, 6, 7],
[10, 40, 50, 20, 10, 50],
[30, 60, 70, 50, 40, 30],
]
worksheet.write_row('A1', headings, workbook.add_format({'bold': True}))
worksheet.write_column('A2', data[0])
worksheet.write_column('B2', data[1])
worksheet.write_column('C2', data[2])
# 创建堆叠图表
chart2 = workbook.add_chart({'type': 'column', 'subtype': 'stacked'})
# 配置系列(同上)
chart2.add_series({'name': '=Sheet1!$B$1', 'categories': '=Sheet1!$A$2:$A$7', 'values': '=Sheet1!$B$2:$B$7'})
chart2.add_series({'name': '=Sheet1!$C$1', 'categories': '=Sheet1!$A$2:$A$7', 'values': '=Sheet1!$C$2:$C$7'})
chart2.set_title({'name': 'Stacked Chart'})
chart2.set_x_axis({'name': 'Test number'})
chart2.set_y_axis({'name': 'Sample length (mm)'})
chart2.set_style(12)
# 插入图表,注意位置偏移以避免重叠
worksheet.insert_chart('D18', chart2, {'x_offset': 25, 'y_offset': 10})
workbook.close()
百分比堆叠柱状图
百分比堆叠图表将每个柱子的总值标准化为 100%,便于比较不同类别中各部分的比例分布。初始化时指定 'subtype': 'percent_stacked' 即可。
def create_percent_stacked_chart():
workbook = xlsxwriter.Workbook('chart_percent_stacked.xlsx')
worksheet = workbook.add_worksheet()
# 写入数据
headings = ['Number', 'Batch 1', 'Batch 2']
data = [
[2, 3, 4, 5, 6, 7],
[10, 40, 50, 20, 10, 50],
[30, 60, 70, 50, 40, 30],
]
worksheet.write_row('A1', headings, workbook.add_format({'bold': True}))
worksheet.write_column('A2', data[0])
worksheet.write_column('B2', data[1])
worksheet.write_column('C2', data[2])
# 创建百分比堆叠图表
chart3 = workbook.add_chart({'type': 'column', 'subtype': 'percent_stacked'})
# 配置系列
chart3.add_series({'name': '=Sheet1!$B$1', 'categories': '=Sheet1!$A$2:$A$7', 'values': '=Sheet1!$B$2:$B$7'})
chart3.add_series({'name': '=Sheet1!$C$1', 'categories': '=Sheet1!$A$2:$A$7', 'values': '=Sheet1!$C$2:$C$7'})
chart3.set_title({'name': 'Percent Stacked Chart'})
chart3.set_x_axis({'name': 'Test number'})
chart3.set_y_axis({'name': 'Sample length (mm)'})
chart3.set_style(13)
worksheet.insert_chart('D34', chart3, {'x_offset': 25, 'y_offset': 10})
workbook.close()
饼图创建与自定义样式
饼图适用于展示分类数据的占比情况。xlsxwriter 允许通过 points 参数为饼图的每个扇区设置独立的填充颜色,从而实现高度自定义的视觉效果。
def create_pie_chart():
workbook = xlsxwriter.Workbook('chart_pie.xlsx')
worksheet = workbook.add_worksheet()
# 定义饼图数据
data = [
['Pass', 'Fail', 'Warn', 'NT'],
[333, 11, 12, 22],
]
# 写入数据
worksheet.write_row('A51', data[0], workbook.add_format({'bold': True}))
worksheet.write_row('A52', data[1])
# 创建饼图
chart4 = workbook.add_chart({'type': 'pie'})
# 配置系列,并自定义每个点的颜色
chart4.add_series({
'name': '接口测试报表图',
'categories': '=Sheet1!$A$51:$D$51',
'values': '=Sheet1!$A$52:$D$52',
'points': [
{'fill': {'color': '#00CD00'}}, # Pass: Green
{'fill': {'color': 'red'}}, # Fail: Red
{'fill': {'color': 'yellow'}}, # Warn: Yellow
{'fill': {'color': 'gray'}}, # NT: Gray
],
})
chart4.set_title({'name': '接口测试统计'})
chart4.set_style(3)
# 插入图表
worksheet.insert_chart('E52', chart4, {'x_offset': 25, 'y_offset': 10})
workbook.close()
综合应用示例
在实际应用中,通常需要将多种图表整合到一个 Excel 文件中。以下是一个完整的综合示例,演示了如何在一个工作簿中创建并插入上述所有类型的图表。
def demo_all_charts():
import xlsxwriter
# 创建 Workbook
workbook = xlsxwriter.Workbook('demo.xlsx')
worksheet = workbook.add_worksheet('Test')
# 设置列宽
worksheet.set_column('A:A', len('hello ')+1)
# 定义通用格式
bold = workbook.add_format({'bold': True})
# --- 基础柱状图数据 ---
headings = ['Number', 'Batch 1', 'Batch 2']
data = [
[2, 3, 4, 5, 6, 7],
[10, 40, 50, 20, 10, 50],
[30, 60, 70, 50, 40, 30],
]
worksheet.write_row('A1', headings, bold)
worksheet.write_column('A2', data[0])
worksheet.write_column('B2', data[1])
worksheet.write_column('C2', data[2])
# 1. 基础柱状图
chart1 = workbook.add_chart({'type': 'column'})
chart1.add_series({'name': '=Sheet1!$B$1', 'categories': '=Sheet1!$A$2:$A$7', 'values': '=Sheet1!$B$2:$B$7'})
chart1.add_series({'name': '=Sheet1!$C$1', 'categories': '=Sheet1!$A$2:$A$7', 'values': '=Sheet1!$C$2:$C$7'})
chart1.set_title({'name': 'Results of sample analysis'})
chart1.set_x_axis({'name': 'Test number'})
chart1.set_y_axis({'name': 'Sample length (mm)'})
chart1.set_style(11)
worksheet.insert_chart('D2', chart1, {'x_offset': 25, 'y_offset': 10})
# --- 堆叠柱状图数据(复用上述数据) ---
chart2 = workbook.add_chart({'type': 'column', 'subtype': 'stacked'})
chart2.add_series({'name': '=Sheet1!$B$1', 'categories': '=Sheet1!$A$2:$A$7', 'values': '=Sheet1!$B$2:$B$7'})
chart2.add_series({'name': '=Sheet1!$C$1', 'categories': '=Sheet1!$A$2:$A$7', 'values': '=Sheet1!$C$2:$C$7'})
chart2.set_title({'name': 'Stacked Chart'})
chart2.set_x_axis({'name': 'Test number'})
chart2.set_y_axis({'name': 'Sample length (mm)'})
chart2.set_style(12)
worksheet.insert_chart('D18', chart2, {'x_offset': 25, 'y_offset': 10})
# --- 百分比堆叠柱状图 ---
chart3 = workbook.add_chart({'type': 'column', 'subtype': 'percent_stacked'})
chart3.add_series({'name': '=Sheet1!$B$1', 'categories': '=Sheet1!$A$2:$A$7', 'values': '=Sheet1!$B$2:$B$7'})
chart3.add_series({'name': '=Sheet1!$C$1', 'categories': '=Sheet1!$A$2:$A$7', 'values': '=Sheet1!$C$2:$C$7'})
chart3.set_title({'name': 'Percent Stacked Chart'})
chart3.set_x_axis({'name': 'Test number'})
chart3.set_y_axis({'name': 'Sample length (mm)'})
chart3.set_style(13)
worksheet.insert_chart('D34', chart3, {'x_offset': 25, 'y_offset': 10})
# --- 饼图数据 ---
pie_data = [
['Pass', 'Fail', 'Warn', 'NT'],
[333, 11, 12, 22],
]
worksheet.write_row('A51', pie_data[0], bold)
worksheet.write_row('A52', pie_data[1])
chart4 = workbook.add_chart({'type': 'pie'})
chart4.add_series({
'name': '接口测试报表图',
'categories': '=Sheet1!$A$51:$D$51',
'values': '=Sheet1!$A$52:$D$52',
'points': [
{'fill': {'color': '#00CD00'}},
{'fill': {'color': 'red'}},
{'fill': {'color': 'yellow'}},
{'fill': {'color': 'gray'}},
],
})
chart4.set_title({'name': '接口测试统计'})
chart4.set_style(3)
worksheet.insert_chart('E52', chart4, {'x_offset': 25, 'y_offset': 10})
workbook.close()
print('finished...')
if __name__ == '__main__':
demo_all_charts()关键配置说明
- 数据引用方式:推荐使用字符串引用(如
'=Sheet1!$B$2:$B$7'),因为它更直观且不易出错。列表索引方式(如['Sheet1', 1, 1, 6, 1])需要严格对应[sheetname, first_row, first_col, last_row, last_col],适用于动态生成图表的场景。 - 图表样式:通过
set_style(n)可以应用 Excel 内置的预设样式,不同数字对应不同的视觉效果。建议根据图表类型选择合适的样式编号。 - 插入位置与偏移:
insert_chart方法的第三个参数{'x_offset': 25, 'y_offset': 10}用于设置图表左上角相对于指定单元格(如'D2')的像素偏移量,有助于精确控制图表在页面上的布局。 - 饼图颜色自定义:通过
points参数可以为饼图的每个扇区指定填充颜色,适用于需要强调特定分类(如通过颜色区分状态)的场景。
以上就是使用Python xlsxwriter库创建Excel图表的详细内容,更多关于Python数据处理与Excel自动化的资料请关注本站其它相关文章!本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













