Макрос для сохранения файла excel в pdf

Обновлено: 07.07.2024

Не так давно появилась задача создать простой сервис по созданию PDF отчетов на основе офисных документов для интранета. И вроде бы все просто, но вот с сохранением Excel в PDF возникли проблемы. Интересно? Прошу под кат.


Как я и сказал, поначалу все казалось легко, у меня были собственные наработки, на хабре была статья. Но обо всем по порядку.

Мои наработки использовали сom объекты excel.application и метод saveAs, это прекрасно работало, пока требовалось взять обычный, красивый документ и сделать из него pdf, но в данном случае файлы были нет так просты.

Во-первых, документы предполагаются трех форматов — xls, xlsx и xml. Во вторых все документы содержат макросы, а некоторые ссылки на другие документы. В третьих они содержат кучу листов, и перекрестные ссылки между листами. Не нужные для отчета листы делаются скрытыми, а на самих листах в каше вспомогательных цифр отчетная информация выделялась областью печати. Нужно ли говорить, что saveAs игнорирует все это богатство и на выходе после танца с бубнами получаем абсолютно не читаемую картину.

Здесь я думаю необходимо сделать лирическое отступление и пояснить, почему с файлами творится такая неразбериха. Я работаю в очень крупной организации, бок обок с кучей бабушке пенсионного возраста. Они не могут даже сделать текст в ячейке жирным, но прекрасно могут говорить начальству о том, что они не «программисты» и не должны это уметь. Начальства у нас тоже много, и в силу жалости к бабушкам или своей компьютерной безграмотности, а быть может, по велению звезд жалобы бабушек поощряются, и все попытки разгрести бардак в документах пресекается.

Вернемся к нашим баранам. В выше упомянутой статье был предложен вариант конвертации «Как вижу» с использованием open office, этот вариант меня не устроил в силу ветреного отношения OO к MS. Некоторые документы действительно открывались в нем корректно, но чаще всего содержимое ехало еще до конвертации.

Был еще третий вариант. Печатать документы на виртуальный принтер, но я решил, что этот вариант я приберегу на самый крайний случай, так это костыль.

И тогда я обратился к гуглу и он дал мне эту замечательную ссылку. Описанный в ней метод ExportAsFixedFormat был тем, что нужно! Но меня опять постигла не удача.

И так, было решено из PHP открывать VBS скрип и уже из него преобразовывать excel в pdf. Да, это тоже костыль, но не такой неуклюжий как виртуальный принтер.

Вот получившийся скрипт:

Dim XL
Dim XLWkbk
Dim ObjArgs
Dim paramSourceBookPath
Dim paramExportFilePath

set objargs = wscript.arguments
if objArgs.count <= 1 then
wscript.echo «invalid passed arguments»
wscript.quit
end if

Set XL = CreateObject(«excel.application»)
XL.Visible = false

Set XLWkbk = XL.Workbooks.Open(paramSourceBookPath,False)

XLWkbk.Close False
XL.Quit

Set XLWkbk = Nothing
Set XL = Nothing
set ObjArgs = nothing

Он довольно прост, принимает на входе два аргумента, первый путь к файлу, Excel второй путь и имя создаваемой PDF.

Вызывается из любого ЯП, например PHP:
exec(APPLICATION_SCRIPT_FOLDER.'\\excel.vbs C:\\tmp\\test.xlsx C:\\tmp\\test.pdf");

В сухом остатке мы имеем не совсем красивый, но 100% рабочий метод по преобразованию Excel в PDF, который гарантирует результат «Как на печати» без подводных камней.

Метод ExportAsFixedFormat сохраняет рабочую книгу Excel или выбранную группу листов этой книги в один PDF-файл. Чтобы экспортировать каждый лист в отдельный файл, необходимо применить метод ExportAsFixedFormat к каждому сохраняемому листу.

Синтаксис

Expression . ExportAsFixedFormat ( Type , FileName , Quality , IncludeDocProperties , IgnorePrintAreas , From , To , OpenAfterPublish , FixedFormatExtClassPtr )

Expression – это выражение, представляющее объект Workbook, Worksheet или Range.

Параметры

Единственный обязательный параметр – Type, остальные можно не указывать – в этом случае будут применены значения по умолчанию.

Параметр Описание
Type Задает формат файла для экспорта книги или листа:
xlTypePDF(0) – сохранение в файл PDF;
xlTypeXPS(1) – сохранение в файл XPS*.
FileName Задает имя файла. При указании полного пути, файл будет сохранен в указанную папку, при указании только имени – в папку по умолчанию (в Excel 2016 – «Документы»). Если имя не задано (по умолчанию), файл будет сохранен с именем экспортируемой книги.
Quality Задает качество сохраняемых электронных таблиц:
xlQualityMinimum(1) – минимальное качество;
xlQualityStandard(0) – стандартное качество (по умолчанию).
IncludeDocProperties Включение свойств документа Excel в PDF:
True(1) – включить;
False(0) – не включать;
мне не удалось обнаружить разницу и значение по умолчанию.
IgnorePrintAreas Указывает VBA, следует ли игнорировать области печати, заданные на листах файла Excel:
True(1) – игнорировать области печати;
False(0) – не игнорировать области печати (по умолчанию).
From** Задает номер листа книги Excel, с которого начинается экспорт. По умолчанию сохранение в PDF начинается с первого листа книги.
To** Задает номер листа книги Excel, на котором заканчивается экспорт. По умолчанию сохранение в PDF заканчивается на последнем листе книги.
OpenAfterPublish Указывает VBA на необходимость открыть созданный файл PDF средством просмотра:
True(1) – открыть файл PDF для просмотра;
False(0) – не открывать файл PDF для просмотра (по умолчанию).
FixedFormatExtClassPtr Указатель на класс FixedFormatExt (игнорируем этот параметр).

* XPS – это редко использующийся фиксированный формат файлов, разработанный Microsoft, который похож на PDF, но основан на языке XML.
** Применимо только к книге (Workbook.ExportAsFixedFormat), при экспорте листа (Worksheet.ExportAsFixedFormat) указание параметров From и/или To приведет к ошибке.

Примеры экспорта в PDF

Сохранение в PDF книги Excel

Экспорт всей книги

ThisWorkbook . ExportAsFixedFormat Type : = xlTypePDF , Filename : = "C:\Test\file1.pdf" , OpenAfterPublish : = True

Если вы указываете путь к файлу, он должен существовать, иначе VBA сохранит файл с именем и в папку по умолчанию («ИмяКниги.pdf» в папку «Документы»).

Экспорт части книги

Этот способ позволяет сохранить в PDF группу листов, расположенных подряд:

При работе в Microsoft Excel вы можете столкнуться с проблемой сохранения активного рабочего листа в виде файла PDF. В этой статье вы можете узнать, как сохранить активный рабочий лист в виде файла PDF с кодом VBA с помощью командной кнопки. И если вы также хотите сохранить диапазон или каждый рабочий лист в активной книге как отдельный файл PDF, эта статья также может вам помочь.

Используйте командную кнопку, чтобы сохранить активный рабочий лист как файл PDF с кодом VBA

Вы можете запустить следующий код VBA, чтобы сохранить активный рабочий лист в виде файла PDF, нажав кнопку Command. Пожалуйста, сделайте следующее.

1. Во-первых, вам необходимо создать папку с именем PDF для сохранения вашего нового преобразованного файла PDF. Здесь я создаю эту папку на моем локальном диске (C :).

2. Вставьте командную кнопку, нажав разработчик > Вставить > Командная кнопка (элемент управления ActiveX). Смотрите скриншот:

2. Затем нарисуйте командную кнопку на листе, в котором вам нужно добавить новые строки, щелкните правой кнопкой мыши кнопку и нажмите Свойства из контекстного меню.

3. в Свойства диалоговом окне введите отображаемый текст командной кнопки в поле Подпись поле под Категории вкладку, а затем закройте диалоговое окно.

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

4. Снова щелкните правой кнопкой мыши командную кнопку, а затем щелкните Просмотреть код из контекстного меню.

5. В дебюте Microsoft Visual Basic для приложений в окне кода замените исходный код в окне кода следующим кодом VBA.

Код VBA: кнопка управления для сохранения активного листа в формате PDF

Внимание: В коде CommandButton1 - это имя командной кнопки, которую вы будете использовать для сохранения активного листа в виде файла PDF. «C: \ PDF \ Export.pdf» - это путь и имя вашего сохраняемого файла PDF.

6. нажмите другой + Q клавиши одновременно, чтобы закрыть Microsoft Visual Basic для приложений окно. Затем выключите Режим проектирования под разработчик меню.

Теперь нажмите кнопку Command, активный рабочий лист будет сохранен в виде файла PDF с именем «Экспорт» и расположен в указанном месте.

Сохраните каждый рабочий лист как отдельный PDF-файл активной книги с помощью Kutools for Excel

Здесь рекомендую Разделить книгу полезности Kutools for Excel чтобы легко сохранить активный рабочий лист в виде файла PDF. Кроме того, с помощью этой утилиты вы также можете сохранить каждый рабочий лист в текущей книге как отдельный файл PDF.

Перед применением Kutools for Excel, Пожалуйста, сначала скачайте и установите.

1. В книге вам необходимо сохранить каждый лист как отдельный файл PDF, затем щелкнуть Kutools Plus > Workbook > Разделить книгу. Смотрите скриншот:

2. в Разделить книгу диалоговое окно, настройте следующим образом:

2.1) Проверяйте только имя активного листа в Имя рабочего листа коробка; 2.2) Выбрать PDF (* .pdf) из файла Сохранить как раскрывающийся список; 2.3) Нажмите Трещина кнопку, затем Выбор папки появится диалоговое окно, укажите папку для сохранения файла PDF;

Затем выбранный рабочий лист сразу сохраняется как файл PDF.

Заметки:

1. Вы можете отметить несколько имен рабочих листов в поле Имя рабочего листа, чтобы сохранить их как отдельный файл pdf одновременно; 2. За исключением сохранения рабочего листа в виде файлов PDF, вы можете сохранять рабочие листы в формате txt. или csv. файл как вам нужно.

Если вы хотите получить 30-дневную бесплатную пробную версию этой утилиты, пожалуйста, нажмите, чтобы загрузить это, а затем перейдите к применению операции в соответствии с указанными выше шагами.

Не судите строго:я пытаюсь научиться
ЯД 41001877306852/WM R249698041931; Z239672726538

китин,
как в макрорекодере записать что бы запрос на путь сохранения?
AndreTM,
Спасибо большое, но не выдает запрос на пусть сохранения. китин,
как в макрорекодере записать что бы запрос на путь сохранения?
AndreTM,
Спасибо большое, но не выдает запрос на пусть сохранения. Edvin Это уже следующий вопрос. а поиском по форуму вы пользоваться не умеете?
И не знаете ни про .GetSaveAsFilename ни про .FileDialog Это уже следующий вопрос. а поиском по форуму вы пользоваться не умеете?
И не знаете ни про .GetSaveAsFilename ни про .FileDialog AndreTM Это уже следующий вопрос. а поиском по форуму вы пользоваться не умеете?
И не знаете ни про .GetSaveAsFilename ни про .FileDialog Автор - AndreTM
Дата добавления - 17.12.2013 в 15:04 Если бы я знал, я бы не спрашивал,а сделал сам:)я в макросах совсем не разбираюсь. Сохранить в ПДФ можно было бы действительно через рекордер, но я не знаю как сделать что бы что бы выдавал запрос на путь сохранения. Не могли бы вы составить макрос полностью? Если бы я знал, я бы не спрашивал,а сделал сам:)я в макросах совсем не разбираюсь. Сохранить в ПДФ можно было бы действительно через рекордер, но я не знаю как сделать что бы что бы выдавал запрос на путь сохранения. Не могли бы вы составить макрос полностью? Edvin


а когда вы сохраняете как вам разве не выходит окно с путем сохранения?и что мешает прописать там нужный путь?
ЗЫ.я в макросах сам только разбираться начал


а когда вы сохраняете как вам разве не выходит окно с путем сохранения?и что мешает прописать там нужный путь?
ЗЫ.я в макросах сам только разбираться начал китин

Не судите строго:я пытаюсь научиться
ЯД 41001877306852/WM R249698041931; Z239672726538

китин,
я описал выше зачем и почему мне нужен макрос китин,
я описал выше зачем и почему мне нужен макрос Edvin
задали в теме вопросы по Excel,а не в теме вопросы по VBA/
задали в теме вопросы по Excel,а не в теме вопросы по VBA/ китин
задали в теме вопросы по Excel,а не в теме вопросы по VBA/ Автор - китин
Дата добавления - 17.12.2013 в 16:16 То есть вы даже кописастом пользоваться не научились. Нет, скорее вы до сих пор не знаете расположение клавиши F1 и поля поиска.
[vba] [/vba]Обратите внимание на то, что сохраняемый лист задан явно, и он не обязательно текущий-активный. То есть вы даже кописастом пользоваться не научились. Нет, скорее вы до сих пор не знаете расположение клавиши F1 и поля поиска.
[vba] [/vba]Обратите внимание на то, что сохраняемый лист задан явно, и он не обязательно текущий-активный. AndreTM То есть вы даже кописастом пользоваться не научились. Нет, скорее вы до сих пор не знаете расположение клавиши F1 и поля поиска.
[vba] [/vba]Обратите внимание на то, что сохраняемый лист задан явно, и он не обязательно текущий-активный. Автор - AndreTM
Дата добавления - 17.12.2013 в 22:05 AndreTM,
большое спасибо за макрос.
Я конечно понимаю, что новичка пнуть - святое дело:), но если я абсолютно не разбираюсь в макросах, не думаю, что F1 мне сильно поможет. У вас написание макроса заняла несколько минут, я бы на работе сидел не один час. Я думал форумы и нужны для взаимопомощи:) AndreTM,
большое спасибо за макрос.
Я конечно понимаю, что новичка пнуть - святое дело:), но если я абсолютно не разбираюсь в макросах, не думаю, что F1 мне сильно поможет. У вас написание макроса заняла несколько минут, я бы на работе сидел не один час. Я думал форумы и нужны для взаимопомощи:) Edvin

Ой, какие высокие слова!

А позвольте полюбопытствовать, кому тут вы взаимопомогли?

Ой, какие высокие слова!

А позвольте полюбопытствовать, кому тут вы взаимопомогли? RAN

Ой, какие высокие слова!

А позвольте полюбопытствовать, кому тут вы взаимопомогли? Автор - RAN
Дата добавления - 18.12.2013 в 12:53

Тема очень кстати) Как-раз искал такую.)

AndreTM, я попробовал прописать кнопку, после нажатия предлагает сохранить, выбираю место куда сохранить, жму Save выскакивает такое чучело(см. приложение)
и обведенные желтым строки становятся желтыми.)) Подскажите, пожалуйста, в чем может быть проблема?

Тема очень кстати) Как-раз искал такую.)

AndreTM, я попробовал прописать кнопку, после нажатия предлагает сохранить, выбираю место куда сохранить, жму Save выскакивает такое чучело(см. приложение)
и обведенные желтым строки становятся желтыми.)) Подскажите, пожалуйста, в чем может быть проблема? DAKRAY

AndreTM, я попробовал прописать кнопку, после нажатия предлагает сохранить, выбираю место куда сохранить, жму Save выскакивает такое чучело(см. приложение)
и обведенные желтым строки становятся желтыми.)) Подскажите, пожалуйста, в чем может быть проблема? Автор - DAKRAY
Дата добавления - 18.12.2013 в 13:35

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

Исходные данные

Сначала давайте разберем исходные данные, которые я буду использовать в примерах. Пусть это будет некая абстракция марок автомобилей с указанием их VIN номера.

Примечание! Я использую Excel 2013.

Скриншот 2

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

Начнем мы с самой простой ситуации, когда заранее известна ячейка, на основе которой будет сформировано имя файла, и адрес этой ячейки изменяться не будет.

Итак, данные у нас есть, теперь необходимо написать процедуру на VBA (макрос), которая брала бы значение из конкретной ячейки, в данном случае это будет ячейка B14, и присваивала бы это значение имени файла.

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

Открываем в Excel редактор Visual Basic, и вставляем код следующей процедуры в исходный код этой книги (ЭтаКнига, открыть двойным кликом) или в модуль, который Вы предварительно должны создать.

Примечание! Для того чтобы открыть редактор Visual Basic в Excel, необходимо перейти на вкладку «Разработчик» и нажать на кнопку «Visual Basic». Файл Excel с кодом процедуры необходимо сохранить с типом «Книга Excel с поддержкой макросов».

Код процедуры

После сохранения файла запустите макрос («Макросы -> Выполнить -> SaveFile»).

Скриншот 3

Добавление кнопки в Excel для запуска макроса

Каждый раз открывать окно с макросами и выбирать нужный макрос не очень удобно, поэтому можно легко добавить кнопку где-нибудь рядом с данными и просто нажимать ее. Это делается следующим образом «Вкладка Разработчик -> Вставить -> Кнопка (элемент управления формы)».

Скриншот 4

Затем выберите место, где вставить кнопку, и нажмите туда. После этого появится окно назначения действия, т.е. нужно выбрать, какой макрос запускать при нажатии этой кнопки, выбираем наш макрос, т.е. SaveFile, и нажимаем «ОК».

Скриншот 5

В итоге появится кнопка с названием «Кнопка», это название лучше изменить, например, на «Сохранить файл». Для этого нажмите правой кнопкой мыши на кнопку и выберите настройки «Изменить текст». В итоге у Вас должно получиться что-то вроде этого.

Скриншот 6

Теперь давайте представим, что заранее мы не можем определить, какая именно ячейка будет формировать название файла (может B14, а может и нет), поэтому мы можем немного скорректировать алгоритм таким образом, чтобы он брал значение из ячейки, которая является активной, но в этом случае Вы, конечно же, предварительно, должны выбрать ее (т.е. встать на нее).

Замените код процедуры следующим кодом, который совсем немного, но изменен.

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

Скриншот 7

Как видим, все отработало.

Сохранение файла Excel с названием, которое сформировано из значений двух ячеек

Теперь представим, что нам нужно сформировать файл с названием из значений двух ячеек. Например, в нашем случае это может быть «Марка Авто – VIN Номер», в качестве разделителя я указал символ – (дефис), но им может выступать любой символ или вовсе отсутствовать.

В этом примере я покажу, как можно это реализовать с привязкой к конкретным ячейкам, в нашем случае B14 и D14.

Код процедуры в данном случае будет выглядеть следующим образом.

Скриншот 8

Все ОК, файл создан.

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

Для этого мы снова внесем изменения в нашу процедуру, которая будет работать от активной ячейки (смещение от активной ячейки), только с условием того, что выбран столбец с теми значениями, которые необходимо использовать.

Код процедуры

Становитесь на любую ячейку со значением в столбце B, и запускайте макрос.

Читайте также: