Модификация приложения 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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!