У меня было две проблемы. Первой проблемой была вставка листа в заданную позицию. Второй проблемой было перемещение листа. Поскольку я в основном имею дело с более новым файлом Excel xlsx
, я бы использовал openpyxl.
Различные источники указывают, что новые листы добавляются в конец. Я ожидал, что мне нужно будет делать это каждый раз, а затем переместить лист. Я задал вопрос "(Как) переместить лист ..." , думая, что это решит обе проблемы.
В конце концов, первая проблема была легкой, когда я наконец нашел пример, который показал, что метод workbook.create_sheet()
принимает необязательный аргумент index
для вставки нового листа в заданную позицию с нулевым индексом. (Мне действительно нужно научиться смотреть на код, потому что ответ был здесь ):
def create_sheet(self, title=None, index=None):
"""Create a worksheet (at an optional index)
[...]
Далее. Оказывается, вы можете переместить лист, переупорядочив контейнер рабочей книги _sheets
. Поэтому я сделал небольшой вспомогательный функционал для проверки идеи:
def neworder(shlist, tpos = 3):
"""Takes a list of ints, and inserts the last int, to tpos location (0-index)"""
lst = []
lpos = (len(shlist) - 1)
print("Before:", [x for x in range(len(shlist))])
# Just a counter
for x in range(len(shlist)):
if x > (tpos - 1) and x != tpos:
lst.append(x-1)
elif x == tpos:
lst.append(lpos)
else:
lst.append(x)
return lst
# Get the sheets in workbook
currentorder = wb.sheetnames
# move the last sheet to location `tpos`
myorder = neworder(currentorder)
>>>Before: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]
>>>After : [0, 1, 2, 17, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
# get each object instance from wb._sheets, and replace
wb._sheets = [wb._sheets[i] for i in myorder]
Первый ответ было несложно найти в документации openpyxl, как только я понял, что он сделал. Просто немного удивлен, что в других блогах не было упоминаний о подвижных листах.