среда, 7 сентября 2011 г.

C# и выгрузка отчетов в шаблон документа Word

Иногда, в программе требуется формировать отчеты на основе некоторого шаблона документа , сформированного в Ворде, меняя там при выгрузке лишь некоторые данные. Существует несколько способов, рассмотрим самый простый - с использованием .com-обьектов Microsoft Office.
Этот способ достаточно медленный, но тем не менее, подходит для большинства случаев, когда нужно просто сформировать определенный .doc файл на основе имеющегося шаблона.

Итак, по пунктам:



1. Для начала, расставим в нашем шаблоне поля, куда будут вставляться данные.

Для этого, открываем наш шаблон, устанавливаем курсор там где нужно будет вставить значение. Открываем в меню Вставка -> Поле...
В появившемся окне, выбираем категорию Автоматизация и тип поля DocVariable. Вводим название поля. В моем примере это будет DOCDATE.
Рис.1 Добавление поля-переменной в документ Word
 Включить или выключить отображение имен полей-переменных в документе Word можно с помощью сочетания клавиш Alt + F9

2. Теперь нам нужно добавить ссылки на .COM компоненты Microsoft Office, которые мы будем использовать в нашей программе.
    Для этого, в Solution Explorer в References добавляем ссылки на .COM-компоненты:
  • Microsoft Office 11.0 Object Library
  • Microsoft Word 11.0 Object Library
Для работы с Office 2007 требуются версии 12.0 этих библиотек  .
Рис.2 Добавление .com-библиотек Microsoft Office
 Если у вас на компьютере нет этих библиотек, вы можете скачать набор Office Primary Interop Assemblies (PIA) с сайта Microsoft тут.

 Важно! На компьютере, на котором будет устанавливать программа, этих библиотек может не быть. Поэтому, необходимо поставлять их в папке с программой или инсталлировать в GAC.

3. После добавления библиотек, добавляем в нашем проекте директиву using для использования библиотеки взаимодейтвия с Office:
 using Word = Microsoft.Office.Interop.Word;
4. В самом приложении, запускаем Word и подгружаем наш документ-шаблон:
   //запускаем Word и открываем шаблон файла   
   object fileName = Application.StartupPath+"\\reports\\mytemplate.doc";
   Word.Application WordApplication = new Word.Application();
   WordApplication.Visible = true; //выводим документ на экран
   Word.Document WordDocument = WordApplication.Documents.Open(fileName);
   //присваиваем значение полю
   WordDocument.Variables["DOCDATE"].Value = DateTime.Now.ToShortDateString();
   //обновляем поля документа
   WordDocument.Fields.Update(); 
 5. После этого, мы можем сохранить наш документ с помощью методов объекта Word.Document - Save() или SaveAs(имя_файла)  

Готово.

11 комментариев:

  1. У меня высвечивает предупреждения NullRefereceException не оброботана помогите пожалуста
    VS 2010 b word 2007

    ОтветитьУдалить
    Ответы
    1. NullReferenceException означает что какая-то из переменных не проинициализирована и ей не присвоенно значение. Т.е. её значение == NULL. Посмотрите что отладчик пишет - в какой строке и какая переменнная не инициализирована, можете сбросить дамп отладчика мне, попробую посмотреть из-за чего ошибка.

      Удалить
    2. private void button1_Click(object sender, EventArgs e)
      {
      object fileName = Application.StartupPath + "\\report\tart.doc";
      Word.Application WordApplication = new Word.Application();
      WordApplication.Visible = true;
      Word.Document WordDocument = WordApplication.Documents.Open(fileName);
      WordDocument.Variables["DOCDATE"].Value = DateTime.Now.ToShortDateString(); // на этой строке
      помогите пожалуста (( а ошибок нет

      Удалить
  2. Этот комментарий был удален автором.

    ОтветитьУдалить
    Ответы
    1. Сложно что то сказать без дампа отладчика. Но тут скорее всего один из двух вариантов:
      1) Проверьте, не опечатались ли в названии переменной DOCDATE в вордовском файле
      2) Возможно не создается обьект WordDocument - проверьте, не равен ли он null, во время возникновения ошибки (наведите курсор на данную переменную когда выскочит ошибка). Это может быть если нет прав доступа к вашему файлу (tart.doc). Сам файл судя по вашему коду у вас должен находиться в папке с программой, в папке \Bin\Debug\report\tart.doc - если запускаете в режиме Debug, соотвественно, в папке \Bin\Release\report\tart.doc - если запускаете в режиме Release. Проверьте чтобы такая папка существовала и файл был там.

      Удалить
    2. простите меня чаника но у меня WordDocument пишит null
      и у себя не могу нати сылку 2 в проекте как тут Word на фото
      что можно сделать

      Удалить
    3. Не совсем понял, ссылку на Microsoft Word 11.0 Object Library? Есл да, то её можно взять тут - http://www.microsoft.com/en-us/download/details.aspx?id=20923
      Там нужно нажать Download, потом извлечь скачанные файлы в какую нибудь папку, запустить оттуда файл O2003PIA.MSI
      После установки так же добавить ссылку на библиотеку через References- Add Reference
      У вас Microsoft Word установлен?

      Удалить
    4. да есть Word
      и Microsoft Word 11.0 Object Library? тоже
      а word сылки нет в проекте она на ресунке 2 в незу красным помечина

      Удалить
  3. Этот комментарий был удален автором.

    ОтветитьУдалить
  4. Этот комментарий был удален автором.

    ОтветитьУдалить
  5. Не подскажите, как список из ListBox'a сохранить в Word'e?

    ОтветитьУдалить