Вставка текста в 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#.
На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.