Вставка текста в Word на C# (2 способ)

Вставка текста в Word на C# (OpenXML SDK)

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

На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.


Комментарии:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *