Ми живемо у світі, де 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, який вкрай простий в установці та налаштуванні.

Наступною справою необхідно інсталювати Microsoft Office. Версія не дуже важлива. Я використовую Microsoft Office 2013 Pro, але будь-яка версія Office старше 2007 повинна підійти.

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

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

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

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

Зауваження: до завантаження та встановлення доступний лише дистрибутив PIA Microsoft Office 2010. Версія збірок у цьому пакеті 14.0.0, а 15 версія поставляється лише з Office 2013.

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

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

HTML форма

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

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

Збережіть цей файл як “index.html” у директорії віртуального хоста, щоб до нього можна було дістатися за адресою типу http://test/test/interop.

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

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

visible = true; $fn = __DIR__ . "\\template.docx"; $d = $w->Documents->Open($fn); echo "Документ відкритий.


$flds = $d->Fields; $count = $flds->Count; echo "У документі $count полів.
"; echo"
    $mapping = setupfields(); foreach ($flds as $index => $f) ( $f->Select(); $key = $mapping[$index]; $value = $inputs[$key]; if ($key == "gender") ( if ($value == "(!LANG:m") $value = "Mr."; else $value = "Ms."; } if($key=="printdate") $value= date ("Y-m-d H:i:s"); $w->Selection->TypeText($value); echo "!}
  • Призначаю полю $index: $key значення $value
  • ";) echo "
"; echo "Обробка завершена!

"; echo "Друкую, будь ласка, зачекайте...
$d->PrintOut(); sleep(3); echo "Готово!"; $w->Quit(false); $w=null; function setupfields() ( $mapping = array(); $mapping = "gender"; $mapping = "name"; $mapping = "age"; $mapping = "msg"; $mapping = "printdate"; return $mapping;

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

$assembly = "Microsoft.Office.Interop.Word, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"; $class = "Microsoft.Office.Interop.Word.ApplicationClass"; $w = new DOTNET($assembly, $class); $w->visible = true;

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

  • "Name", "Version", "Public Key Token" - все це береться з інформації, яку можна переглянути в "c: \ Windows \ assembly".
  • “Culture” завжди neutrual

Клас, який ми хочемо посилатися, завжди називається “имя.сборки”+ “ .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 .

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

$d->PrintOut();

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

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

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

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

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

Покращення швидкості обробки та трохи докладніше про PIA

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

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

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

Word.Application w=new Word.Application(); w.Visible=true; String path=Application.StartupPath+"\template.docx"; Word.Document d=w.Documents.Open(path) as Word.Document; Word.Fields flds=d.Fields; int len=flds.Count; foreach (Word.Field f in flds) ( f.Select(); int i=f.Index; w.Selection.TypeText("..."); )

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

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

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

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

  • Excel 2013: http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel(v=office.15).aspx
  • Word 2013: http://msdn.microsoft.com/en-us/library/microsoft.office.interop.word(v=office.15).aspx
  • PowerPoint 2013: http://msdn.microsoft.com/en-us/library/microsoft.office.interop.powerpoint(v=office.15).aspx

Висновок

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

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

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

Продовжуємо розпочату раніше тему роботи з формами в Word. У попередніх статтях дивилися на форми лише з погляду “просунутого користувача”, тобто. ми створювали документи зручні для ручного заповнення. Сьогодні ж я хочу запропонувати розширити це завдання та спробувати використати механізм Content controls для генерації документів.

Перш ніж ми приступимо до нашого безпосереднього завдання, хочу сказати пару слів з приводу того, як зберігаються в документах Word дані для сontent controls (то як вони прив'язуються до вмісту документа я свідомо поки опущу, але сподіваюся повернутися до цього якось у наступних статтях).

Закономірне питання – а що таке itemProps1.xmlта аналогічні компоненти? У цих компонентах зберігаються описи джерел даних. Швидше за все, за задумом розробників крім вбудованих у документ xml-ек, передбачалося використовувати й інші, але поки що реалізований тільки цей спосіб.

Чим корисні нам itemPropsX.xml? Тим, що в них перераховані xml-схеми (їх targetNamespace), які використовуються в батьківському itemX.xml. Це означає, що якщо ми підключили в документ не одну custom xml, то щоб знайти потрібну нам потрібно пробігтися по itemPropsX.xmlкомпонентам і знайти потрібну схему, а отже, і потрібний itemX.xml.

Наразі ще один момент. Ми не будемо вручну аналізувати зв'язки між компонентами та шукати потрібні, використовуючи лише базовий Packaging API! Натомість ми скористаємося Open XML SDK (його збірки доступні через NuGet). Звичайно, раніше ми не словом не говорили про цей API, але для нашого завдання від нього потрібно мінімум і весь код буде достатньо прозорим.

Ну що ж, основне введення зроблено, можна братися до прикладу.

За традицією, що склалася, візьмемо все той же “Звіт про нараду”, який ми малювали в статті . Нагадаю, що так виглядав шаблон документа:

А ось так, XML до якого прив'язувалися поля документа

< meetingNotes xmlns ="urn:MeetingNotes" subject ="" date ="" secretary ="" > < participants > < participant name ="" /> < decisions > < decision problem ="" solution ="" responsible ="" controlDate ="" />

Крок 1. Створення моделі даних

Власне наше завдання не просто згенерувати документ, а створити (хоча б у чорновому варіанті) зручний інструмент для використання як розробником, так і користувачем.

Тому модель ми оголосимо у вигляді структури С#-класів:

Public class MeetingNotes ( public MeetingNotes() ( Participants = new List (); Decisions = new List (); ) public string Subject ( get; set; ) public DateTime Date ( get; set; ) public string Secretary ( get; set; ) public List Participants ( get; set; ) Public List Decisions ( get; set; ) ) public class Decision ( public string Problem ( get; set; ) public string Solution ( get; set; ) public string Responsible ( get; set; ) public DateTime ControlDate ( get; set; ) ) public class Participant (public string Name (get; set;))

За великим рахунком нічого особливого, хіба що додані атрибути для керування XML-серіалізацією (т.к. імена в моделі і XML, що вимагається, трохи різняться).

Крок 2. Серіалізація наведеної вище моделі у XML

Завдання, в принципі, тривіальне. Що називається "беремо наш улюблений XmlSerializer і вперед", якби не одне але

На жаль, у поточної версії Office, мабуть, є баг, який полягає в наступному: якщо в custom xml передоголошенням основного namespace (того, з якого Word повинен брати елементи для відображення), оголосити ще який-небудь, то Content controls, що повторюються, починають відображатися не вірно (показується тільки стільки елементів, скільки було в самому шаблоні - тобто repeating section не працює ).

Тобто. ось такий xml працює:

< test xmlns ="urn:Test" attr1 ="1" attr2 ="2" > < repeatedTag attr ="1" /> < repeatedTag attr ="2" /> < repeatedTag attr ="3" />

і ось такий теж:

< test xmlns ="urn:Test" attr1 ="1" attr2 ="2" xmlns:t ="urn:TTT" > < repeatedTag attr ="1" /> < repeatedTag attr ="2" /> < repeatedTag attr ="3" />

а ось такий вже немає:

< test xmlns:t ="urn:TTT" xmlns ="urn:Test" attr1 ="1" attr2 ="2" > < repeatedTag attr ="1" /> < repeatedTag attr ="2" /> < repeatedTag attr ="3" />

я намагався відправити баг на підтримку Microsoft на Connect , але в мене чомусь закритий доступ для відправки багів по Office. А обговорення на форумі MSDN також не допомогло.

Загалом потрібний обхідний маневр. Якби ми формували XML руками, проблем не виникло б – ми зробили б усе самі. Однак у цьому випадку дуже хочеться використовувати стандартний XmlSerializer, який за замовчуванням додає кілька своїх namespace у вихідний XML, навіть якщо ці namespace не використовуються.

Ми зробимо повне придушення виведення власних namespace в XmlSerializer. Правда, цей підхід спрацює, тільки якщо вони йому і справді будуть не потрібні (інакше вони все одно будуть додані і якраз до нашого).

Власне, весь код (за умови, що змінна meetingNotesмістить раніше заповнений об'єкт типу MeetingNotes):

var serializer = новий XmlSerializer(typeof (MeetingNotes));
var serializedDataStream = новий MemoryStream();

var namespaces = новий XmlSerializerNamespaces();
namespaces.Add(“”, “”);

serializer.Serialize(serializedDataStream, meetingNotes, namespaces);
serializedDataStream.Seek(0, SeekOrigin.Begin);

Крок 3. Заносимо отриману XML Word-документ.

Тут ми чинимо так:

  • копіюємо шаблон і відкриваємо копію
  • знаходимо в ній потрібний custom xml (шукаємо по namespace “urn:MeetingNotes”)
  • замінюємо вміст компонента, на нашу XML

File.Copy(templateName, resultDocumentName, true); using (var document = WordprocessingDocument.Open(resultDocumentName, true )) ( var xmlpart = document.MainDocumentPart.CustomXmlParts .Single(xmlPart => xmlPart.CustomXmlPropertiesPart.DataStoreItem.SchemaReferences.OfType () .Any(sr => sr.Uri.Value == "(!LANG:urn:MeetingNotes"!}

Всі ми маємо справу з текстами так чи інакше. Іноді виникає потреба згенерувати велику чи не дуже велику кількість тексту для будь-яких завдань, наприклад, погратися з форматуванням, а тексту під рукою немає, самому писати ліньки. Що робити? Відповідь проста: скористатися вбудованим у Word генератором випадкових текстів!

У редакторі Microsoft Word можна генерувати текст досить швидко та легко за допомогою спеціальних команд. Як піддослідний кролик використовуватиму Word 2007. Ці команди повинні працювати у всіх версіях Word. Розповім про три методи генерації тексту.

Метод 1. Використання rand()

Функція rand() вставляє локалізований зразок тексту, 3 абзаци по 3 речення. Відкрийте ваш Word, поставте курсор на те місце, де скоро з'явиться купа тексту і введіть команду:

та натисніть Enter. Сама функція rand зникне і замість неї з'явиться 3 абзаци тексту:

Але це ще не все. Якщо вам потрібно багато тексту, можна використовувати функцію rand з додатковими аргументами, ось у такому вигляді:

=rand(x,y)

де « x» означає кількість абзаців, а « y» — кількість пропозицій у кожному абзаці. Наприклад, =rand(20,5)вставить 20 абзаців із п'ятьма фразами в кожному. А =rand(7)вставить 7 абзаців по 3 речення на кожен.

Метод 2. Використання lorem()

Щоб вставити старий добрий Lorem Ipsum як зразок – застосовуємо функцію lorem(). Введіть наступну команду та натисніть Enter:

І отримаємо ось такий всевдо-латинський текст

Функція lorem() також охоче приймає додаткові аргументи, як і rand(), як кількість абзаців і пропозицій. Без аргументів функція вставляє за замовчуванням 3 абзаци з трьома пропозиціями у кожному.

Метод 3. Функція rand.old()

Використання аналогічно попереднім командам:

=rand.old()

та натиснути Enter.

Функція rand.old() залишена для сумісності зі старим офісом, до 2003 року включно. Спосіб застосування такий самий, як і в попередніх двох, тільки текст складатиметься з однакових фраз «З'їж ще цих м'яких французьких булок, та випий чаю». Цю фразу знає кожен, кому доводилося інколи працювати зі шрифтами.

Можна передавати аргументи, як і перших двох методах.

Ось і все, текстів нагенерили, тепер можна з'їсти ще цих м'яких французьких булок та випити чаю:)

Чи вдалося ви вставити текст за допомогою вищезгаданих функцій?

Якось після підбиття підсумків олімпіади, коли учасникам вимагалося розіслати листами з результати з зданих (або не зданих) предметів, я помітив, що дівчина сидить і руками вносить у шаблон листа результати іспиту, ПІБ школяра та іншу інформацію. Перед нею лежало кілька роздрукованих із Excel аркушів із прізвищами та оцінками. Copy-Paste, Ctrl+C - Ctrl+V, переклад ПІБ з називного в родовий відмінок і так вже була виконана робота з половиною першого з трьох аркушів з даними. Скільки на вашу вона могла б ще просидіти копіюючи дані, а потім перевіряючи результат? Думаю досить довго, та й помилок було б чимало. Адже їй потім треба було підписувати поштові конверти... Мені стало шкода її часу і за кілька хвилин я показав, як можна за допомогою простих засобів цей процес автоматизувати. Після невеликого екскурсу її роботу було закінчено за 20 хвилин.

У цьому уроці я покажу Вам якнайшвидше створювати документи (листи, запрошення) витрачаючи на це мінімум часу. У різних версіяхмовами цей описуваний процес називається по-різному. Так у російській це «Злиття», а в англійській - «Merge».

Сподіваюся, що «листи щастя» від пенсійного фонду, податкові повідомлення створюються у такий самий спосіб:)

Інструменти

Для створення документів нам знадобиться OpenOffice Writer. У ньому ми створюватимемо шаблон листа. Знадобиться також OpenOffice Calc. У ньому ми створимо базу з прізвищами та адресами тих осіб, яких ми, наприклад, хочемо запросити на вечірку. Замість програм із пакета OpenOffice легко можуть використовуватися MS Word та Excel. База даних може легко лежати у MS Access. І так приступаємо.

Створення бази даних

База даних - це ніщо інше як таблиця в MS Excel або OpenOffice Calc, де дані розміщуються в стовпцях, а перший рядок використовується для іменування стовпців. Заведемо, наприклад, стовпці «ПІБ», «місто», «індекс», «адреса». Введемо дані та збережемо файл на диск.



Як бази даних можуть використовуватися й інші джерела, наприклад адресна книга Outlook, або база даних MS Access.

Створення шаблону листа

Зі створенням шаблону листа справа трохи складніша. Оскільки шаблон будуть дані з таблиці (нашої бази даних) підставлятися як є, то й лист треба писати відповідним чином. Якщо у вас у базі даних ПІБ йде в називному відмінку, то навряд чи Вам вдасться використати це поле у ​​зверненні «Дорогий,<ФИО>!» і для конверта у рядку «Кому:<ФИО>». В останньому випадку ПІБ виглядатиме дещо коряво.

Складаючи шаблон листа, я рекомендую почати зі складання листа якомусь реальній людині. Можна самому собі. Потім у ньому виділити кольором ті дані, які Ви братимете з бази даних та замінити їх на відповідні поля. Перед тим, як замінювати виділений текст на поле, рекомендую звернути увагу на те, з якої літери має починатися поле в базі даних (малої або великої). Звичайно, можна складати шаблон з полями, але тоді Ви можете не помітити деяких ляпів, як нестиковка відмінків.



Вже в наведеному шаблоні видно, що нам знадобиться ПІБ у родовому відмінку та полі, що містять тільки ім'я та по батькові. З першим полем ми можемо замінити «Кому» на «Отримувач» і тоді ПІБ у називному відмінку нас цілком влаштує. З другим полем дещо складніше і нам доведеться завести в базі даних ще один стовпець і заповнити його відповідними даними. В одному з наступних уроків я розповім як це зробити автоматично, а поки вважатимемо що таке поле у ​​нас вже є.

Для вставлення поля та прив'язки шаблону до бази даних необхідно виконати таку послідовність дій. У OpenOffice Writer вибрати базу даних



та натиснути "Define" ("Визначити").



Потім потрібно вставити поле з підключеної бази даних. Для цього натиснути Ctrl+F2, або в меню "Вставка" вибрати пункт "Поля" та "Інше". У вікні вибрати вкладку "Бази даних", у типі поля вибрати "Mail Merge fields", з бази даних вибрати відповідне поле і натиснути "Вставити". Власне, базу даних можна також вибрати в цьому вікні.



Після того, як одне поле вставлено, можна не закриваючи поточного вікна, виділити текст для заміни на наступне поле, вибрати поле і знову натиснути «Вставити». І так для кожного із полів.

Для MS Word ситуація в чомусь схожа і, можливо, зручніша. Після створення таблиці в MS Excel запускаємо MS Word і переходимо на вкладку «Розсилки». На цій вкладці можна побачити три необхідні кроки: «Початок злиття», «Складання документа та вставка полів» та «Завершення». Є ще проміжний крок "Перегляд результату", але він є опціональним.

І так робота розпочинається з вибору документа. Це може бути листи, наклейки, звичайний документ Word. Тут же можна запустити майстер злиття, який проведе Вас через усі стадії цього процесу. Наступний крок – вибір одержувача, тобто бази даних. Тут Ви можете вибрати готову базу даних (наприклад, створену на попередньому етапі таблицю MS Excel) або створити новий список. Після того, як список вибраний, стають активними кнопки «Вставити поле злиття», «Змінити список одержувачів» та ін. Через діалог «Змінити список одержувачів», який відкривається відповідною кнопкою, можна вибрати з усього списку лише необхідні для злиття запису.







При вставці полів мені здається зручним підсвітити всі поля сірим кольором, натиснувши кнопку «Виділити поля злиття». В іншому випадку, якщо таких полів багато, їх можна втратити в тексті.

Отже, шаблон готовий.

Генерація листів

Останній етап – генерація листів. В OpenOffice для цього в меню "Інструменти" вибираємо "Mail Merge Wizard..." і проходимо всі пропоновані кроки по об'єднанню нашого шаблону з базою даних.





У діалоговому вікні ми бачимо, що із запропонованих 8 пунктів нам деякі пункти виконувати не доведеться. Тож документ ми вже створили і редагувати його нам не треба, блок адреси ми теж уже вставили. Але давайте по-порядку.

Спочатку вибираємо, що створюємо листи на основі поточного документа і тиснемо "Далі" внизу вікна. Другим пунктом вибираємо, чи буде у нас цей паперовий лист або e-mail. Щоб лист можна було зберегти у файл слід вибрати перше. Тиснемо «Далі». Третім пунктом пропонують створити блок адреси, але оскільки ми його створили руками, то знімаємо всі галочки і переходимо до наступного кроку. Тут нам пропонують вставити звернення, але воно в нас теж уже є, тому тиснемо «Далі». Шостим пунктом можна відредагувати документ, подивитися документ із вставленими з бази даних полями і, якщо треба, якісь поля виключити.



На кроці 7 пропонується відредагувати кожен із створених у результаті з'єднання шаблону з базою даних файлів. І нарешті на останньому, 8 кроці, можна вибрати, що зробити з отриманими документами. Можна зберегти, роздрукувати або надіслати електронною поштою. При цьому можна зберігати всі документи в один файл або кожен документ окремо.

У MS Word процес злиття закінчується натисканням кнопки «Знайти та об'єднати».



З меню, що випадає, очевидно, що всі листи можна надрукувати і надіслати через e-mail, але не очевидно, що всі їх можна зберегти в файл. Для збереження треба вибрати перший пункт - "Змінити окремі документи". При цьому відкриється новий документ, в якому кожен новий лист розташовуватиметься з нової сторінки, а тут цей файл можна і зберегти.

Висновок

І так, у цьому уроці Ви дізналися, як використовуючи інструмент злиття створювати документи на основі шаблону. Давайте коротко запишемо послідовність дій:

  1. Необхідно в табличному процесорі створити базу даних, з якої будуть братися дані заповнення полів.
  2. Необхідно створити шаблон листа.
  3. Зробити злиття і зберегти результат.

A, прізвища у стовпці Bта професії в стовпці C.

2. Створіть word документ (.doc або .docx)


(A), (B)і (C).

(A), (B)і (C) (A)- ім'ям, (B)- прізвищем, (C)- Професією.

Settingsпрограми.

3. Виберіть шляхи для файлів та папок


Select

4. Задайте аркуші та рядки потрібних даних


Excel file data sheets

Excel file data rows Excel file data sheets

1 .

Якщо ви хочете, щоб у формуванні документа брали участь усі аркуші та/або рядки вашого excel-файлу з даними - натисніть праворуч на відповідну кнопку з надписом Numbers(її напис при цьому зміниться на All).

5. Введіть шаблон імен нових word файлів


Введіть шаблон імен нових word-файлів:

New word files names template- це шаблон для імен нових документів, що генеруються програмою (word-файлів). Тут шаблон імен містить імена стовпців excel-файлу, обрамлені фігурними дужками: (A)і (B). При формуванні нового документа програма замінить усі (A)і (B)відповідними значеннями осередків з excel-файлу - це буде ім'ям нового документа (word-файла).

Ви можете задати свої обрамляючі символи на вкладці Settingsпрограми.

6. Натисніть "Generate"


Натисніть кнопку Generateі на екрані з'явиться прогрес виконання. Документів (word-файлів) буде створено рівно стільки, скільки рядків excel-файлу бере участь у формуванні.

7. Все


Усі документи (word-файли) створені та лежать у папці, вказаній у Folder to save the new word files. Всі:)

Exwog - генератор звітів з Excel у Word за шаблоном

Безкоштовний генератор файлів Word за шаблоном (файлом Word) на основі даних Excel файлу

Працює в Mac OS, Windows та Linux

Дозволяє ставити імена нових генерованих word файлів

Дозволяє задавати аркуші та рядки потрібних даних

Дозволяє ставити обрамляючі символи для імен стовпців Excel

Простий у використанні

Зберігайте ваші дані в Excel форматі (.xls та .xlsx) і генеруйте файли формату Word (.doc та .docx) у кілька кліків:)


Як це працює?

Погляньте на ваш файл Excel


У цьому прикладі excel-файл містить інформацію про клієнтів. Кожен рядок відповідає певному клієнту. Імена розташовані в стовпці A, прізвища у стовпці Bта професії в стовпці C.

Клацніть для перегляду

Створіть word документ (.doc або .docx)


Клацніть для перегляду

Створіть "шаблон" (word-файл) для формування нових документів (word-файлів). Тут текст "шаблону" містить імена стовпців excel-файлу, обрамлені фігурними дужками: (A), (B)і (C).

Програма буде генерувати нові документи щодо "шаблону" замінюючи все (A), (B)і (C)відповідними значеннями осередків із excel-файлу: (A)- ім'ям, (B)- прізвищем, (C)- Професією.

Також ви можете задати свої обрамляючі символи на вкладці Settingsпрограми.

Виберіть шляхи для файлів та папок


Виберіть шляхи для файлів та папок (кнопки з написом Select). У програмі ви задаєте такі шляхи:

Excel file with data (*.xls, *.xlsx)- це шлях до вашого Excel-файлу з даними (інформація про клієнтів);

Word template file (*.doc, *.docx)- це шлях до вашого "шаблону" (word-файлу, створеному на попередньому кроці);

Folder to save the new word files- це шлях до папки, в яку програма буде зберігати нові згенеровані документи.

Клацніть для перегляду

Вкажіть аркуші та рядки потрібних даних


Клацніть для перегляду

Задайте номери аркушів та рядків вашого excel-файлу з даними (інформація про клієнтів) за якими потрібно сформувати документи:

Excel file data sheets- номери аркушів вашого excel-файлу, які братимуть участь у формуванні нових документів;

Excel file data rows- номери рядків аркушів (аркушів, зазначених у Excel file data sheets) вашого excel-файлу які братимуть участь у формуванні нових документів. На підставі даних кожного вказаного рядка буде створено окремий документ (word-файл).

Нумерація листів та рядків у програмі починається з 1 .