Генеруємо документи microsoft word на php

Ми живемо в світі, де PHP розробникам доводиться час від часу взаємодіяти з операційною системою Windows. WMI (Windows Management Interface, Інтерфейс управління Windows) - один з таких прикладів - взаємодія з Microsoft Office.

У даній статті ми розглянемо просту інтеграцію між Word і PHP: генерацію документа Microsoft Word на основі полів введення в HTML-формі за допомогою PHP (і його розширення Interop).

підготовчі кроки

Насамперед переконаємося, що у нас налагоджена базове оточення WAMP. Так як Interop присутній тільки в Windows, то нам необхідно, щоб наш сервер Apache і інсталяція PHP були розгорнуті на Windows машині. На цій посаді я використовую EasyPHP 14.1. який вкрай простий в установці та налаштування.

Також необхідно переконатися, що у нас встановлені бібліотеки для розробки програми Interop (PIA, Primary Interop Assemblies, Основні Складання Interop). Дізнатися це можна відкривши Провідник Windows, і перейшовши в директорію \ Assembly. і там ми повинні побачити набір встановлених збірок:

Генеруємо документи microsoft word на php

Тут можна побачити елемент Microsoft.Office.Interop.Word (підкреслять на скріншоті). Це буде та збірка, яку ми будемо використовувати в нашій демонстрації. Будь ласка, зверніть особливу увагу на поля "Assembly name (Ім'я збірки)", "Version (Версія)" і "Public key token (Токен публічного ключа)". Їх ми скоро будемо використовувати в нашому PHP скрипт.

У цій директорії також присутні і інші збірки (включаючи і все сімейство Office), доступні для використання в своїх програмах (не тільки для PHP, але також і для VB.net, C #, і т.д.).

Якщо список збірок не включає весь пакет Microsoft.Office.Interop. то нам потрібно або перевстановити Office, додавши PIA, або вручну завантажити пакет з сайту Microsoft і встановити його. Для більш детальних інструкцій зверніться до цієї сторінки на MSDN.

І, нарешті, необхідно включити розширення php_com_dotnet.dll в php.ini і перезапустити сервер.

Тепер можна перейти до програмування.

HTML форма

Так як основна частина даного прикладу лягає на серверну сторону, ми створимо просту сторінку з формою, яка буде виглядати наступним чином:

Генеруємо документи microsoft word на php

У нас є текстове поле для імені, група перемикачів для підлоги, слайдер для віку, і область введення, щоб ввести повідомлення, а також відома кнопка "Відправити".

серверна частина

Файл-обробник на серверній стороні - це основна мета нашої розмови. Для початку я приведу повний код цього файлу, а потім поясню його крок за кроком.

Після того, як ми записали в змінну $ inputs значення, отримані з форми, а також створили порожній елемент з ключем printdate (навіщо ми це зробили - обговоримо пізніше), ми переходимо до чотирьох дуже важливим рядках:

Маніпулятор COM в PHP вимагає створення екземпляра класу в рамках "збірки". У нашому випадку ми працюємо з Word. Якщо поглянути на перший скріншот, то можна записати повну сигнатуру збірки для Word:

Клас, на який ми хочемо посилатися, завжди називається "імя.сборкі" + ".ApplicationClass".

Встановивши два цих параметра ми зможемо отримати об'єкт для роботи з Word.

Цей об'єкт може залишатися в тлі, або ми можемо перевести його в робочий режим установкою атрибута visible в true.

Наступним кроком відкриваємо документ, що вимагає обробки, і записуємо екземпляр "документа" в змінну $ d.

Щоб створити в документі вміст, засноване на даних з форми, можна піти декількома шляхами.

Самим неправильним було б жорстко прописати вміст документа в PHP, а потім вивести його в документ Word. Я настійно рекомендую цього не робити з наступних причин:

  1. Ви втрачаєте гнучкість. Будь-які зміни в вихідному файлі зажадають зміни коду PHP.
  2. Це порушує поділ управління та виду
  3. Застосування стилів до вмісту документа (вирівнювання, шрифти, стилі, і т.д.) в скрипті сильно збільшить кількість рядків коду. Програмне зміна стилів надто громіздко.

Іншим варіантом буде використання пошуку і заміни. У PHP є хороші вбудовані засоби для цього. Ми можемо створити документ Word, в якому розмістимо мітки зі спеціальними роздільниками, які в наслідку будуть замінені. Наприклад, ми можемо створити документ, який буде містити наступний фрагмент:

а за допомогою PHP ми легко можемо замінити його на вміст поля "Ім'я", отримане з форми.

Це просто, і позбавляє нас від усіх неприємних наслідків, з якими ми стикаємося в першому способі. Нам лише потрібно визначитися з правильним роздільником, і в цьому випадку ми, виходить, використовуємо шаблон.

Я рекомендую третій спосіб, і він ґрунтується на більш глибокому знанні Word. Як заповнювачі ми будемо використовувати поля, а за допомогою PHP коду будемо безпосередньо оновлювати значення в полях відповідними значеннями.

Цей підхід гнучкий, швидкий, і узгоджується з кращими практиками роботи з Word. З його допомогою також можна уникнути повнотекстового пошуку в документі, що добре позначається на продуктивності. Зауважу, що у цього рішення також є недоліки.

Word з самого початку не підтримував іменні індекси для полів. Навіть якщо ми і вказали імена для створюваних полів - нам все одно необхідно користуватися числовими ідентифікаторами цих полів. Це також пояснює, навіщо нам потрібно використовувати окрему функцію (setupfields) для того, щоб задати відповідність індексу поля і імені поля з форми.

У цьому демонстраційному уроці ми будемо використовувати документ з 5 полями MERGEFIELD. Шаблонний документ розмістимо там же, де і наш скрипт-обробник.

Прошу зауважити, що поле printdate не має відповідного поля на формі. Ось навіщо ми додали порожній елемент printdate в масив $ inputs. Без цього скрипт все ж буде запускатися і працювати, але PHP буде видавати попередження, що індекс printdate відсутня в масиві $ inputs.

Після заміни полів новими значеннями ми віддрукуємо документ за допомогою

Метод PrintOut приймає кілька необов'язкових параметрів, і ми використовуємо найпростішу його форму. Так буде видрукувана одна копія документа на принтері за замовчуванням, який приєднаний до Windows-машині.

Також можна викликати PrintPreview. щоб поглянути на отриманий результат, перш ніж його віддрукувати. У повністю автоматичному оточенні ми, звичайно ж, будемо використовувати метод PrintOut.

Необхідно почекати деякий час, перш ніж завершити роботу з додатком Word, так потрібен час на те щоб поставити в чергу завдання на друк. Без delay (3) метод $ w-> Quit виконується негайно, і завдання не ставиться в чергу.

Нарешті, ми викликаємо $ w-> Quit (false). що закриває додаток Word, яке було викликано нашим скриптом. Єдиним параметром, що передаються в метод, є вказівка ​​зберегти файл перед виходом. Ми зробили правки в документі, але ми не хочемо їх зберігати, так як нам потрібен чистий шаблон для подальшої роботи.

Після того, як ми закінчили з кодом, можемо завантажити нашу сторінку з формою, забити деякі значення, і відправити її. Наведені нижче зображення показують результат роботи скрипта, а також оновлений документ Word:

Генеруємо документи microsoft word на php

Генеруємо документи microsoft word на php

PHP - слабо типізований мову. Об'єкт COM типу Object. Під час написання скрипта у нас немає можливості отримати опис об'єкта, будь воно додатком Word, документом або полем. Ми не знаємо, які властивості є у цього об'єкта, або які він підтримує методи.

Це сильно уповільнить швидкість розробки. Щоб прискорити розробку, я б рекомендував писати функції спочатку на C #, а після переводити код в PHP. Я можу рекомендувати безкоштовну IDE для розробки на C # під назвою "#develop". Знайти її можна тут. Я віддаю перевагу її Visual Studio, так як #develop менше, простіше і швидше.

Міграція C # коду в PHP не так страшна, як здається. Давайте я покажу вам пару рядків на C #:

Можна помітити, що код на C # дуже схожий на код PHP, який я показував раніше. C # - строго типізований мову, так що в цьому прикладі можна помітити кілька операторів приведення типів, а також змінним необхідно вказувати тип.

Із зазначенням типу змінної, можна насолоджуватися більш зрозумілим кодом і автодоповнення, і швидкість розробки істотно підвищується.

Інший спосіб підвищити швидкість розробки на PHP - викликати макрос в Word. Ми проводимо ту ж послідовність дій, а після зберігаємо її як макрос. Макрос написаний на Visual Basic, який також просто перевести в PHP.

І, що найважливіше - документація по Office PIA від Microsoft. особливо документація по просторах імен кожної програми Office є самим детальним довідковим матеріалом. Найбільш використовувані три програми:

висновок

У цій статті ми показали, як заповнити даними документ Word за допомогою бібліотек PHP COM і можливостями взаємодії Microsoft Office.

Windows і Office широко використовуються в повсякденному житті. Знати силу Office / Window і PHP буде корисно кожному PHP і Windows розробнику.

За допомогою розширення PHP COM вам відчиняються двері до використання цієї комбінації.

Генеруємо документи microsoft word на php

За рахунок отримання інформації відразу по двох каналах (зір і слух) ефективність навчання значно перевершує навчання по книгах. А домашні завдання і онлайн-тести дозволять вам постійно думати на мові, що вивчається і відразу перевіряти свої знання!

Генеруємо документи microsoft word на php

Генеруємо документи microsoft word на php

Якщо ви давно хочете як слід вивчити HTML, то у мене для Вас є чудова новина!

Генеруємо документи microsoft word на php

Якщо ви вже вивчили HTML і хочете рухатися далі, то наступним кроком буде вивчення технології CSS.

Генеруємо документи microsoft word на php

Якщо ви хочете розібратися з поняттями домену і хостингу, навчитися створювати бази даних, закачувати файли сайту на сервер по FTP, створювати піддомени, налаштовувати поштові скриньки для свого сайту і стежити за його відвідуваністю, то цей курс створений спеціально для вас!

Схожі статті