【高性能利器】XlsxWriter完全指南:15个专业技巧打造企业级Excel自动化工作流

【高性能利器】XlsxWriter完全指南:15个专业技巧打造企业级Excel自动化工作流

1. XlsxWriter基础入门

1.1 安装与环境配置

使用pip安装XlsxWriter非常简单:

# 安装XlsxWriter
pip install xlsxwriter

基本导入:

import xlsxwriter

1.2 创建第一个工作簿

def create_basic_workbook():
    """创建一个基本的Excel工作簿"""
    # 创建一个新的Excel文件
    workbook = xlsxwriter.Workbook('hello_world.xlsx')
    
    # 添加一个工作表
    worksheet = workbook.add_worksheet('第一张表')
    
    # 写入一些数据
    worksheet.write('A1', 'Hello')
    worksheet.write('B1', 'World')
    
    # 使用行列坐标写入数据(从0开始计数)
    worksheet.write(1, 0, '这是第二行第一列')
    worksheet.write(1, 1, '这是第二行第二列')
    
    # 写入数字
    worksheet.write(2, 0, 123)
    worksheet.write(2, 1, 456.789)
    
    # 关闭并保存工作簿
    workbook.close()
    
    print("Excel文件已创建:hello_world.xlsx")

# 调用函数
create_basic_workbook()

1.3 写入数据的多种方式

def data_writing_examples():
    """演示XlsxWriter多种写入数据的方法"""
    # 创建一个新的Excel文件
    workbook = xlsxwriter.Workbook('data_writing.xlsx')
    worksheet = workbook.add_worksheet()
    
    # 1. 单个单元格写入
    worksheet.write(0, 0, '单个写入')
    
    # 2. 使用行列方法
    worksheet.write_string(1, 0, '字符串')  # 明确指定为字符串
    worksheet.write_number(1, 1, 123.45)   # 明确指定为数字
    worksheet.write_formula(1, 2, '=B2*2') # 写入公式
    worksheet.write_boolean(1, 3, True)    # 写入布尔值
    worksheet.write_url(1, 4, 'https://www.example.com', string='示例链接') # 写入链接
    
    # 3. 写入空单元格但应用格式
    blank_format = workbook.add_format({
   'bg_color': '#FFFF00'})
    worksheet.write_blank(2, 0, None, blank_format)
    
    # 4. 写入日期和时间
    date_format = workbook.add_format({
   'num_format': 'yyyy-mm-dd'})
    worksheet.write_datetime(2, 1, datetime.datetime(2023, 1, 1), date_format)
    
    # 5. 使用write_row方法一次写入一行数据
    worksheet.write_row(3, 0, ['行数据1', '行数据2', '行数据3'])
    
    # 6. 使用write_column方法一次写入一列数据
    worksheet.write_column(0, 5, ['列数据1', '列数据2', '列数据3'])
    
    # 7. 使用更底层的方法写入多个单元格
    worksheet.add_write_handler(float, lambda worksheet, row, col, number, format: 
                               worksheet.write_number(row, col, number + 1, format))

    # 现在所有浮点数都会+1后写入
    worksheet.write(5, 0, 10.5)  # 实际写入11.5
    
    # 8. 写入富文本(混合格式文本)
    bold = workbook.add_format({
   'bold': True})
    italic = workbook.add_format({
   'italic': True})
    red = workbook.add_format({
   'color': 'red'})
    
    worksheet.write_rich_string(6, 0, 
                               '这段文本包含', bold, '粗体', '、', 
                               italic, '斜体', '和', 
                               red, '红色', '文本')
    
    # 关闭并保存工作簿
    workbook.close()
    
    print("Excel文件已创建:data_writing.xlsx")

# 导入所需库
import datetime

# 调用函数
data_writing_examples()

2. 格式与样式设置

2.1 单元格格式设置

def cell_formatting_examples():
    """演示XlsxWriter的单元格格式设置"""
    # 创建一个新的Excel文件
    workbook = xlsxwriter.Workbook('cell_formatting.xlsx')
    worksheet = workbook.add_worksheet()
    
    # 为标题行添加格式
    title_format = workbook.add_format({
   
        'bold': True,                 # 粗体
        'font_color': 'white',        # 字体颜色
        'bg_color': '#4F81BD',        # 背景颜色
        'font_size': 12,              # 字体大小
        'align': 'center',            # 水平居中
        'valign': 'vcenter',          # 垂直居中
        'border': 1,                  # 边框
        'text_wrap': True             # 文本自动换行
    })
    
    # 为数据单元格添加格式
    data_format = workbook.add_format({
   
        'font_name': 'Arial',         # 字体名称
        'font_size': 10,              # 字体大小
        'align': 'left',              # 左对齐
        'valign': 'vcenter',          # 垂直居中
        'border': 1,                  # 边框
        'border_color': '#D9D9D9'     # 边框颜色
    })
    
    # 为数字添加格式
    number_format = workbook.add_format({
   
        'num_format': '#,##0.00',     # 数字格式(带千位分隔符和两位小数)
        'align': 'right',             # 右对齐
        'border': 1                   # 边框
    })
    
    # 为货币添加格式
    currency_format = workbook.add_format({
   
        'num_format': '"¥"#,##0.00',  # 货币格式
        'align': 'right',             # 右对齐
        'border': 1,                  # 边框
        'font_color': 'green'         # 字体颜色
    })
    
    # 为百分比添加格式
    percent_format = workbook.add_format({
   
        'num_format': '0.00%',        # 百分比格式
        'align': 'right',             # 右对齐
        'border': 1                   # 边框
    })
    
    # 添加日期格式
    date_format = workbook.add_format({
   
        'num_format': 'yyyy-mm-dd',   # 日期格式
        'align': 'center',            # 居中对齐
        'border': 1                   # 边框
    })
    
    # 添加条件格式(高于平均值的单元格显示为浅绿色)
    above_average_format = workbook.add_format({
   
        'bg_color': '#C6EFCE',        # 背景颜色
        'font_color': '#006100',      # 字体颜色
        'border': 1                   # 边框
    })
    
    # 写入标题行
    headers = ['产品名称', '单价', '销售数量', '销售额', '毛利率', '销售日期']
    worksheet.write_row(0, 0, headers, title_format)
    
    # 调整行高
    worksheet.set_row(0, 20)  # 设置第一行高度为20
    
    # 调整列宽
    worksheet.set_column('A:A', 20)  # 设置A列宽度为20
    worksheet.set_column('B:B', 10)  # 设置B列宽度为10
    worksheet.set_column('C:C', 12)  # 设置C列宽度为12
    worksheet.set_column('D:D', 15)  # 设置D列宽度为15
    worksheet.set_column('E:E', 10)  # 设置E列宽度为10
    worksheet.set_column('F:F', 15)  # 设置F列宽度为15
    
    # 写入示例数据
    data = [
        ['笔记本电脑', 5999.00, 10, '=B2*C2', '=D2/B2*0.3', datetime.datetime(2023, 1, 15)],
        ['智能手机', 3999.00, 25, '=B3*C3', '=D3/B3*0.4', datetime.datetime(2023, 1, 20)],
        ['平板电脑', 2999.00, 15, '=B4*C4', '=D4/B4*0.35', datetime.datetime(2023, 1, 25)],
        ['智能手表', 1999.00, 20, '=B5*C5', '=D5/B5*0.45', datetime.datetime(2023, 1, 30)],
        ['无线耳机', 999.00, 30, '=B6*C6', '=D6/B6*0.5', datetime.datetime(2023, 2, 5)]
    ]
    
    # 写入数据并应用格式
    for row_num, row_data in enumerate(data):
        worksheet.write(row_num + 1, 0, row_data[0], data_format)         # 产品名称
        worksheet.write(row_num + 1, 1, row_data[1], number_format)       # 单价
        worksheet.write(row_num + 1, 2, row_data[2], data_format)         # 销售数量
        worksheet.write_formula(row_num + 1, 3, row_data[3], currency_format)  # 销售额
        worksheet.write_formula(row_num + 1, 4, row_data[4], percent_format)   # 毛利率
        worksheet.write(row_num + 1, 5, row_data[5], date_format)         # 销售日期
    
    # 应用条件格式:突出显示高于平均销售额的产品
    worksheet.conditional_format('D2:D6', {
   
        'type': 'average',
        'criteria': 'above',
        'format': above_average_format
    })
    
    # 关闭并保存工作簿
    workbook.close()
    
    print("Excel文件已创建:cell_formatting.xlsx")

# 调用函数
cell_formatting_examples()

2.2 创建自定义格式

def custom_formats_example():
    """演示如何创建和使用自定义格式"""
    # 创建一个新的Excel文件
    workbook = xlsxwriter.Workbook('custom_formats.xlsx')
    worksheet = workbook.add_worksheet()
    
    # 写入标题行
    worksheet.write('A1', '自定义格式示例')
    
    # 1. 创建渐变填充格式
    gradient_format = workbook.add_format({
   
        'gradient': {
   'colors': ['#FFFFFF', '#3366FF'], 'type': 'linear', 'direction': 3},
        'border': 1,
        'align': 'center',
        'valign': 'vcenter'
    })
    
    # 2. 创建双边框格式
    double_border_format = workbook.add_format({
   
        'border': 2,
        'border_color': 'red',
        'align': 'center'
    })
    
    # 3. 创建斜线填充格式
    pattern_format = workbook.add_format({
   
        'pattern': 1,  # 轻细斜线填充
        'bg_color': '#C0C0C0',
        'fg_color': '#FF0000',
        'border': 1
    })
    
    # 4. 创建自定义数字格式
    custom_number_format = workbook.add_format({
   
        'num_format': '[Blue]#,##0.00;[Red]-#,##0.00',  # 正数蓝色,负数红色
        'border': 1
    })
    
    # 5. 创建旋转文本格式
    rotated_text_format = workbook.add_format({
   
        'rotation': 45,  # 文本旋转45度
        'border': 1,
        'align': 'center',
        'valign': 'vcenter'
    })
    
    # 6. 创建缩进文本格式
    indent_format = workbook.add_format({
   
        'indent': 2,  # 缩进2级
        'border': 1
    })
    
    # 7. 创建带有图案填充的格式
    checker_format = workbook.add_format({
   
        'pattern': 2,  # 棋盘格图案
        'bg_color': '#FFFF00',
        'fg_color': '#FF0000',
        'border': 1
    })
    
    # 8. 创建自定义文本格式(显示银行账号)
    account_format = workbook.add_format({
   
        'num_format': '0000-0000-0000-0000',
        'align': 'center',
        'border': 1
    })
    
    # 应用格式到单元格
    worksheet.write('A3', '渐变填充', gradient_format)
    worksheet.write('A4', '双边框', double_border_format)
    worksheet.write('A5', '斜线填充', pattern_format)
    worksheet.write('A6', 1234.56, custom_number_format)
    worksheet.write('A7', -1234.56, custom_number_format)
    worksheet.write('A8', '旋转文本', rotated_text_format)
    worksheet.write('A9', '缩进文本', indent_format)
    worksheet.write('A10', '棋盘格图案', checker_format)
    worksheet.write('A11', 1234567812345678, account_format)
    
    # 调整列宽
    worksheet.set_column('A:A', 25)
    
    # 调整行高
    for row in range(3, 12):
        worksheet.set_row(row, 30)
    
    # 关闭并保存工作簿
    workbook.close()
    
    print("Excel文件已创建:custom_formats.xlsx")

# 调用函数
custom_formats_example()

2.3 合并单元格与对齐

def merge_and_align_example():
    """演示单元格合并与对齐的高级应用"""
    # 创建一个新的Excel文件
    workbook = xlsxwriter.Workbook('merge_and_align.xlsx')
    worksheet = workbook.add_worksheet()
    
    # 1. 标题合并与格式设置
    title_format = workbook.add_format({
   
        'bold': True,
        'font_size': 16,
        'align': 'center',
        'valign': 'vcenter',
        'border': 2,
        'bg_color': '#4472C4',
        'font_color': 'white'
    })
    
    # 合并A1:E1单元格并添加标题
    worksheet.merge_range('A1:E1', '季度销售报表', title_format)
    
    # 2. 子标题合并与格式设置
    subtitle_format = workbook.add_format({
   
        'bold': True,
        'font_size': 12,
        'align': 'center',
        'valign': 'vcenter',
        'bg_color': '#D9E1F2',
        'border': 1
    })
    
    # 合并A2:E2单元格并添加子标题
    worksheet.merge_range('A2:E2', '2023年第一季度', subtitle_format)
    
    # 3. 创建分类标题格式
    header_format = workbook.add_format({
   
        'bold': True,
        'align': 'center',
        'valign': 'vcenter',
        'bg_color': '#D9D9D9',
        'border': 1
    })
    
    # 列标题
    column_headers = ['产品类别', '1月', '2月', '3月', '季度总计']
    for col, header in enumerate(column_headers):
        worksheet.write(3, col, header, header_format)
    
    # 4. 合并同类产品单元格,创建分组效果
    category_format = workbook.add_format({
   
        'align': 'left',
        'valign': 'vcenter',
        'bg_color': '#F2F2F2',
        'border': 1
    })
    
    # 合并类别单元格
    worksheet.merge_range('A5:A7', '电子产品', category_format)
    worksheet.merge_range('A9:A11', '办公用品', category_format)
    worksheet.merge_range('A13:A15', '家居产品', category_format)
    
    # 5. 数据单元格格式
    data_format = workbook.add_format({
   
        'num_format': '#,##0',
        'align': 'right',
        'border': 1
    })
    
    # 合计单元格格式
    total_format = workbook.add_format({
   
        'num_format': '#,##0',
        'align': 'right',
        'border': 1,
        'bold': True,
        'bg_color': '#E2EFDA'
    })
    
    # 6. 添加示例数据
    data = [
        # 电子产品
        ['笔记本电脑', 45000, 52000, 48000],
        ['智能手机', 36000, 42000, 38000],
        ['平板电脑', 22000, 25000, 24000],
        # 办公用品
        ['打印机', 18000, 16500, 19000],
        ['办公桌椅', 12000, 13500, 15000],
        ['文具套装', 8500, 9200, 8800],
        # 家居产品
        ['沙发', 35000, 28000, 32000],
        ['床垫', 24000, 26000, 27000],
        ['厨具套装', 19500, 21000, 20500]
    ]
    
    # 写入产品数据
    product_rows = [5, 6, 7, 9, 10, 11, 13, 14, 15]
    
    for i, row_num in enumerate(product_rows):
        worksheet.write(row_num, 1, data[i][0], workbook.add_format({
   'border': 1}))  # 产品名称
        
        # 写入月度销售数据
        for col in range(1, 4):
            worksheet.write(row_num, col + 1, data[i][col], data_format)
        
        # 计算季度总计
        worksheet.write_formula(row_num, 4, f'=SUM(C{
     row_num+1}:E{
     row_num+1})', total_format)
    
    # 7. 添加类别小计
    subtotal_format = workbook.add_format({
   
        'bold': True,
        'num_format': '#,##0',
        'align': 'right',
        'border': 1,
        'bg_color': '#D9E1F2'
    })
    
    # 电子产品小计
    worksheet.merge_range('A8:B8', '电子产品小计', subtotal_format)
    worksheet.write_formula(7, 2, '=SUM(C5:C7)', subtotal_format)  # 1月
    worksheet.write_formula(7, 3, '=SUM(D5:D7)', subtotal_format)  # 2月
    worksheet.write_formula(7, 4, '=SUM(E5:E7)', subtotal_format)  # 3月
    worksheet.write_formula(7, 4, '=SUM(F5:F7)', subtotal_format)  # 季度总计
    
    # 办公用品小计
    worksheet.merge_range('A12:B12', '办公用品小计', subtotal_format)
    worksheet.write_formula(11, 2, '=SUM(C9:C11)', subtotal_format)  # 1月
    worksheet.write_formula(11, 3, '=SUM(D9:D11)', subtotal_format)  # 2月
    worksheet.write_formula(11, 4, '=SUM(E9:E11)', subtotal_format)  # 3月
    worksheet.write_formula(11, 4, '=SUM(F9:F11)', subtotal_format)  # 季度总计
    
    # 家居产品小计
    worksheet.merge_range('A16:B16', '家居产品小计', subtotal_format)
    worksheet.write_formula(15, 2, '=SUM(C13:C15)', subtotal_format)  # 1月
    worksheet.write_formula(15, 3, '=SUM(D13:D15)', subtotal_format)  # 2月
    worksheet.write_formula(15, 4, '=SUM(E13:E15)', subtotal_format)  # 3月
    worksheet.write_formula(15, 4, '=SUM(F13:F15)', subtotal_format)  # 季度总计
    
    # 8. 添加总计行
    grand_total_format = workbook.add_format({
   
        'bold': True,
        'font_size': 12,
        'num_format': '#,##0',
        'align': 'right',
        'border': 2,
        'bg_color': '#8EA9DB',
        'font_color': 'white'
    })
    
    # 合计行
    worksheet.merge_range('A18:B18', '总计', grand_total_format)
    worksheet.write_formula(17, 2, '=SUM(C8,C12,C16)', grand_total_format)  # 1月
    worksheet.write_formula(17, 3, '=SUM(D8,D12,D16)', grand_total_format)  # 2月
    worksheet.write_formula(17, 4, '=SUM(E8,E12,E16)', grand_total_format)  # 3月
    worksheet.write_formula(17, 4, '=SUM(F8,F12,F16)', grand_total_format)  # 季度总计
    
    # 调整列宽
    worksheet.set_column('A:A', 15)
    worksheet.set_column('B:B', 20)
    worksheet.set_column('C:F', 12)
    
    # 调整行高
    worksheet.set_row(0, 30)  # 标题行
    worksheet.set_row(1, 25)  # 子标题行
    worksheet.set_row(17, 25)  # 合计行
    
    # 关闭并保存工作簿
    workbook.close()
    
    print("Excel文件已创建:merge_and_align.xlsx")

# 调用函数
merge_and_align_example()

3. 图表与数据可视化

3.1 基本图表创建

def basic_charts_example():
    """创建各种基本图表"""
    # 创建一个新的Excel文件
    workbook = xlsxwriter.Workbook('basic_charts.xlsx')
    worksheet = workbook.add_worksheet()
    
    # 添加标题
    bold = workbook.add_format({
   'bold': True})
    worksheet.write('A1', '季度销售数据', bold)
    
    # 添加数据
    headings = ['季度', '北区', '南区', '东区', '西区']
    data = [
        ['Q1', 8000, 7000, 6000, 9000],
        ['Q2', 9500, 8500, 7500, 8500],
        ['Q3', 10000, 9500, 8000, 9800],
        ['Q4', 12000, 11000, 9500, 11500],
    ]
    
    worksheet.write_row('A3', headings, bold)
    
    for row_num, row_data in enumerate(data):
        worksheet.write_row(row_num + 3, 0, row_data)
    
    # 1. 创建柱状图
    column_chart = workbook.add_chart({
   'type': 'column'})
    
    # 配置数据系列
    for col_num in range(1, 5):
        column_chart.add_series({
   
            'name':       ['Sheet1', 2, col_num],
            'categories': ['Sheet1', 3, 0, 6, 0],
            'values':     ['Sheet1', 3, col_num, 6, col_num],
        })
    
    # 设置图表标题和坐标轴标题
    column_chart.set_title({
   'name': '季度销售数据 - 柱状图'})
    column_chart.set_x_axis({
   'name': '季度'})
    column_chart.set_y_axis({
   'name': '销售额'})
    
    # 设置图表样式
    column_chart.set_style(11)
    
    # 插入图表到工作表
    worksheet.insert_chart('A10', column_chart, {
   'x_offset': 25, 'y_offset': 10})
    
    # 2. 创建折线图
    line_chart = workbook.add_chart({
   'type': 'line'})
    
    # 配置数据系列
    for col_num in range(1, 5):
        line_chart.add_series({
   
            'name':       ['Sheet1', 2, col_num],
            'categories': ['Sheet1', 3, 0, 6, 0],
            'values':     ['Sheet1', 3, col_num, 6, col_num],
            'marker':     {
   'type': 'automatic'},  # 添加数据点标记
            'data_labels': {
   'value': True},       # 显示数据标签
        })
    
    # 设置图表标题和坐标轴标题
    line_chart.set_title({
   'name': '季度销售数据 - 折线图'})
    line_chart.set_x_axis({
   'name': '季度'})
    line_chart.set_y_axis({
   'name': '销售额'})
    
    # 设置图表样式
    line_chart.set_style(12)
    
    # 插入图表到工作表
    worksheet.insert_chart('I10', line_chart, {
   'x_offset': 25, 'y_offset': 10})
    
    # 3. 创建饼图
    pie_chart = workbook.add_chart({
   'type': 'pie'})
    
    # 配置数据系列 - 仅使用第四季度的数据
    pie_chart.add_series({
   
        'name':       '第四季度',
        'categories': ['Sheet1', 2, 1, 2, 4],
        'values':     ['Sheet1', 6, 1, 6, 4],
        'data_labels': {
   'percentage': True},  # 显示百分比
    })
    
    # 设置图表标题
    pie_chart.set_title({
   'name': '第四季度各区域销售比例'})
    
    # 设置图表样式
    pie_chart.set_style(10)
    
    # 插入图表到工作表
    worksheet.insert_chart('A27', pie_chart, {
   'x_offset': 25, 'y_offset': 10})
    
    # 4. 创建面积图
    area_chart = workbook.add_chart({
   'type': 'area'})
    
    # 配置数据系列
    for col_num in range(1, 5):
        area_chart.add_series({
   
            'name':       ['Sheet1', 2, col_num],
            'categories': ['Sheet1', 3, 0, 6, 0],
            'values':     ['Sheet1', 3, col_num, 6, col_num],
        })
    
    # 设置图表标题和坐标轴标题
    area_chart.set_title({
   'name': '季度销售数据 - 面积图'})
    area_chart.set_x_axis({
   'name': '季度'})
    area_chart.set_y_axis({
   'name': '销售额'})
    
    # 设置图表样式
    area_chart.set_style(13)
    
    # 插入图表到工作表
    worksheet.insert_chart('I27', area_chart, {
   'x_offset': 25, 'y_offset': 10})
    
    # 关闭并保存工作簿
    workbook.close()
    
    print("Excel文件已创建:basic_charts.xlsx")

# 调用函数
basic_charts_example()

3.2 高级图表定制

def advanced_charts_example():
    """创建高级定制图表"""
    # 创建一个新的Excel文件
    workbook = xlsxwriter.Workbook('advanced_charts.xlsx')
    worksheet = workbook.add_worksheet()
    
    # 添加标题
    bold = workbook.add_format({
   'bold': True})
    worksheet.write('A1', '月度销售与利润分析', bold)
    
    # 添加数据
    months = ['一月', '二月', '三月', '四月', '五月', '六月']
    sales_data = [8500, 9200, 9800, 8800, 10500, 11200]
    profit_data = [2300, 2500, 2800, 2400, 3100, 3400]
    profit_margin = [0.27, 0.27, 0.29, 0.27, 0.30, 0.30]
    
    # 写入数据
    worksheet.write_column('A4', ['月份'] + months)
    worksheet.write_column('B4', ['销售额'] + sales_data)
    worksheet.write_column('C4', ['利润'] + profit_data)
    worksheet.write_column('D4', ['利润率'] + profit_margin)
    
    # 1. 创建组合图表(柱状图+折线图)
    combo_chart = workbook.add_chart({
   'type': 'column'})
    
    # 添加销售额柱状图系列
    combo_chart.add_series({
   
        'name':       '销售额',
        'categories': ['Sheet1', 4, 0, 9, 0],
        'values':     ['Sheet1', 4, 1, 9, 1],
        'data_labels': {
   'value': True},
        'gap':        50,  # 设置柱子之间的间隙
    })
    
    # 添加利润柱状图系列
    combo_chart.add_series({
   
        'name':       '利润',
        'categories': ['Sheet1', 4, 0, 9, 0],
        'values':     ['Sheet1', 4, 2, 9, 2],
        'data_labels': {
   'value': True},
        'gap':        50,
        'overlap':    -10,  # 负值使柱子并排显示
    })
    
    # 添加利润率折线图系列(使用第二个Y轴)
    line_series = {
   
        'name':       '利润率',
        'categories': ['Sheet1', 4, 0, 9, 0],
        'values':     ['Sheet1', 4, 3, 9, 3],
        'marker':     {
   'type': 'diamond', 'size': 7},
        'line':       {
   'width': 2},
        'data_labels': {
   'value': True, 'num_format': '0.0%'},
        'y2_axis':    True,  # 使用第二个Y轴
    }
    
    # 创建第二个Y轴
    combo_chart.set_y2_axis({
   
        'name': '利润率',
        'num_format': '0%',
    })
    
    # 添加折线图系列
    combo_chart.add_series(line_series)
    
    # 设置图表标题和坐标轴标题
    combo_chart.set_title({
   
        'name': '销售额、利润和利润率分析',
        'name_font': {
   'size': 14, 'bold': True},
    })
    
    combo_chart.set_x_axis({
   
        'name': '月份',
        'name_font': {
   'bold': True},
        'num_font': {
   'italic': True},
    })
    
    combo_chart.set_y_axis({
   
        'name': '金额',
        'name_font': {
   'bold': True},
        'num_format': '#,##0',
        'major_gridlines': {
   'visible': True, 'line': {
   'width': 0.5, 'dash_type': 'dash'}},
    })
    
    # 设置图表图例
    combo_chart.set_legend({
   
        'position': 'bottom',
        'font': {
   'bold': True},
    })
    
    # 设置图表大小
    combo_chart.set_size({
   'width': 720, 'height': 400})
    
    # 设置绘图区边框
    combo_chart.set_plotarea({
   
        'border': {
   'color': 'black', 'width': 1.25},
        'fill': {
   'color': '#F2F2F2'},
    })
    
    # 插入图表到工作表
    worksheet.insert_chart('F4', combo_chart)
    
    # 2. 创建瀑布图(使用堆叠柱状图模拟)
    # 创建辅助数据
    worksheet.write('G4', '收入分析')
    
    items = ['起始金额', '产品销售', '服务收入', '退款', '折扣', '运营成本', '税费', '最终利润']
    values = [0, 15000, 8500, -3000, -1200, -7500, -3100, 0]  # 最后的0是占位符
    
    # 计算运行总和
    running_total = 0
    invisible_values = []
    visible_values = []
    
    for val in values[:-1]:  # 除了最后一项
        if val >= 0:
            invisible_values.append(running_total)
            visible_values.append(val)
        else:
            invisible_values.append(running_total + val)
            visible_values.append(abs(val))
        running_total += val
    
    # 添加最终余额
    invisible_values.append(0)
    visible_values.append(running_total)
    
    # 写入数据
    worksheet.write_column('G6', items)
    worksheet.write_column('H6', invisible_values)
    worksheet.write_column('I6', visible_values)
    worksheet.write_column('J6', [running_total for _ in range(len(items))])  # 总计
    
    # 创建瀑布图
    waterfall_chart = workbook.add_chart({
   'type': 'column', 'subtype': 'stacked'})
    
    # 添加不可见系列(作为基础)
    waterfall_chart.add_series({
   
        'name':       '基础',
        'categories': ['Sheet1', 5, 6, 12, 6],
        'values':     ['Sheet1', 5, 7, 12, 7],
        'fill':       {
   'none': True},
        'border':     {
   'none': True},
        'data_labels': {
   'none': True},
    })
    
    # 添加可见系列(正值)
    waterfall_chart.add_series({
   
        'name':       '增加',
        'categories': ['Sheet1', 5, 6, 12, 6],
        'values':     ['Sheet1', 5, 8, 12, 8],
        'fill':       {
   'color': '#91CC75'},
        'data_labels': {
   'value': True, 'num_format': '#,##0', 'position': 'inside'},
    })
    
    # 设置最后一个元素(合计)的颜色
    format_waterfall_total = workbook.add_format({
   'bg_color': '#5470C6'})
    worksheet.write('I13', visible_values[-1], format_waterfall_total)
    
    # 设置图表标题和坐标轴
    waterfall_chart.set_title({
   'name': '收入分析瀑布图'})
    waterfall_chart.set_x_axis({
   'name': '项目'})
    waterfall_chart.set_y_axis({
   'name': '金额', 'num_format': '#,##0'})
    
    # 关闭图例
    waterfall_chart.set_legend({
   'none': True})
    
    # 设置图表大小
    waterfall_chart.set_size({
   'width': 720, 'height': 400})
    
    # 插入图表到工作表
    worksheet.insert_chart('F20', waterfall_chart)
    
    # 关闭并保存工作簿
    workbook.close()
    
    print("Excel文件已创建:advanced_charts.xlsx")

# 调用函数
advanced_charts_example()

3.3 数据标签与图例定制

def custom_chart_labels_example():
    """自定义图表数据标签与图例"""
    # 创建一个新的Excel文件
    workbook = xlsxwriter.Workbook('custom_chart_labels.xlsx')
    worksheet = workbook.add_worksheet()
    
    # 添加数据
    regions = ['北部', '南部', '东部', '西部', '中部']
    q1_data = [8200, 7800, 6700, 9100, 8400]
    q2_data = [8900, 8100, 7200, 9500, 8700]
    q3_data = [9500, 8600, 7800, 10000, 9100]
    q4_data = [10200, 9400, 8500, 11200, 9800]
    
    # 写入数据
    worksheet.write_column('A2', ['区域'] + regions)
    worksheet.write_column('B2', ['第一季度'] + q1_data)
    worksheet.write_column('C2', ['第二季度'] + q2_data)
    worksheet.write_column('D2', ['第三季度'] + q3_data)
    worksheet.write_column('E2', ['第四季度'] + q4_data)
    
    # 1. 创建自定义数据标签的柱状图
    column_chart = workbook.add_chart({
   'type': 'column'})
    
    # 配置数据系列
    for col_num, quarter in enumerate(['第一季度', '第二季度', '第三季度', '第四季度'], 1):
        column_chart.add_series({
   
            'name':       quarter,
            'categories': ['Sheet1', 2, 0, 6, 0],
            'values':     ['Sheet1', 2, col_num, 6, col_num],
            'data_labels': {
   
                'value': True,               # 显示值
                'category': False,           # 不显示类别
                'series_name': False,        # 不显示系列名
                'position': 'inside_end',    # 标签位置
                'font': {
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Is code

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值