Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторный_практикум.doc
Скачиваний:
75
Добавлен:
15.11.2019
Размер:
45.35 Mб
Скачать

4. Модификация приложения 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

}

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