Лекція 3. Семестр 2. Експорт данних у Microsoft Word

 

Іноді для АРМ буде корисно автоматично формувати текстові данні за поданою схемою (шаблоном), але тоді постає проблема друку даних і їх збереження в доступному (досить уживаному) форматі. Для цього ми і будемо використовувати Microsoft Word. Так як весь пакет Microsoft Office підтримує технологію COM ми просто будемо передавати данні у Word, а користувач сам буде вирішувати, що з ними робити далі (друкувати, чи зберігати і т.д).

Встановлення зв’язку з Microsoft Word

Для цього в системі має бути інстальований офіс, інакше ми отримаємо повідомлення про помилку. В менеджері проекту потрібно додати посилання на Microsoft Word XX.X Object Library. Додається в ReferencesAdd reference … - COM.

         Дала потрібно додати до простору імен using Microsoft.Office.Core; та using word=Microsoft.Office.Interop.Word; Далі потрібно додати дві змінні які будуть відповідати безпосередньо за зв’язок з вордом, та друга – буде вказувати саме на документ куди ми будемо виводити дані: public word.Application wordapp; та public word.Document doc;

         Перейдемо до програмного коду:

 

private void button1_Click(object sender, EventArgs e)

 {

  try

   {

     wordapp = new word.Application();

     wordapp.Visible = true;

     doc = wordapp.Documents.Add();

   }

  catch { MessageBox.Show("Помилка встановлення звязку з вордом!"); }

 }

  

Даний обробник завантажить Word, якщо в системі він не встановлений видасть помилку. Також після відкриття створить новий документ та покаже Word на екрані. Результат виконання new word.Application() записується в змінну wordapp, яка нам і надає можливість керування додатком Word. А змінна doc посилається на створений порожній документ.

Якщо вікно додатку Word показати в самому початку створення документу користувач буде бачити всі послідовні вставки та форматування тексту, що в деяких випадках може суттєво вплинути на роботу нашої програми так як користувач може випадково чи навмисно змінити позицію курсору, або зовсім закрити Word. Також якщо показати Word самого початку це вплине на швидкість формування документу, так як якщо нам для формування документу потрібно виконати наприклад 50 дій, то після кожної Word буде оновлювати документ тобто витрачати час процесора на непотрібну для нас дію, тому вікно потрібно показувати користувачу вже на самому кінці коли документ є остаточно сформований. У нашому випадку, коли ми вчимося, для наочності ворд буде показаний одразу, щоб ви могли спостерігати формування документу в «реальному часі».

Вивід тексту

Для роботи з текстом документа використовується властивість Selection, який є в свою чергу вказівником на виділену або поточну позицію курсору. Для того щоб Word надрукував текст в теперішній позиції курсору викликаємо метод TypeText властивості Selection наприклад:

 

wordapp.Selection.TypeText("Тестове повідомлення");

 

Для того щоб закрити документ потрібно використати метод Close для створеного документу. В нашому випадку на створений документ посилається змінна Doc, а отже синтаксис закриття документу буде виглядати наступним чином:

 

doc.Close(MsoTriState.msoFalse);

         де MsoTriState.msoFalse – логічне значення, чи потрібно зберігати документ.

         Саму програму ворд можна закрити таким чином:

 

wordapp.Quit();

 

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

 

Word є багатофункціональним текстовим процесором, тобто він сам переносить слова при досягненні поля, на інший рядок, але якщо потрібно почати ввід тексту з нового рядка (абзацу) нам потрібно примусово перейти на новий рядок. Це можна зробити передавши системі службову послідовність CR\LF. Наприклад:

 

wordapp.Selection.TypeText("\x0D\x0A");

        

         Перейде на новий рядок (створить параграф).

         Можна сумістити, наприклад нижче наведено, як вивести текст двома рядками.

 

wordapp.Selection.TypeText("Перший рядок\x0D\x0AДругий рядок");

 

Послідовність символів \х13\х10 і є маркером переводу курсору, але в системі є більш правильний метод переходу на новий рядок, а саме службова функція TypeParagraph властивості Selection. Наступний приклад є еквівалентний попередньому, але є логічно більш правильним, але, все таки, яким методом користуватися вирішувати вам обидва правильні.

 

wordapp.Selection.TypeText("Перший рядок");

wordapp.Selection.TypeParagraph();

wordapp.Selection.TypeText("Другий рядок");

Позиціонування курсору

При виводі чергового тексту курсор у програмі MS Word зміщається в самий кінець текстового блоку. А що якщо нам потрібно перемістити курсор в іншу позицію, наприклад повернутися назад? Допустимо, ми надрукували повідомлення «це тестове повідомлення», тепер курсор перебуває в кінці слова «повідомлення». Як вставити слово «текстове» після слова «тестове»? Для цього потрібно перемістити курсор на дев'ять символів назад і надрукувати в цій позиції потрібне слово.

Для переміщення курсору використовується метод Move властивості Selection. У цього методу два параметри: точність руху й кількість кроків. Кількість кроків залежить від точності, але що це таке? Відповідні числові значення і їх опис представлені в таблиці.

Таким чином, щоб перемістити курсор на п'ять символів, потрібно вказати в якості точності значення 1, а в якості числа кроків — значення 5. Кількість кроків може бути й негативним. Якщо це значення позитивне, то курсор переміщається вправо, якщо негативне — уліво. При цьому майте на увазі, що під час руху курсору відбувається виділення, приблизно так само, як у випадку переміщення курсору за допомогою клавіш зі стрілками в програмі Word при натиснутій клавіші Shift.

 

Таблиця значень точності та переміщення курсору

Точність

Крок

1

Символ

2

Слово

3

Речення

4

Абзац

5

Рядок

9

Стовпець таблиці

10

Рядок таблиці

12

Клітинка таблиці

 

В слідуючому прикладі вставляємо слово «текстове» перед словом «повідомлення»:

 

            wordapp.Selection.TypeText("Це тестове повідомлення");

            wordapp.Selection.Move(1,-12);

            wordapp.Selection.TypeText("текстове повідомлення");

 

Метод Move досить простий. Могутнішими є його варіанти Moveleft і Moveright. Перший із цих методів рухає курсор вліво, другий — вправо.

В обох методів три параметри:

·      точність;

·      кількість кроків;

·      необхідність виділення.

Якщо третій параметр рівний true, то текст виділяється, інакше просто рухається курсор. Таким чином, задача вставки слова може бути вирішена в такий спосіб:

 

wordapp.Selection.TypeText("Це тестове повідомлення");

wordapp.Selection.MoveLeft(1, 12, false);

wordapp.Selection.TypeText("текстове");

 

Якщо все-таки необхідно виділити текст третім параметром передаємо True. Для того, щоб зняти виділення викликаємо метод Collapse:

 

wordapp.Selection.Collapse();

Курсор опиниться в тій позиції куди ми його перемістили. Приклад:

 

// Друкуємо текст

wordapp.Selection.TypeText("Це тестове повідомлення");

// Переміщуємо курсор вліво з виділенням

// Виділеним буде слово "повідомлення"

wordapp.Selection.MoveLeft(1, 12, true);

// Знімаємо виділення, курсор буде перед словом "повідомлення"

wordapp.Selection.Collapse();

// Вставляємо слово

wordapp.Selection.TypeText("текстове");

 

Тепер подивимося, як можна піднятися на один рядок вище. Для цього в якості точності потрібно вказати число 5 (перший параметр методу Move). У наступному прикладі ми піднімаємося на один рядок вгору:

 

wordapp.Selection.Move(5, -1);

 

Шрифт

Дуже важко читати звіт, у якому увесь текст представлено одним шрифтом. У звіті є як мінімум заголовок, який завжди можна виділити жирним шрифтом.

Для керування шрифтами використовується властивість Font складеної властивості Selection. Параметри, які можна змінювати в шрифті, перераховані в таблиці.

Таблиця параметрів шрифту

 

 

Назва параметру

Тип

Опис

Name

Рядок

Дозволяє змінити шрифт. Параметру присвоюється ім'я необхідного шрифту

Size

Число

Число, що визначає розмір шрифту

Bold

Число

Якщо параметр рівний 1, то текст буде друкуватися жирним шрифтом, 0 – вимкнено

Italic

Число

Якщо параметр рівний 1, то текст буде друкуватися курсивом, 0 – вимкнено

Strikethrough

Число

Якщо параметр рівний 1, то текст буде друкуватися перекресленим, 0 – вимкнено

Subscript

Число

Якщо параметр рівний 1, то текст буде друкуватися в нижньому індексі, 0 – вимкнено

Superscript

Число

Якщо параметр рівний 1, то текст буде друкуватися у верхньому індексі, 0 – вимкнено

Smallcaps

Число

Якщо параметр рівний 1, то текст буде друкуватися в нижньому регістрі, 0 – вимкнено

Allcaps

Число

Якщо параметр рівний 1, то текст буде друкуватися в верхньому регістрі, 0 – вимкнено

 

У наступному прикладі текст друкується шрифтом Courier:

 

            wordapp.Selection.Font.Name = "Courier";

            wordapp.Selection.TypeText("Це тестове повідомлення");

 

Тепер спробуємо надрукувати в документі число 10 і вказати для нього другий степінь. Для цього потрібно надрукувати число 10, потім встановити властивість Selection.Font.Superscript в true і надрукувати 2. He забуваємо повернути шрифт у вихідний стан:

 

wordapp.Selection.TypeText("10");

wordapp.Selection.Font.Superscript = 1;

wordapp.Selection.TypeText("2");

wordapp.Selection.Font.Superscript = 0;

Розміщення тексту

Тепер нам потрібно познайомитися з розміщенням тексту на аркуші. Для цього в MS Word є досить широкі можливості, і всі вони доступні для зміни програмно. Розглянемо основні методи позиціонування тексту.

Наступні параметри розміщення тексту стосуються властивості Paragraphs:

 

Firstlinelndent — відступ для першого рядка абзацу;

 Leftlndent — відступ ліворуч для всіх рядків абзацу;

RightIndent — відступ праворуч для всіх рядків абзацу;

Alignment — вирівнювання:

WdParagraphAlignment.wdAlignParagraphLeft — по лівому краю;

WdParagraphAlignment.wdAlignParagraphCenter — по центру;

WdParagraphAlignment.wdAlignParagraphRight — по правому краю;

WdParagraphAlignment.wdAlignParagraphJustify — по ширині аркуша.

 

За замовчуванням відступ нового рядка рівний 0, тобто в першому рядку немає відступу ліворуч. Змінимо це значення на 20:

 

wordapp.Selection.Paragraphs.FirstLineIndent = 20;

 

У нас вже досить інформації, щоб програмно створити який-небудь документ. У прикладі представлений код створення заяви на звільнення.

Наша заява буде мати вигляд:

 

private void button1_Click(object sender, EventArgs e)

{

 try

  {

   wordapp = new word.Application();

   wordapp.Visible = true;

   doc = wordapp.Documents.Add();

  }

   catch { MessageBox.Show("Помилка встановлення звязку з вордом!"); }

     // Виводимо текст

  wordapp.Selection.Font.Size = 12;

  wordapp.Selection.Font.Name = "Times New Roman";

  wordapp.Selection.Paragraphs.Alignment = word.WdParagraphAlignment.wdAlignParagraphRight;

  wordapp.Selection.TypeText("Директору ТзОВ \"Каміння\"\x0D\x0A");

  wordapp.Selection.TypeText("Іванову І.І.\x0D\x0A");

  wordapp.Selection.TypeText("від працівника\x0D\x0A");

  wordapp.Selection.TypeText("Фленова Михайла\x0D\x0A");

  wordapp.Selection.TypeParagraph();

  wordapp.Selection.Paragraphs.Alignment = word.WdParagraphAlignment.wdAlignParagraphCenter;

  wordapp.Selection.Font.Size = 20;

  wordapp.Selection.Font.Bold = 1;

  wordapp.Selection.TypeText("Заява\x0D\x0A");

  wordapp.Selection.TypeParagraph();

  wordapp.Selection.Paragraphs.Alignment = word.WdParagraphAlignment.wdAlignParagraphJustify;

  wordapp.Selection.Font.Bold = 0;

  wordapp.Selection.Font.Size = 14;

  wordapp.Selection.Paragraphs.FirstLineIndent = 20;

  wordapp.Selection.TypeText("Прошу Вас звільнити мене за власним бажанням ");

  wordapp.Selection.TypeText("с такого числа. Я більше не бажаю у вас працювати, ");

  wordapp.Selection.TypeText("краще я буду мити підлогу. Жарт))\x0D\x0A");

  wordapp.Selection.TypeParagraph();

  wordapp.Selection.TypeText("Дата: 1 квітня 2010 р.");

}

Таблиці

Робота з таблицями не завжди цікава, але під час формування звітності завжди потрібна. Для створення таблиці використовується конструкція wordapp.Activedocument.Tables.Add, до якої потрібно передати п'ять параметрів:

 

1       ширину таблиці;

2       кількість рядків;

3       кількість колонок;

4       поведінка таблиці за замовчуванням;

5       параметри заповнення.

 

Два останні – не обов’язкові. Після виконання цього методу курсор переміщається в середину таблиці, і ви можете починати введення даних у першу клітинку. Для переміщення між клітинками потрібно використовувати метод Selection.Moveright із значенням в якості першого параметра (точність) значення 12. Якщо згадати першу таблицю, то точність зі значенням 12 відповідає переміщенню між клітинками.

В переміщенні між клітинками є цікаві нюанси. Якщо ви перебуваєте в самій останній клітинці останнього рядка і по ідеї рухатися далі нікуди, при переміщенні в наступну клітинку - буде створений новий рядок. У наступному прикладі ви побачите це на практиці, коли ми створимо таблицю із двох рядків, а заповнимо три.

Якщо перебувати в останній клітинці останнього рядка й виконати переміщення на рядок униз (у якості точності для методу Move вказати 5), то ви вийдете з таблиці й опинитеся праворуч від неї. Після цього можна перейти на рядок нижче шляхом переміщення курсору на одну позицію вправо. Цей варіант ми також розглянемо в наступному прикладі.

Отже, давайте з'ясуємо, як створити й заповнити таблицю. Спеціально доданий заголовок перед таблицею і текст після таблиці, щоб ви знали, як увійти в таблицю і як вийти з неї. Код для створення такого документу:

 

 

Приклад створення таблиці

Параметр

Опис

Name

Ім’я шрифта

Size

Розмір шрифта

 

Кінець таблиці

 

 

Сам програмний код обробника буде мати такий вигляд:

 

private void button1_Click(object sender, EventArgs e)

{

 try

  {

   wordapp = new word.Application();

   wordapp.Visible = true;

   doc = wordapp.Documents.Add();

  }

   catch { MessageBox.Show("Помилка встановлення звязку з вордом!"); }

    // Виводимо заголовок

  wordapp.Selection.TypeParagraph();

  wordapp.Selection.Paragraphs.Alignment = word.WdParagraphAlignment.wdAlignParagraphCenter;

  wordapp.Selection.Font.Name = "Times New Roman";

  wordapp.Selection.Font.Size = 20;

  wordapp.Selection.Font.Bold = 1;

  wordapp.Selection.TypeText("Приклад створення таблиці\x0D\x0A");

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

  wordapp.Selection.Font.Size = 14;

  wordapp.Selection.Paragraphs.Alignment = word.WdParagraphAlignment.wdAlignParagraphLeft;

  wordapp.Selection.Font.Bold = 0;

    // Створення таблиці

  wordapp.ActiveDocument.Tables.Add(wordapp.Selection.Range, 2, 2, 1, 0);

    // Заповнення таблиці

  wordapp.Selection.Font.Bold = 1;

  wordapp.Selection.TypeText("Параметр");

  wordapp.Selection.MoveRight(12,1);

  wordapp.Selection.Font.Bold = 1;

  wordapp.Selection.TypeText("Опис");

  wordapp.Selection.MoveRight(12,1);

  wordapp.Selection.TypeText("Name");

  wordapp.Selection.MoveRight(12,1);

  wordapp.Selection.TypeText("Ім’я шрифта");

  wordapp.Selection.MoveRight(12,1);

  wordapp.Selection.TypeText("Size");

  wordapp.Selection.MoveRight(12,1);

  wordapp.Selection.TypeText("Розмір шрифта");

    // Вихід з таблиці

  wordapp.Selection.Move(5,1);

  wordapp.Selection.Move(1, 1);

  wordapp.Selection.TypeParagraph();

  wordapp.Selection.TypeText("Кінець таблиці\x0D\x0A");

}