Практична робота 2. Семестр 2


 

         Метою даної практичної роботи буде навчитися передавати дані у формі таблиць в Microsoft Word. Розглянемо дану операцію на прикладі форми співробітників. Отже для початку потрібно підключити його СОМ компоненти. Це можна зробити так:

         Solution explorerReferencesAdd reference (Менеджер проекту – Посилання – Додати посилання). Далі потрібно знайти вкладку СОМ, та обрати Microsoft Word XX.X Object Library.

         Після цього в менеджері проекту з’являться потрібні нам компоненти:

         Все тепер можемо починати роботу.

         По аналогії з минулою лабораторною роботою, ми створимо новий клас, який буде містити функції переносу таблиці в ворд. Він буде не таким об’ємним, так як механізм передачі даних у ворд є значно простішим. І так додаємо новий клас до нашого проекту. Назвемо його expWord. В наш новий клас потрібно додати простори імен для використання форм додатку та ворду.

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

Далі потрібно додати то проекту новий клас, можна ось так

         По замовчуванню новий клас буде називатися Class1, якщо при зміні його імені, Visual Studio повідомить про помилку, тоді потрібно натиснути на допоміжну іконку і примусово переіменувати його.

         Тепер перейдемо до створення процедур та подій нового класу.

(Кінець наведеного фрагменту) Звертаю увагу, що новий клас мусить називатися expWord!

using System.Windows.Forms; //для роботи з сітками даних

using Microsoft.Office.Core; //Службові структури ворду

using word = Microsoft.Office.Interop.Word; //Підключаємо функції ворду

         Далі опишемо наш клас:

class expWord

{

 public word.Application wordapp; // Змінна для звязку з вордом

 public word.Document doc; // Змінна вказує безпосередньо на сторінку куди виводимо текст

 

 // Оголошення констант вирівнювання тексту, лише для зручності

 public word.WdParagraphAlignment ALeft = word.WdParagraphAlignment.wdAlignParagraphLeft;//Лівий край

 public word.WdParagraphAlignment ARight = word.WdParagraphAlignment.wdAlignParagraphRight;//Правий край

 public word.WdParagraphAlignment ACenter = word.WdParagraphAlignment.wdAlignParagraphCenter;//По центру

 public word.WdParagraphAlignment AJustify = word.WdParagraphAlignment.wdAlignParagraphJustify;// По ширині

 

 public void loadWord(bool visible=true) //Завантажує ворд

 {

  wordapp = new word.Application(); //Завантажуе ворд і ініціалізує звязок

  wordapp.Visible = visible; //Показує ворд на екрані

  doc = wordapp.Documents.Add();//Додає новий документ

 }

 

 public void setFont(int b=0,int i=0,int u=0,int size=0,int color=0,string face="",

 word.WdParagraphAlignment align = word.WdParagraphAlignment.wdAlignParagraphLeft)

             //Встановлює поточне форматування

             //b - жирний нарис

             //i - курсив

             //u - підкреслення

             //size - розмір шрифту

             //color - колір

             //face - назва шрифту

             //align - вирівнювання тексту

 {

 wordapp.Selection.Paragraphs.Alignment = align; //задаємо вирівнювання

 wordapp.Selection.Font.Bold = b;//задаємо жирність

 wordapp.Selection.Font.Italic = i;//задаємо курсив

 if (u==1) {wordapp.Selection.Font.Underline = word.WdUnderline.wdUnderlineSingle;} //якщо 1 задаємо підкреслення

 else { wordapp.Selection.Font.Underline = word.WdUnderline.wdUnderlineNone; } //якщо 0 знімаємо підкреслення

 if (face != "") wordapp.Selection.Font.Name = face; //задаємо назву шрифта

 if (size != 0) wordapp.Selection.Font.Size = size;//задаємо розмір шрифта

 }

 

          //Вставляємо таблицю в поточну позицію і примінюємо

          //форматування заголовків та тіла таблиці

 public void insertTable(DataGridView dg,

 int Hb=1,int Hi=0,int Hu=0,int Hsize=0,int Hcolor=0,string Hface="",

 word.WdParagraphAlignment Halign=word.WdParagraphAlignment.wdAlignParagraphCenter,

 int Bb=0,int Bi=0,int Bu=0,int Bsize=0,int Bcolor=0,string Bface="",

 word.WdParagraphAlignment Balign=word.WdParagraphAlignment.wdAlignParagraphLeft)

              //dg - сітка в якій містяться дані             

              //  Форматування клітинок заголовків

              //Hb - жирність заголовку

              //Hi - курсив в заголовку

              //Hu - підкреслення в заголовку

              //Hsize - розмір заголовку

              //Hcolor - колір заголовку

              //Hface - шрифт заголовку

              //Halign - вирівнювання заголовку

              //  Форматування клітинок тіла таблиці

              //Hb - жирність

              //Hi - курсив

              //Hu - підкреслення

              //Hsize - розмір

              //Hcolor - колір

              //Hface - шрифт

              //Halign - вирівнювання             

 {

 int r = dg.RowCount; int c = dg.ColumnCount; //для зручності виносимо в змінні кількість рядків і стовпців

 setFont(Bb, Bi, Bu, Bsize, Bcolor, Bface, Balign);

 //Задаємо форматування тіла таблиці, для того щоб вона створилася із цим стилем,

 // а стиль клітинки заголовку будемо задавати кожен раз окремо

 wordapp.ActiveDocument.Tables.Add(wordapp.Selection.Range, 2, c, 1, 0);// вставляємо таблицю з 2-х рядків і «с» колонок

 for (int hc = 0; hc < c; hc++) //перебираємо заголовки сітки через змінну hc

   {

    setFont(Hb, Hi, Hu, Hsize, Hcolor, Hface, Halign); //задаємо стиль клітинці

    wordapp.Selection.TypeText(dg.Columns[hc].Name + "");//вставляємо текст в клітинку

    wordapp.Selection.MoveRight(12, 1);//переходимо в наступну клітинку

   }          

 for (int cr = 0; cr < r; cr++) //перебираємо стовпці сітки через змінну cr

  {

   for (int cc = 0; cc < c; cc++) //перебираємо рядки сітки через змінну сс

    {

     wordapp.Selection.TypeText(dg.Rows[cr].Cells[cc].Value + "");//вставляємо значення в клітинку

     //якщо це не останній рядок і не остання клітинка, переходимо до наступної

     //якщо наступноїнемає, вона автоматично створиться

     if ((cr<r-2)||((cc!=c-1)&&(cr!=r-1))) wordapp.Selection.MoveRight(12,1);

    }

  }

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

  wordapp.Selection.Move(5, 1);

  wordapp.Selection.Move(1, 1);

   }

 } //Кінець нашого класу

 

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

 

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

         Ну і відповідно сам обробник натиску елементу меню:

private void експортуватиВWordToolStripMenuItem_Click(object sender, EventArgs e)

 {

  expWord exp = new expWord();//створюємо наш обєкт ворду

  exp.loadWord();//завантажуємо ворд, і показуємо на екрані

  exp.setFont(1, 0, 0, 24, 0, "Times New Roman", exp.ACenter);//задаємо шрифт та форматування, яким будемо виводити загоовок

   //виводимо заголовок і дату формування звіту

  exp.wordapp.Selection.TypeText("Список співробітників станом на " + DateTime.Now.ToString());

  exp.wordapp.Selection.TypeParagraph();//вставляємо 2

  exp.wordapp.Selection.TypeParagraph();//нових рядки

  exp.setFont(0, 0, 0, 14);//змінюємо розмір шрифту, щоб не передавати в функцію вставки таблиці форматування

  exp.insertTable(dataGridView1);//вставляємо таблицю

 }

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

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