尝试使用 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]