Сортировка вкладок в книге XLSX с помощью openpyxl - PullRequest
0 голосов
/ 15 января 2019

Я не уверен, стоит ли мне создавать новый вопрос, потому что принятый ответ не работает. Пожалуйста, порекомендуйте. Должен ли я просто ответить на тот же вопрос в качестве ответа? Вот тот же вопрос: Как отсортировать листы / вкладки Excel в книге, используя 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 Ответ

0 голосов
/ 15 января 2019

У меня работает следующее решение, sort ing на 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

...