Макрос для сохранения файла excel в pdf
Не так давно появилась задача создать простой сервис по созданию 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.
В зависимости от конкретных требований и условий, задачу можно реализовать по-разному, хотя принцип будет один и тот же, в этой статье мы рассмотрим несколько вариаций реализации.
Начнем мы с самой простой ситуации, когда заранее известна ячейка, на основе которой будет сформировано имя файла, и адрес этой ячейки изменяться не будет.
Итак, данные у нас есть, теперь необходимо написать процедуру на VBA (макрос), которая брала бы значение из конкретной ячейки, в данном случае это будет ячейка B14, и присваивала бы это значение имени файла.
Если нужно сохранять макрос в каждом файле, т.е. файлы с поддержкой макросов (расширение .xlsm), то необходимо просто указать другой тип файла при сохранении, а именно xlOpenXMLWorkbookMacroEnabled, в процедурах в комментариях я это указываю.
Открываем в Excel редактор Visual Basic, и вставляем код следующей процедуры в исходный код этой книги (ЭтаКнига, открыть двойным кликом) или в модуль, который Вы предварительно должны создать.
Примечание! Для того чтобы открыть редактор Visual Basic в Excel, необходимо перейти на вкладку «Разработчик» и нажать на кнопку «Visual Basic». Файл Excel с кодом процедуры необходимо сохранить с типом «Книга Excel с поддержкой макросов».
Код процедуры
После сохранения файла запустите макрос («Макросы -> Выполнить -> SaveFile»).
Добавление кнопки в Excel для запуска макроса
Каждый раз открывать окно с макросами и выбирать нужный макрос не очень удобно, поэтому можно легко добавить кнопку где-нибудь рядом с данными и просто нажимать ее. Это делается следующим образом «Вкладка Разработчик -> Вставить -> Кнопка (элемент управления формы)».
Затем выберите место, где вставить кнопку, и нажмите туда. После этого появится окно назначения действия, т.е. нужно выбрать, какой макрос запускать при нажатии этой кнопки, выбираем наш макрос, т.е. SaveFile, и нажимаем «ОК».
В итоге появится кнопка с названием «Кнопка», это название лучше изменить, например, на «Сохранить файл». Для этого нажмите правой кнопкой мыши на кнопку и выберите настройки «Изменить текст». В итоге у Вас должно получиться что-то вроде этого.
Теперь давайте представим, что заранее мы не можем определить, какая именно ячейка будет формировать название файла (может B14, а может и нет), поэтому мы можем немного скорректировать алгоритм таким образом, чтобы он брал значение из ячейки, которая является активной, но в этом случае Вы, конечно же, предварительно, должны выбрать ее (т.е. встать на нее).
Замените код процедуры следующим кодом, который совсем немного, но изменен.
Проверяем работу, становимся на нужную ячейку, и запускаем макрос (в процедуре я добавил проверку, если выбрана пустая ячейка, возникнет ошибка).
Как видим, все отработало.
Сохранение файла Excel с названием, которое сформировано из значений двух ячеек
Теперь представим, что нам нужно сформировать файл с названием из значений двух ячеек. Например, в нашем случае это может быть «Марка Авто – VIN Номер», в качестве разделителя я указал символ – (дефис), но им может выступать любой символ или вовсе отсутствовать.
В этом примере я покажу, как можно это реализовать с привязкой к конкретным ячейкам, в нашем случае B14 и D14.
Код процедуры в данном случае будет выглядеть следующим образом.
Все ОК, файл создан.
Если вдруг нужно реализовать без привязки к конкретным ячейкам, например, значения хранятся в определённых столбцах, но конкретная строка неизвестна Вам заранее. Например, у меня несколько строк со значениями, и какие конкретно значения взять за основу названия файла, я хочу указывать самостоятельно, непосредственно перед сохранением, но при этом не редактировать код процедуры.
Для этого мы снова внесем изменения в нашу процедуру, которая будет работать от активной ячейки (смещение от активной ячейки), только с условием того, что выбран столбец с теми значениями, которые необходимо использовать.
Код процедуры
Становитесь на любую ячейку со значением в столбце B, и запускайте макрос.
Читайте также: