Побочный эффект при копировании листа .xlsx в другой файл Excel - PullRequest
0 голосов
/ 29 апреля 2019

Существует несколько способов скопировать лист Excel (.xlsx) в другой существующий файл Excel. Поскольку мне приходится иметь дело с листами, содержащими отформатированные объекты формы (цветные текстовые поля, строки, ...), единственным рабочим решением было использование метода win32.com.client, как упоминалось здесь . Используя этот метод, я могу вставить лист из одного существующего файла Excel в другой существующий файл Excel.

Но это имеет побочный эффект, которого я бы хотел избежать:

До добавления листа лист моего файла назначения содержит содержимое, которое помещается точно на одну страницу при печати или сохранении в формате PDF.

После добавления листа листа мой файл назначения приведет к 72 страницам при печати или сохранении в формате PDF. Первая страница содержит данные, остальные 71 страница белого цвета.

Я почти уверен, что это не проблема кода, это выглядит так:

from win32com.client import Dispatch

xl = Dispatch("Excel.Application")

wb1 = xl.Workbooks.Open(Filename=template)
wb2 = xl.Workbooks.Open(Filename=destination)

ws1 = wb1.Worksheets(1)
ws1.Copy(Before=wb2.Worksheets(1))

wb2.Close(SaveChanges=True)
xl.Quit()

Это поведение, конечно, можно впоследствии изменить, определив область печати вручную в Excel. Его также можно изменить, установив в настройках печати только страницу 1 процесса. Но это не желаемое решение этой проблемы, так как другие люди, работающие с этими файлами, как правило, не смотрят на предварительный просмотр печати и хорошо, тогда у вас есть эта куча слегка теплых чистых листов на принтере.

Я попытался установить область печати после копии листа, используя openpyxl. Это не работает, так как сохранение результата удаляет все объекты формы из моих листов, потому что openpyxl не может их обработать. (Настройка самой области печати работала нормально, но это можно сделать только с файлами, содержащими только данные.)

Итак, я ищу:

  1. Решение для добавления всего существующего листа .xlsx, содержащего объекты формы, в другой существующий файл Excel, без возни с распечатанным результатом или

  2. Метод изменения области печати существующих листов .xlsx без потери объектов формы или изображений.

Я не нашел ничего полезного - но, возможно, вариант 2 может быть выполнен с использованием win32.com тоже?

Любая идея или помощь приветствуются, спасибо!

1 Ответ

0 голосов
/ 30 апреля 2019

... после того, как я наконец нашел эту страницу :

Решение с использованием win32.com.client:

Worksheets(n).PageSetup.PrintArea  = "$A$1:$L$32" # desired print area range goes here

В моем случае,я хочу установить область печати последней (самой правой) рабочей таблицы в моем файле:

wb2_lastsheet = len(wb2.Worksheets)
wb2.Worksheets(wb2_lastsheet).PageSetup.PrintArea  = "$A$1:$L$32" 

Незначительные проблемы:

Это будет работать только один раз дляфайл.Во второй раз, когда я пытаюсь установить область печати следующим образом, небольшое всплывающее окно требует, чтобы я вставил имя для второй области печати, даже если она применяется к другому листу в файле.

Поскольку имя Print_Area является некоторым встроенным термином Excel, и первое выполнение уже автоматически устанавливает это имя, каждая вторая попытка приводит к появлению всплывающего окна, в котором я хочу вставить действительное имя для новой печати.регион.

Тем не менее, настройка области печати несколько раз работает!Вам просто нужно ввести имена для них.

Я пытался разобраться с существующими регионами, прежде чем устанавливать новую область печати, используя excel Name-Object , но это не помогло.работать на всех.Похоже, что встроенный термин Print_Area - это какой-то особый объект в Excel, нормальные Name методы здесь не работают.

Но я достиг того, чего хочу - и теперь смотрю на негоГлупо просто.

Надеюсь, это поможет некоторым другим специалистам по pythonista-автоматизации.

...