Вставка текста в Word на C# (2 способ)
Всем доброго времени суток. На связи Алексей Гулынин. В данной статье я бы хотел рассказать ещё об одном способе добавления информации в документ Word, используя OpenXML и язык C#. Конкретно будем работать с библиотекой DocumentFormat.OpenXml.dll. Данная технология представляет собой идею реализации открытого формата офисных документов. Плюсом использования OpenXml является то, что не нужно устанавливать Microsoft Office на рабочую станцию для задач, связанных с генерацией различных документов. Добавим ссылку на эту библиотеку в наш проект. Также добавим ссылку на WindowsBase.
Скачать OpenXML SDK можно на сайте Microsoft.
Также будем добавлять имя, фамилию и возраст, используя закладки (Bookmarks).
Код немного сложнее, чем был в предыдущем примере:
using System;
using System.IO;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using System.Collections.Generic;
namespace TestProjectWord
{
class Program
{
static void Main(string[] args)
{
try
{
// Получаем массив байтов из нашего файла
byte[] textByteArray = File.ReadAllBytes(@"D:\Test.docx");
// Массив данных
string[] data = new string[3] { "27","Гулынин","Алексей"};
// Начинаем работу с потоком
using (MemoryStream stream = new MemoryStream())
{
// Записываем в поток наш word-файл
stream.Write(textByteArray, 0, textByteArray.Length);
// Открываем документ из потока с возможностью редактирования
using (WordprocessingDocument doc = WordprocessingDocument.Open(stream, true))
{
// Ищем все закладки в документе
var bookMarks = FindBookmarks(doc.MainDocumentPart.Document);
int i = 0;
foreach (var end in bookMarks)
{
// В документе встречаются какие-то служебные закладки
// Таким способом отфильтровываем всё ненужное
// end.Key содержит имена наших закладок
if (end.Key != "Name" && end.Key != "Age" && end.Key != "Surname") continue;
// Создаём текстовый элемент
var textElement = new Text(data[i].ToString());
// Далее данный текст добавляем в закладку
var runElement = new Run(textElement);
end.Value.InsertAfterSelf(runElement);
i++;
}
}
// Записываем всё в наш файл
File.WriteAllBytes(@"D:\Test.docx", stream.ToArray());
}
}
catch (Exception ex)
{
Console.WriteLine("Во время выполнения программы произошла ошибка! Текст ошибки: {0}", ex.Message);
Console.ReadLine();
}
}
// Получаем все закладки в документе
// bStartWithNoEnds - словарь, который будет содержать только начало закладок,
// чтобы потом по ним находить соответствующие им концы закладок
// documentPart - элемент Word-документа
// outs - конечный результат
private static Dictionary<string, BookmarkEnd> FindBookmarks(OpenXmlElement documentPart, Dictionary<string, BookmarkEnd> outs = null, Dictionary<string, string> bStartWithNoEnds = null)
{
if (outs == null) { outs = new Dictionary<string, BookmarkEnd>(); }
if (bStartWithNoEnds == null) { bStartWithNoEnds = new Dictionary<string, string>(); }
// Проходимся по всем элементам на странице Word-документа
foreach (var docElement in documentPart.Elements())
{
// BookmarkStart определяет начало закладки в рамках документа
// маркер начала связан с маркером конца закладки
if (docElement is BookmarkStart)
{
var bookmarkStart = docElement as BookmarkStart;
// Записываем id и имя закладки
bStartWithNoEnds.Add(bookmarkStart.Id, bookmarkStart.Name);
}
// BookmarkEnd определяет конец закладки в рамках документа
if (docElement is BookmarkEnd)
{
var bookmarkEnd = docElement as BookmarkEnd;
foreach (var startName in bStartWithNoEnds)
{
// startName.Key как раз и содержит id закладки
// здесь проверяем, что есть связь между началом и концом закладки
if (bookmarkEnd.Id == startName.Key)
// В конечный массив добавляем то, что нам и нужно получить
outs.Add(startName.Value, bookmarkEnd);
}
}
// Рекурсивно вызываем данный метод, чтобы пройтись по всем элементам
// word-документа
FindBookmarks(docElement, outs, bStartWithNoEnds);
}
return outs;
}
}
}
Как мы видим код для работы с закладками стал значительно сложнее, чем при работе с библиотекой Microsoft.Office.Interop.Word. Но всё же я рекомендую использовать технологию OpenXML для генерации различных отчетов и работе с офисными пакетами программ, так как далеко не всегда возможно на сервер отчетов установить Microsoft Office.
В данной статье вы немного узнали о том, как работать с технологией OpenXML, используя язык C#.
На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.




