Модификация приложения Windows Forms : работа с шаблонами



 

Для работы с шаблоном документа Word, необходим собственно сам шаблон. Создаём его. Для этого запускаем Microsoft Word 2010 и создаём новый документ. Теперь, изменим верхний колонтитул по своему вкусу:

 

Рис. 4. 1. Меняем стиль верхнего колонтитула шаблона документа

 

Этот стиль обеспечит два поля. Одно для названия, другое для даты. Выберем дату:

 

Теперь, необходимо связать два поля с приложения. Для этого будем использовать «Закладки». По имени закладки на какой-либо можно будет отыскать нужное текстовое поле в этом шаблоне. Сделаем закладку из текстового поля Название. Выделим текст в фиолетовом поле:

 

Теперь выполним: Вставка -> Закладка:

 

Далее вводим Имя закладки: Top _ Name жмём Добавить:

 

Для даты правее сделаем закладку с именем Date _ Now:

 

Закрываем колонтитул:

 

Теперь заполним нижний колонтитул по своему вкусу. Например так:

Рис. 4. 2. Меняем стиль нижнего колонтитула шаблона документа

 

Удалим номер страницы, оставив только текст слева под чертой. Выделим этот текст и сделаем из него новую закладку с именем Bottom _ Name:

 

Закрываем колонтитул. Теперь нарисуем небольшую таблицу 3 на 4 клетки (3 столбца, 4 строки).

 

Рис. 4. 3. Создаём таблицу 3 на 4

 

Оформим её любым способом. Например, так и заполним:

 

Далее можно было бы поставить шесть закладок, задать им уникальные имена и искать их как в предыдущем случае, но это слишком накладно. Можно поступить проще: выделим всю таблицу и добавим закладку на всё выделение сразу. Выберем любое поле таблицы далее жмём правую кнопку мыши -> Выделить -> Таблица:

 

Назовём новую закладку на основе таблицы: Table:

 

Добавим также для наглядности график на основе данной таблицы:

 

Рис. 4. 4. Создаём диаграмму

 

Выберем Гистограмма -> Объёмная цилиндрическая:

 

Рис. 4. 5. Выбор типа диаграммы

 

Откроется окно Microsoft Excel 2010 с параметрами диаграммы. Потянем за правый нижний уголок, чтобы уменьшить область данных диаграммы:

 

Рис. 4. 6. Изменение области диапазона диаграммы

 

Далее вставим в область 3 на 4 (А1-D3) данные нашей таблицы, удалим лишние данные из ненужных ячеек и в пустые ячейки самой таблицы поставим нули:

 

Закроем лист Excel. Теперь присвоим диаграмме в Word имя Graph (закладка на всю таблицу).

 

Рис. 4. 7. Добавление имени для диаграммы

 

Сохраняем шаблон в произвольном месте диска под именем Шаблон: Файл -> Сохранить как -> Шаблон Word:

 

Необходимо добавить наш шаблон в проект приложения, чтобы при компиляции этот шаблон был «под рукой». Выполним: Проект -> Существующий элемент... (Shift+Alt+A). Выберем Все файлы (*.*) в окне добавления и укажем путь к нашему шаблону (Шаблон. dotx). Свойства добавленного файла:

 

Изменим: Копировать в выходной каталог: Всегда копировать.

 

Разместим вторую группу элементов как показано на рисунке ниже:

 

Рис. 4. 8. Модифицированная форма приложения и расстановка второй группы элементов

 

Здесь у нас два TextBox, два элемента Button, один GroupBox и DataGridView. Свойства задаём такие:

 

Button:

(Name): B_Save
Text: Сохранить документ Word
Size: 200; 23

Button:

(Name): B_Exit
Text: Выгрузить Word
Size: 200; 23

GroupBox:

(Name): GB_2
Text: Автоматическое заполнение шаблона документа

TextBox:

(Name): TB_Name_1
Text: Введите верхнее имя
Size: 200; 23

TextBox:

(Name): TB_Name_2
Text: Введите нижнее имя
Size: 200; 23

DataGridView:

(Name): DGV_Table

 

События MouseEnter и MouseLeave верхнего TextBox:

 

   private void TB_Name_1_MouseEnter(object sender, EventArgs e)

   {

       TB_Name_1.Text = "";

   }

 

   private void TB_Name_1_MouseLeave(object sender, EventArgs e)

   {

       if (TB_Name_1.Text == "")

       {

           TB_Name_1.Text = "Введите верхнее имя";

      }

   }

 

События MouseEnter и MouseLeave нижнего TextBox:

 

   private void TB_Name_2_MouseEnter(object sender, EventArgs e)

   {

       TB_Name_2.Text = "";

   }

 

   private void TB_Name_2_MouseLeave(object sender, EventArgs e)

   {

       if (TB_Name_2.Text == "")

       {

           TB_Name_2.Text = "Введите нижнее имя";

       }

   }

 

События Click кнопки Сохранить документ Word:

 

   private void B_Save_Click(object sender, EventArgs e)

   {

       B_Save.Enabled = false;

       oWordTemplate = new Word.Application();

       Word._Document oDocTemplate = GetDoc(Environment.CurrentDirectory + "\\Шаблон.dotx"); // Получаем шаблон документа

       oDocTemplate.SaveAs(FileName: Environment.CurrentDirectory + "\\Новый документ.docx"); // Сохраняем изменённый шаблон с новыми данными из приложения

       oDocTemplate.Close(); // Закрываем документ (Word при этом не выгружается)

   }

 

События Click кнопки Выгрузить Word:

 

   private void B_Exit_Click(object sender, EventArgs e)

   {

       // Выходим из всех открытых приложением окон Word

       try

       {

           B_Save.Enabled = true;

           oWordTemplate.Quit();

         }

       catch { }

 

       try

       {

           B_Open.Enabled = true;

           B_Page_1.Enabled = false;

           B_Page_2.Enabled = false;

           B_Print.Enabled = false;

           B_Number.Enabled = false;

           B_Scale.Enabled = false;

           B_Picture.Enabled = false;

           oWord.Quit();

       }

       catch { }

   }

 

Найдём в файле LWP12Main.cs строчку:

 

   // Запускаем Word и создаём новый документ

   Word._Application oWord;

   Word._Document oDoc;

 

Добавим после:

 

   Word._Application oWordTemplate;

   DataTable T;

 

В начало файла добавим:

 

using Excel = Microsoft.Office.Interop.Excel; // Для графиков

 

Найдём:

 

       InitializeComponent();

       ...

       B_Picture.Enabled = false;

 

Добавим после:

 

       // Формируем таблицу для заполнения DataGridView

       T = new DataTable();

       T.Columns.Add();

       T.Columns.Add();

       T.Columns.Add();

       var row = T.NewRow();

       row[0] = "Главное поле";

       row[1] = "Параметры № 1";

       row[2] = "Параметры № 2";

       T.Rows.Add(row);

       T.Rows.Add(T.NewRow()[0] = "Значение № 1");

       T.Rows.Add(T.NewRow()[0] = "Значение № 2");

       T.Rows.Add(T.NewRow()[0] = "Значение № 3");

       DGV_Table.DataSource = T;

 

Необходимые для работы функции выполняющие действия по изменению двух надписей, таблицы и диаграммы:

 

   private Word._Document GetDoc(string path)

   {

       Word._Document oDocTemplate = oWordTemplate.Documents.Add(path);

       SetTemplate(oDocTemplate); // Вызываем метод изменяющий шаблон

       return oDocTemplate;

   }

 

   private void SetTemplate(dynamic oDocTemplate)

   {

 

       try

       {

           oDocTemplate.Bookmarks["Top_Name"].Range.Text = TB_Name_1.Text; // Заполняем поле вверху документа

           oDocTemplate.Bookmarks["Bottom_Name"].Range.Text = TB_Name_2.Text; // Заполняем поле внизу документа

           oDocTemplate.Bookmarks["Date_Now"].Range.Text = DateTime.Now.Date.ToLocalTime();

           SetTable(oDocTemplate, "Table", T); // Заполняем таблицу

           SetChart(oDocTemplate, "Graph", T); // Заполняем график

       }

       catch { }

   }

   // Метод, заполняющий данными нашу таблицу в шаблоне

   private void SetTable(Word._Document oDocTemplate, string bookmark, DataTable dataContext)

   {

       dynamic tbl = oDocTemplate.Bookmarks[bookmark].Range.Tables[1];

       int tblRow = 0;

       int tblCell = 0;

 

       foreach (Word.Column col in tbl.Columns)

       {

 

           foreach (Word.Cell cell in col.Cells)

           {

 

               try

               {

                   SetCell(cell, (string)dataContext.Rows[tblRow][tblCell]); // Вызываем метод SetCell() для проверки числе внутри ячеек и пометки их цветом

               }

               catch { } // Ловим пустые ячейки

               tblRow++;

           }

           tblCell++;

           tblRow = 0;

       }

   }

   // Помечаем ячейки таблицы цветами. Красным цветом те ячейки, где значения меньше 10, зелёным те ячейки, где значения больше 100

   private void SetCell(Word.Cell cell, string text)

   {

       int val;

 

      if (int.TryParse(text, out val))

       {

           if (val < 10) cell.Shading.BackgroundPatternColor = Word.WdColor.wdColorRed;

           if (val > 100) cell.Shading.BackgroundPatternColor = Word.WdColor.wdColorLightGreen;

       }

       cell.Range.Text = text;

   }

   // Метод, заполняющий данными график из таблицы в приложении

   private void SetChart(Word._Document oDocTemplate, string bookmark, DataTable dataContext)

   {

       Word.Chart chart = oDocTemplate.Bookmarks[bookmark].Range.InlineShapes[1].Chart; // Получаем диаграмму

       Word.ChartData chartData = chart.ChartData; // Переводим данные диаграммы

       chartData.Activate();

 

       Excel.Workbook dataWorkbook = (Excel.Workbook)chartData.Workbook; // Создаём новую книгу Excel на основе диаграммы

       Excel.Worksheet dataSheet = (Excel.Worksheet)dataWorkbook.Worksheets[1]; // Выбиаем данные для заполнения диаграммы

       dataSheet.Cells.Range["B2"].FormulaR1C1 = dataContext.Rows[1][1]; // Сохраняем данные непосредственно в ячейки книги Excel из DataTable

       dataSheet.Cells.Range["B3"].FormulaR1C1 = dataContext.Rows[1][2];

       dataSheet.Cells.Range["C2"].FormulaR1C1 = dataContext.Rows[2][1];

       dataSheet.Cells.Range["C3"].FormulaR1C1 = dataContext.Rows[2][2];

       dataSheet.Cells.Range["D2"].FormulaR1C1 = dataContext.Rows[3][1];

       dataSheet.Cells.Range["D3"].FormulaR1C1 = dataContext.Rows[3][2];

       dataWorkbook.Close(); // Закрываем книгу Excel

   }

 

Готово. Можно компилировать и проверять работоспособность.

 

Завершающая часть

 

Компилируем приложение (Release) и запускаем. Заполняем все поля. В ячейки таблицы DataGridView вводим числовые значения, а в текстовые поля вводим произвольные данные:

 

Рис. 5. 1. Модифицированное приложение Windows Forms: заполняем форму

 

Далее жмём на Сохранить документ Word. Результат работы показан ниже (Рис. 5. 2):

 

Рис. 5. 2. Модифицированное приложение Windows Forms : результат изменения шаблона (Новый документ. docx)

 

Жмём Выгрузить Word для того чтобы выгрузить процесс WINWORD . EXE из списка процессов (будет выгружен процесс, который был создан нашим приложением). Наше приложение «защищено» (защита висит на кнопках) и максимально загружает два экземпляра приложения Word, которые и будут выгружены.

 

Немного о работоспособности приложения:

 

Окончательная работоспособность приложения на версии ниже Word 2010 будет зависеть от «состояния» самого Word (полной/правильной установки компонентов и наличия необходимых обновлений). Приложение было протестировано на нескольких машинах с различными сочетаниями ОС и Office. Полная работоспособность обеспечивалась на ПК с Windows 7 (Service Pack 1)/Office 2010 и Windows 7/Office 2007.

Также, из-за некорректной установки Microsoft Office (переустановки и обновления на новую более версию) возможно полное отсутствие функциональности разрабатываемого приложения. Во время написания приложения индикатором неработоспособности Word будет специфическая ошибка, сообщающая об отсутствии библиотеки Microsoft Word 1 X .0 Object Library, и сопутствующие сообщения Visual Studio об отсутствии пространства имён Microsoft.Office.Interop.Word (и как следствие, всего, что включает в себя это пространство имён). Возможное решение проблемы: полное удаление Microsoft Office с ПК и последующая переустановка. Лучше также установить все вышедшие на данный момент обновления.

 


Дата добавления: 2019-09-13; просмотров: 268; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!