Python XlsxWriter - 大纲和分组

在 Excel 中,您可以对具有特定列(或行)相同值的行或列进行分组,以便单击鼠标即可隐藏或显示它们。 此功能称为大纲和分组。 它有助于显示小计或摘要。 此功能可以在 MS excel 软件的 Data→Outline 组中找到。

要使用此功能,数据范围内的所有行都应按照一列中值的排序顺序排列。 假设我们有不同商品的销售数据。 对项目名称的范围进行排序后,单击"Outline"组中的"Subtotal"选项。 弹出如下对话框。

Outline

工作表显示按项目分类的销售额小计,最后显示总计。 在工作表的左侧,显示了大纲级别。 原始数据在第 3 层,小计在第 2 层,总计在第 1 层。

商品和销售

使用大纲和分组

要使用 XlsxWriter 执行此操作,我们需要使用 set_row() 方法的级别属性。 数据行设置在级别 2。

ws.set_row(row, None, None, {'level': 2})

subtotal 行的级别为 1。

ws.set_row(row, None, None, {'level': 1})

我们使用SUBTOTAL() 函数来计算并显示一组中的销售额总和。

示例

完整代码如下 −

import xlsxwriter
wb = xlsxwriter.Workbook('hello.xlsx')
ws = wb.add_worksheet()

headings=['Item', 'Sales']
data=[
   ['Apple', 45], ['Apple', 84], ['Apple', 125],
   ['Mango', 32], ['Mango', 65], ['Mango', 90],
   ['Oranges', 60], ['Oranges', 75], ['Oranges',100],
]
ws.write_row('A1', headings)
item='Apple'
rownum=1
startrow=1
for row in data:
   if row[0]==item:
      ws.set_row(rownum, None, None, {'level': 2})
      ws.write_row(rownum,0, row)
      rownum+=1
else:
   ws.set_row(rownum, None, None, {'level': 1})
   ws.write(rownum, 0, item+' Subtotal')
   cellno='B{}:B{}'.format(startrow,rownum)
   print (cellno)
   ws.write(rownum,1,'=SUBTOTAL(9,'+cellno+')')
   # rownum+=1
   item=data[rownum][0]
   rownum+=1
   ws.set_row(rownum, None, None, {'level': 2})
   ws.write_row(rownum,0, row)
   rownum+=1
   startrow=rownum
else:
   ws.set_row(rownum, None, None, {'level': 1})
   ws.write(rownum, 0, item+' Subtotal')
   cellno='B{}:B{}'.format(startrow,rownum)
   ws.write(rownum,1,'=SUBTOTAL(9,'+cellno+')')
rownum+=1
ws.write(rownum, 0, 'Grand Total')
cellno='B{}:B{}'.format(1,rownum)
ws.write(rownum,1,'=SUBTOTAL(9,'+cellno+')')

wb.close()

输出

运行代码并使用 Excel 打开 hello.xlsx。 正如我们所见,大纲显示在左侧。

大纲

在每个级别,减号表示可以折叠行,只显示小计行。

小计行

此图显示级别 2 的所有行都已折叠。 它现在在大纲中显示加号,这意味着可以扩展数据行。 如果您单击级别 1 的减号,工作表上将只保留总计。

总计