尝试使用 openpyxl 保存工作簿时出现 TypError - 为什么?
When trying to save a workbook with openpyxl i get a TypError - why?
我正在构建一个应用程序,我的公司使用该应用程序分析提供的 table 数据。
到目前为止一切顺利,但是当我尝试将结果保存到工作簿时,我得到了一个
TypeError: '<' not supported between instances of 'str' and 'int'
有人知道该怎么办吗?
这是一个代码片段:
from openpyxl import *
from openpyxl.styles import Border, Side, Alignment, Font, PatternFill
from tkinter import *
import tkinter
root = tkinter.Tk()
# Properties of the GUI
root.geometry("120x80")
root.title("TOOL_1")
def create_new_workbook():
global wb
wb = Workbook()
ss = wb.active
ss.sheet_view.showGridLines = False
ss.title = "Report"
# Implement thick line vertically the seperate overview sheet
bottom = Side(border_style='thick', color='000000')
border = Border(bottom=bottom)
col = ss.row_dimensions['23']
col.border = border
ss.merge_cells('B3:E6')
ss['B3'].alignment = Alignment(horizontal='center',
vertical='center')
ss['B3'] = "TOTAL"
total_label = ss['A3']
total_label.font = Font(bold=True, size=24)
ss['B7'] = "ZNr"
ZNr_label = ss['B7']
ZNr_label.font = Font(bold=True)
ss.merge_cells('C7:E7')
ss['B9'] = "DEP"
DEP_label = ss['B9']
DEP_label.font = Font(bold=True)
DEP_label.fill = PatternFill(start_color='9BC2E6',
end_color='9BC2E6',
fill_type='solid')
ss.merge_cells('C9:E9')
deposit_amount = ss['C9']
deposit_amount.fill = PatternFill(start_color='9BC2E6',
end_color='9BC2E6',
fill_type='solid')
wb.save(r"Test1.xlsx")
print("Saved")
button_create_new_workbook = Button(root, text="Create Workbook", command=create_new_workbook)
button_create_new_workbook.pack()
root.mainloop()
你的问题是这一行:
col = ss.row_dimensions['23']
row_dimensions
似乎接受整数或字符串输入。但是,保存时需要输入整数,而不是字符串。不可否认,我发现这很难找到并且不得不深入研究 openpyxl。引发错误的 openpyxl 函数是:
def rows(self):
"""Return all rows, and any cells that they contain"""
# order cells by row
rows = defaultdict(list)
for (row, col), cell in sorted(self.ws._cells.items()):
rows[row].append(cell)
# add empty rows if styling has been applied
for row in self.ws.row_dimensions.keys() - rows.keys():
rows[row] = []
return sorted(rows.items())
使用 print
来隔离行,它为您的工作表提供了这些行:
(3, [<Cell 'Report'.A3>, <Cell 'Report'.B3>, <MergedCell 'Report'.C3>, <MergedCell 'Report'.D3>, <MergedCell 'Report'.E3>])
(4, [<MergedCell 'Report'.B4>, <MergedCell 'Report'.C4>, <MergedCell 'Report'.D4>, <MergedCell 'Report'.E4>])
(5, [<MergedCell 'Report'.B5>, <MergedCell 'Report'.C5>, <MergedCell 'Report'.D5>, <MergedCell 'Report'.E5>])
(6, [<MergedCell 'Report'.B6>, <MergedCell 'Report'.C6>, <MergedCell 'Report'.D6>, <MergedCell 'Report'.E6>])
(7, [<Cell 'Report'.B7>, <Cell 'Report'.C7>, <MergedCell 'Report'.D7>, <MergedCell 'Report'.E7>])
(9, [<Cell 'Report'.B9>, <Cell 'Report'.C9>, <MergedCell 'Report'.D9>, <MergedCell 'Report'.E9>])
('23', [])
最后一行是空的,但应用了样式,因此附加到字典中。但是,您将行号作为字符串输入,这会在尝试对 rows.items()
进行排序时引发此错误。 row_dimensions
允许字符串可能是无意的。但是,您可以通过替换
来解决您的问题
col = ss.row_dimensions['23']
和
col = ss.row_dimensions[23]
我正在构建一个应用程序,我的公司使用该应用程序分析提供的 table 数据。
到目前为止一切顺利,但是当我尝试将结果保存到工作簿时,我得到了一个
TypeError: '<' not supported between instances of 'str' and 'int'
有人知道该怎么办吗?
这是一个代码片段:
from openpyxl import *
from openpyxl.styles import Border, Side, Alignment, Font, PatternFill
from tkinter import *
import tkinter
root = tkinter.Tk()
# Properties of the GUI
root.geometry("120x80")
root.title("TOOL_1")
def create_new_workbook():
global wb
wb = Workbook()
ss = wb.active
ss.sheet_view.showGridLines = False
ss.title = "Report"
# Implement thick line vertically the seperate overview sheet
bottom = Side(border_style='thick', color='000000')
border = Border(bottom=bottom)
col = ss.row_dimensions['23']
col.border = border
ss.merge_cells('B3:E6')
ss['B3'].alignment = Alignment(horizontal='center',
vertical='center')
ss['B3'] = "TOTAL"
total_label = ss['A3']
total_label.font = Font(bold=True, size=24)
ss['B7'] = "ZNr"
ZNr_label = ss['B7']
ZNr_label.font = Font(bold=True)
ss.merge_cells('C7:E7')
ss['B9'] = "DEP"
DEP_label = ss['B9']
DEP_label.font = Font(bold=True)
DEP_label.fill = PatternFill(start_color='9BC2E6',
end_color='9BC2E6',
fill_type='solid')
ss.merge_cells('C9:E9')
deposit_amount = ss['C9']
deposit_amount.fill = PatternFill(start_color='9BC2E6',
end_color='9BC2E6',
fill_type='solid')
wb.save(r"Test1.xlsx")
print("Saved")
button_create_new_workbook = Button(root, text="Create Workbook", command=create_new_workbook)
button_create_new_workbook.pack()
root.mainloop()
你的问题是这一行:
col = ss.row_dimensions['23']
row_dimensions
似乎接受整数或字符串输入。但是,保存时需要输入整数,而不是字符串。不可否认,我发现这很难找到并且不得不深入研究 openpyxl。引发错误的 openpyxl 函数是:
def rows(self):
"""Return all rows, and any cells that they contain"""
# order cells by row
rows = defaultdict(list)
for (row, col), cell in sorted(self.ws._cells.items()):
rows[row].append(cell)
# add empty rows if styling has been applied
for row in self.ws.row_dimensions.keys() - rows.keys():
rows[row] = []
return sorted(rows.items())
使用 print
来隔离行,它为您的工作表提供了这些行:
(3, [<Cell 'Report'.A3>, <Cell 'Report'.B3>, <MergedCell 'Report'.C3>, <MergedCell 'Report'.D3>, <MergedCell 'Report'.E3>])
(4, [<MergedCell 'Report'.B4>, <MergedCell 'Report'.C4>, <MergedCell 'Report'.D4>, <MergedCell 'Report'.E4>])
(5, [<MergedCell 'Report'.B5>, <MergedCell 'Report'.C5>, <MergedCell 'Report'.D5>, <MergedCell 'Report'.E5>])
(6, [<MergedCell 'Report'.B6>, <MergedCell 'Report'.C6>, <MergedCell 'Report'.D6>, <MergedCell 'Report'.E6>])
(7, [<Cell 'Report'.B7>, <Cell 'Report'.C7>, <MergedCell 'Report'.D7>, <MergedCell 'Report'.E7>])
(9, [<Cell 'Report'.B9>, <Cell 'Report'.C9>, <MergedCell 'Report'.D9>, <MergedCell 'Report'.E9>])
('23', [])
最后一行是空的,但应用了样式,因此附加到字典中。但是,您将行号作为字符串输入,这会在尝试对 rows.items()
进行排序时引发此错误。 row_dimensions
允许字符串可能是无意的。但是,您可以通过替换
col = ss.row_dimensions['23']
和
col = ss.row_dimensions[23]