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,转载时应保留。图片均为原文官方示例。











暂无评论内容