我正在使用透视表 XLSX 文件并编写脚本以将它们解析为每个选项卡的新文件。
由于默认情况下 openpyxl 不支持数据透视表,因此我需要做一些工作来重新插入在复制过程中丢失的数据透视表“样式”。
为此,我将遍历每一行和每一列,查找第Total
0 列中的值。一旦找到,该行应更改为 all bold=True
。
相反,我收到不稳定的行为,有时会在第一个None
. 我的print('bolding totals')
消息显示它正在正确评估每一行/单元格。我是不是脑子有问题,把循环上的缩进搞砸了,也许?
from openpyxl import Workbook
from openpyxl import load_workbook
from copy import deepcopy
wb = load_workbook(filename=r'input.xlsx')
# Print 1
sheetlist = wb.get_sheet_names()
print(sheetlist)
for i in range(len(sheetlist)-1):
dest_filename = r''+sheetlist[i]+'.xlsx'
new_wb = Workbook()
ws = wb.get_sheet_by_name(sheetlist[i])
new_wb.add_sheet(ws, 0)
for k in range(0, new_wb.worksheets[0].get_highest_row()):
print(new_wb.worksheets[0].cell(row=k, column=0).value)
# ignore empty cells
if new_wb.worksheets[0].cell(row=k, column=0).value is not None:
if 'Total' in new_wb.worksheets[0].cell(row=k, column=0).value:
for j in range(0, new_wb.worksheets[0].get_highest_column()):
print('bolding totals, '+str(k), str(j))
new_wb.worksheets[0].cell(
row=k, column=j).style.font.bold = True
elif 'Total' not in new_wb.worksheets[0].cell(row=k, column=0).value:
for j in range(0, new_wb.worksheets[0].get_highest_column()):
print('not bolding anything')
new_wb.worksheets[0].cell(
row=k, column=j).style.font.bold = False
# remove the blank sheet created in new_wb by openpyxl
new_wb.remove_sheet(new_wb.get_sheet_by_name('Sheet'))
print(new_wb.get_sheet_names())
new_wb.save(dest_filename)
break # set to break after one sheet for testing
print('finished')
在这一点上,我怀疑这是 openpyxl 处理样式中的一个错误。我进行了另一个非常简单的编辑并得到了奇怪的行为。
如果我们有一个带有粗体/非粗体单元格的简单布局。然后我们运行这个简单的命令来改变一个单元格:
>>> new_wb.worksheets[0].cell(row=10,column=0).style.font.bold = False
整个列的输出会发生变化,而不仅仅是单元格。