win32com, функция PageSetup.Pages.Count работает некоррекно
Необходимо все эксель-файлы, лежащие в одной папке, собрать в один файл, разместив каждый из них на отдельном листе:
def collect_to_one():
"""Функция собирает все excel-файлы в один том"""
sgmts = segmentation(start_page)
for book in range(len(sgmts)):
wb = excel.Workbooks.Add()
for file in range(len(sgmts[book])):
"""Цикл копирует лист из файла в сводный файл"""
print(sgmts[book][file])
w = excel.Workbooks.Open(os.path.join(os.getcwd(), sgmts[book][file]))
w.Sheets(1).Copy(After=wb.Worksheets(file + 1))
wb.ActiveSheet.Name = sgmts[book][file]
w.Save()
wb.SaveAs(os.path.join(os.getcwd(), '_'.join(('Сводный', sgmts[book][-1]))))
Далее требуется выполнить сквозную нумерацию листов, и вот тут начинаются проблемы: Использую win32com.client, и вне зависимости от того, прописываю я win32com.client.Dispatch('Excel.Application') или же win32com.client.gencache.EnsureDispatch('Excel.Application'), все равно возникает проблема при подсчете количества листов. За сквозную нумерацию отвечает функция:
def enum(start_page):
"""Функция выполняет нумерацию страниц в сводном файле"""
wb = excel.Workbooks.Open(os.path.join(os.getcwd(), "Сводный_09-04-01 +.xlsx"))
# wb.Sheets(2).Move(Before=wb.Sheets(4))
# wb.Sheets(2).Move(Before=wb.Sheets(4))
for i in range(2, len(files) + 2):
ws_list = wb.Worksheets(i)
ws_list.Application.PrintCommunication = False
ws_list.DisplayPageBreaks = True
print(ws_list.PageSetup.Pages.Count)
ws_list.PageSetup.FirstPageNumber = start_page # присваивание первой страницы файлу
start_page += ws_list.PageSetup.Pages.Count
ws_list.Application.PrintCommunication = True
wb.SaveAs(os.path.join(os.getcwd(), "Сводный_09-04-01 +.xlsx"))
И если ничего не предпринимать, то он почему-то думает, что количество листов у 6 файлов с расширением .xlsx соответственно равно:
0 (фактически файл содержит 4 листа)
0 (фактически файл содержит 4 листа)
0 (фактически файл содержит 5 листов)
0 (фактически файл содержит 35 листа)
0 (фактически файл содержит 7 листов)
2 (фактически файл содержит 2 листа)
Корректно он начинает считать только в том случае, если я вручную зайду в сводный файл, поменяю местами любые листы, а потом верну их обратно на то же место. В таком случае, при вызове функции, нумерация и подсчет листов выполняется корректно. Также данную проблему решает "костыль", который делает то же самое, что я описал выше:
wb.Sheets(2).Move(Before=wb.Sheets(4))
wb.Sheets(2).Move(Before=wb.Sheets(4))
Однако, хочется понять, почему так происходит, в результате чего он начинает нумеровать правильно просто в результате изменения местоположения листов в сводном файле