Python使用xlsxwriter库创建Excel图表完整指南

周末不加班
周末不加班
发布时间:2026-10-12 | 4人浏览过
原创

本文详细介绍如何使用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自动化的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表