Працюємо з MS Word із C#, частина 1
Я ж це вже робив, але хрін тепер знайдеш той шматок коду, гуглимо знову… Де знайти простий і зрозумілий посібник для початківця, а не тонкощі для мега-гуру?
Навігація за записами
Працюємо з MS Word із C#, частина 1. Відкриваємо шаблон, шукаємо текст усередині документа
Завдання: вивести дані до документа Word. Насправді, це дуже велика і неосяжна тема, приблизно як сам Word, 90% можливостей якого не використовуються звичайними користувачами. Зсуваємо до простішої і найчастіше зустрічається на практиці завдання, з якою свого часу довелося зіштовхнутися мені самому: треба вивести гарну довідку, договір, звіт або інший документ Word з додаванням даних із коду C#. Само собою повинні підтримуватись версії Word до 2007, так що про нові формати файлів доведеться забути.
Для початку пригадаємо, що Word є така чудова річ як шаблони. Відповідно, велику частину складного оформлення можна винести в них і з коду відкривати шаблон і вставляти дані в потрібні місця. Для початку обмежимося простими рядками (типове завдання у великих підприємствах - вставка дат, цифр, фіо і тому подібних речей, договір на таку суму, від такої дати з фіо таким з параметрами об'єкта такими).
Завдання на поточну статтю: відкрити з коду C# шаблон Word і щось у нього вставити. Шаблон у форматі .dot приготуємо заздалегідь, у тому самому ворді. Для зв'язку з ним використовуватимемо механізм COM Interoperability (скорочено Interop), тобто запускати окремий exe-процес самого Word і через спеціальний інтерфейс керувати ним. Інтерфейси слава богу є і знаходяться вони у спеціальних бібліотеках, що поставляються разом з Office, але документація по них вкрай невиразна, поведінкаподекуди дуже дивне і не логічне. У версіях Visual Studio 2010 і вище можливості програмування Office розширено, але поточний посібник дійсний і для студії 2008 року.
1. Підключити необхідні бібліотеки 2. Відкрити шаблон Word 3. Знайти у ньому потрібне місце 4. Вставити в нього рядок з інформацією
1. Проект у студії у нас уже має бути. У розділі Посилання/References клацаємо правою кнопкою, йдемо в "Додати посилання" та шукаємо Microsoft.Office.Interop.Word. У параметрах доданої бібліотеки ставимо true в Копіювати локально/Copy local, оскільки бібліотеку треба копіювати разом з файлами проекту, що виконуються.
До коду додаємо відповідні using
Також майже всі функції Word вимагають об'єктних параметрів, навіть якщо всередині них сидять прості рядки та логічні значення, так що краще заздалегідь зробити кілька обгорток
Щоб запустити Word і відкрити шаблон з диска (шлях відомий), потрібно приблизно такий код
Принципово важливі два моменти
1. Ми створюємо некерований ресурс, який не збере збирач сміття – окремий процес у пам'яті з програмою Word, якщо ми його не закриємо і не виведемо на екран, він так і залишиться там висіти до вимкнення комп'ютера. Більше того такі ворди можуть накопичуватися непомітно для користувача, програміст ще приб'є їх вручну. Дбати про вивільнення некерованого ресурсу має програміст.
2. За замовчуванням Word запускається невидимим, на екран його ми виводимо.
Для початку розглянемо найпростіший і найпримітивніший варіант - пошук та заміна рядка в документі Word. Деякі програмісти так і працюють - ставлять у шаблон текстову мітку на кшталт @@nowDate та замінюють її на потрібне значення.
Настав час познайомитися з фундаментом роботи з Word - великимта жахливим об'єктом Range. Його суть складно описати словами - це деякий довільний шматок документа, діапазон (range), який може включати все що завгодно - від пари символів, до таблиць, закладок та інших цікавих речей. Не варто плутати його з Selection - шматком документа, виділеним мишкою, який можна конвертувати в Range. Відповідно, нам треба отримати Range для всього документа, знайти потрібний рядок усередині нього, отримати Range для цього рядка і вже всередині цього останнього діапазону замінити текст на необхідний. І не варто забувати, що документ може мати складну структуру з колонтитулами та іншою єрессю, можливий універсальний метод для заміни всіх входжень даного рядка:
Насправді це не найкращий метод для вставки інформації в документ, тому що можуть виникнути складності з унікальними іменами для текстових міток (якщо текст однієї входить до початку іншої, цей метод знайде її і замінить), їх збігом із довільним текстом тощо .
Навіть якщо нам треба знайти (і, наприклад, відформатувати) саме рядок з текстом усередині документа, найкраще видати назовні знайдений Range і вже з ним робити різні злодіяння. Отримаємо приблизно такий метод:
Найпростіше вирішення проблеми унікальності тексту (потрібно нам знайти Range слова Word, але всередині всього документа воно зустрічається десятки разів) - шукати рядок усередині рядка, спочатку знайти унікальний рядок, потім не унікальний усередині нього, неестетично, але дешево, надійно та практично.
Якщо рядок треба просто замінити, то зійде найпростіше
Але оскільки Range є універсальним контейнером для будь-якого шматка документа Word, то його можливості набагато ширші, частина їх буде розглянута в подальших нотатках.
Якщо нам треба просто стати на початокдокумента (і щось вставити вже туди):
Зберегти документ на диск можна так