代码之家  ›  专栏  ›  技术社区  ›  enter_display_name_here

使用OpenPYXL对XLSX工作簿中的选项卡进行排序

  •  0
  • enter_display_name_here  · 技术社区  · 6 年前

    我不确定是否应该或不应该创建一个新问题,因为接受的答案不起作用。请告知。我只是回答和回答一样的问题吗?以下是同样的问题: How can I sort excel sheets/tabs in workbook using openpyxl .我不确定它是否因用户问题(通常是)或OpenPYXL的旧/新版本而无法工作。

    这是我的代码:

    from openpyxl import Workbook
    wb = Workbook()
    
    ws1 = wb.create_sheet("B")
    ws2 = wb.create_sheet("A")
    ws3 = wb.create_sheet("C")
    ws4 = wb.create_sheet("D")
    
    wb._sheets = sorted(wb._sheets) #Error comes up at this line
    
    wb.save('test_tabs.xlsx')
    

    我收到以下错误:

    TypeError: '<' not supported between instances of 'Worksheet' and 'Worksheet'
    

    因此,我尝试手动排序工作表列表:

    >>> type(wb._sheets)
    <class 'list'>
    
    >>> wb._sheets
    [<Worksheet "Sheet">, <Worksheet "B">, <Worksheet "A">, <Worksheet "C">, <Worksheet "D">]
    
    >>> wb._sheets = [<Worksheet "A">, <Worksheet "B">, <Worksheet "C">, <Worksheet "D">, <Worksheet "Sheet">]
    File "<stdin>", line 1
    
    # Manual sort of sheets
    wb._sheets = [<Worksheet "A">, <Worksheet "B">, <Worksheet "C">, <Worksheet "D">, <Worksheet "Sheet">]
                  ^
    SyntaxError: invalid syntax
    

    我注意到清单上的项目没有 ' " 所以我想知道 sort 因此而失败。

    为了踢,我试着增加 到列表项:

    wb._sheets = ['<Worksheet "A">', '<Worksheet "B">', '<Worksheet "C">', '<Worksheet "D">', '<Worksheet "Sheet">']
    
    >>> wb._sheets
    ['<Worksheet "A">', '<Worksheet "B">', '<Worksheet "C">', '<Worksheet  "D">', '<Worksheet "Sheet">']
    
    >>> wb.save('test_tabs2.xlsx')
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    ....
    AttributeError: 'str' object has no attribute 'sheet_state'
    
    >>> openpyxl.__version__
    '2.4.1'
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   cody    6 年前

    以下解决方案, sort 安宁 ws.title 为我工作:

    from openpyxl import Workbook
    
    wb = Workbook()
    
    ws1 = wb.create_sheet("B")
    ws2 = wb.create_sheet("A")
    ws3 = wb.create_sheet("C")
    ws4 = wb.create_sheet("D")
    
    wb._sheets.sort(key=lambda ws: ws.title)
    
    wb.save('test_tabs.xlsx')
    

    结果:

    enter image description here