XlsxWriter:使用工作表表格

Excel 的表格(Table)把一片单元格区域组织成一个整体,统一格式,并允许在公式中引用。表格可以有列标题、自动筛选、汇总行、整列公式及默认格式。更多概念见 Microsoft 的 Excel 表格文档。

官方示例:带标题、汇总和数字格式的表格

启用 Workbook 的 constant_memory 模式时,XlsxWriter 不支持表格。

add_table()

使用 worksheet.add_table() 添加表格。范围既可以使用 A1 记法,也可以使用从 0 开始的行列坐标:

worksheet.add_table('B3:F7')
# Same as:
worksheet.add_table(2, 1, 6, 5)

默认表格

最后一个可选参数是字典,描述表格选项和数据。可用键为 data、autofilter、header_row、banded_columns、banded_rows、first_column、last_column、style、total_row、columns、name。它们都不是必需项,不设置选项时连字典也可以省略。

data:表格数据

data 提供表格内的数据,是按行组织的列表的列表:

data = [
    ['Apples', 10000, 5000, 8000, 6000],
    ['Pears',   2000, 3000, 4000, 5000],
    ['Bananas', 6000, 6000, 6500, 6000],
    ['Oranges',  500,  300,  200,  700],
]

worksheet.add_table('B3:F7', {'data': data})

填入数据

也可以先建表格,再按行或按单元格写入,下面与上述写法等价:

# These statements are the same as the single statement above.
worksheet.add_table('B3:F7')
worksheet.write_row('B4', data[0])
worksheet.write_row('B5', data[1])
worksheet.write_row('B6', data[2])
worksheet.write_row('B7', data[3])

需要控制具体 write_*() 方法,或修改某个单元格格式时,分开写入尤其有用。

header_row:标题行

标题行默认启用,可以关闭:

# Turn off the header row.
worksheet.add_table('B4:F7', {'header_row': False})

无标题行的表格

默认标题为 Column 1、Column 2 等,可通过后文的 columns 覆盖。

autofilter:自动筛选

标题行的自动筛选默认启用,可以关闭:

# Turn off the default autofilter.
worksheet.add_table('B3:F7', {'autofilter': False})

关闭自动筛选

只有启用 header_row 才显示筛选按钮。表格内部的筛选条件设置目前不受支持。

banded_rows 和 banded_columns:交替底色

行交替底色默认启用:

# Turn off banded rows.
worksheet.add_table('B3:F7', {'banded_rows': False})

列交替底色默认关闭:

# Turn on banded columns.
worksheet.add_table('B3:F7', {'banded_columns': True})

交替底色示例

first_column 和 last_column:强调首末列

可以突出显示第一列或最后一列。表现取决于表格样式,可能是粗体或不同颜色,默认均关闭:

# Turn on highlighting for the first column in the table.
worksheet.add_table('B3:F7', {'first_column': True})
# Turn on highlighting for the last column in the table.
worksheet.add_table('B3:F7', {'last_column': True})

强调列

style:表格样式

必须使用标准 Excel 表格样式名称,并保持大小写一致:

worksheet.add_table('B3:F7', {'data': data,
                            'style': 'Table Style Light 11'})

浅色样式

默认是 Table Style Medium 9。设置为 None 可以关闭表格样式:

worksheet.add_table('B3:F7', {'data': data, 'style': None})

不应用表格样式

name:表格名称

默认依次命名为 Table1、Table2 等,也可以指定:

worksheet.add_table('B3:F7', {'name': 'SalesData'})

自定义名称不能与已有表格重复,并须满足 Excel 表格名称规则。

total_row:汇总行

启用后,表格最后一行成为汇总行,使用特殊格式,并提供 SUBTOTAL 函数下拉选项:

worksheet.add_table('B3:F7', {'total_row': True})

汇总行

默认汇总行不含标题或公式,需要通过 columns 指定。

columns:列属性

columns 是字典列表,每个字典对应一列。支持 header、header_format、formula、total_string、total_function、total_value、format。

例如覆盖默认列标题:

worksheet.add_table('B3:F7', {
    'data': data,
    'columns': [
        {'header': 'Product'},
        {'header': 'Quarter 1'},
        {'header': 'Quarter 2'},
        {'header': 'Quarter 3'},
        {'header': 'Quarter 4'},
    ]
})

自定义列标题

不想设置某一列时,传空字典即可保留默认值,例如第三列:

columns = [
    {'header': 'Product'},
    {'header': 'Quarter 1'},
    {},  # Defaults to 'Column 3'.
    {'header': 'Quarter 3'},
    {'header': 'Quarter 4'},
]

整列公式

formula 为整列指定公式:

formula = '=SUM(Table8[@[Quarter 1]:[Quarter 4]])'

worksheet.add_table('B3:G7', {
    'data': data,
    'columns': [
        {'header': 'Product'},
        {'header': 'Quarter 1'},
        {'header': 'Quarter 2'},
        {'header': 'Quarter 3'},
        {'header': 'Quarter 4'},
        {'header': 'Year', 'formula': formula},
    ]
})

年度求和公式

公式支持 Excel 2007 的 [#This Row] 和 Excel 2010 的 @ 结构化引用,但不支持其他 Excel 2010 新增语法,公式应遵循 Excel 2007 风格。Table8 来自原文完整示例的表格顺序;独立使用时必须匹配实际表格名称。

汇总标题和函数

total_row 只开启该行,total_string 与 total_function 才填入标题和汇总公式:

options = {
    'data': data,
    'total_row': 1,
    'columns': [
        {'header': 'Product', 'total_string': 'Totals'},
        {'header': 'Quarter 1', 'total_function': 'sum'},
        {'header': 'Quarter 2', 'total_function': 'sum'},
        {'header': 'Quarter 3', 'total_function': 'sum'},
        {'header': 'Quarter 4', 'total_function': 'sum'},
        {'header': 'Year',
         'formula': '=SUM(Table10[@[Quarter 1]:[Quarter 4]])',
         'total_function': 'sum'},
    ]
}
# Add a table to the worksheet.
worksheet.add_table('B3:G8', options)

支持的 SUBTOTAL 函数为 average、count_nums、count、max、min、std_dev、sum、var。也可以使用自定义函数或公式。

total_value 设置汇总公式的缓存结果,仅在目标应用不能自行计算公式时需要,类似 write_formula() 的可选 value 参数:

options = {
    'data': data,
    'total_row': 1,
    'columns': [
        {'total_string': 'Totals'},
        {'total_function': 'sum', 'total_value': 150},
        {'total_function': 'sum', 'total_value': 200},
        {'total_function': 'sum', 'total_value': 333},
        {'total_function': 'sum', 'total_value': 124},
        {'formula': '=SUM(Table10[@[Quarter 1]:[Quarter 4]])',
         'total_function': 'sum', 'total_value': 807},
    ]
}

这里的缓存数值按原文示例保留,实际工作簿应提供与实际数据和公式一致的结果。

列与标题格式

使用 format 设置数据列格式,使用 header_format 设置标题格式:

currency_format = workbook.add_format({'num_format': '$#,##0'})
wrap_format = workbook.add_format({'text_wrap': 1})

worksheet.add_table('B3:D8', {
    'data': data,
    'total_row': 1,
    'columns': [
        {'header': 'Product'},
        {'header': 'Quarter 1', 'total_function': 'sum',
         'format': currency_format},
        {'header': 'Quarter 2', 'header_format': wrap_format,
         'total_function': 'sum', 'format': currency_format},
    ]
})

使用标准 Format 对象,但列格式应限于数字格式,标题格式应限于换行等简单设置。覆盖其他表格格式可能产生不一致的结果。

完整示例

本页所有图均来自官方 Example: Worksheet Tables,可在该页查看生成各张工作表示例的完整脚本。


原文:Working with Worksheet Tables。© 2013–2025 John McNamara;中文翻译。XlsxWriter 采用 BSD 2-Clause,完整版权、许可条件与免责声明见随附 licenses/XlsxWriter-BSD-2-Clause.txt,转载时应保留。图片均为原文官方示例。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容