Переместить лист в книгу, используя openpyxl или xl * или xlsxwriter? - PullRequest
0 голосов
/ 28 июня 2018

Я прочитал документы для, openpyxl , xlwt , xlrd , xlutils , xlsxwriter, Я не могу найти способ перемещения листа в книге Excel . Тесты добавили лист до конца.

Конкретно, у меня есть своего рода календарь ['JAN','FEB',...,'DEC'], и мне нужно заменить месяцы по мере необходимости.

Как упорядочить листы в книге Excel, если вы не переместите их? Можете ли вы вставить лист после или до указанного листа?

Только один пост , который я могу найти на SO использует win32com и Book.Worksheets.Add(After=Sheet); кажется странным, что ни у одного из этих модулей не было бы этого метода.

По умолчанию, кажется, добавить лист в конце книги. Я мог бы скопировать файл назначения, пока не будет достигнут обновленный лист, вставить новый лист и продолжить до конца оригинальную копию. (вдохновлено этим постом )

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Вот что я придумал (используя openpyxl)

def move_sheet(wb, from_loc=None, to_loc=None):
    sheets=wb._sheets

    # if no from_loc given, assume last sheet
    if from_loc is None:
        from_loc = len(sheets) - 1

    #if no to_loc given, assume first
    if to_loc is None:
        to_loc = 0

    sheet = sheets.pop(from_loc)
    sheets.insert(to_loc, sheet)
0 голосов
/ 28 июля 2018

У меня было две проблемы. Первой проблемой была вставка листа в заданную позицию. Второй проблемой было перемещение листа. Поскольку я в основном имею дело с более новым файлом 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, как только я понял, что он сделал. Просто немного удивлен, что в других блогах не было упоминаний о подвижных листах.

...