Здравствуйте, Mazenrab, Вы писали:
M>Всем привет!
M>Посоветуйте что-нибудь приличное для генерации word-документов из шаблонов.
Open XML SDK ? Или надо создание именно .doc?
M>Раньше я использовал WordDocumentWriter от Infragistics, но у него нет возможности работать с шаблонами.
Если под шаблоном понимать готовый документ с закладками, заменяемыми на значения, то с OpenXML это можно.
M>И да, насколько реально опасно использовать COM Ms Office на сервере?
Microsoft настоятельно не рекомендует
Здравствуйте, Mazenrab, Вы писали:
M>И да, насколько реально опасно использовать COM Ms Office на сервере?
Будут проблемы с многопоточной работой и одним компенентом.
И с условиями лицензирования неясно, насколько это разрешается.
Здравствуйте, Mazenrab, Вы писали:
M>И да, насколько реально опасно использовать COM Ms Office на сервере?
Да в общем-то особой опасности и нет (по крайней мере я не знаю в чем она может состоять), но добиться стабильной работы довольно сложно.
M>Посоветуйте что-нибудь приличное для генерации word-документов из шаблонов.
Если вы работаете с docx, то я настоятельно рекомендую посмотреть на такой механизм как Content Controls. С вашего позволения я сошлюсь на ряд своих статей по этой теме:
Электронные формы в Microsoft Word 2007: простые формы "парой кликов" — введение в тему: что такое CC и как на основе них нарисовать шаблон в Word 2007 Электронные формы в Microsoft Word 2007: извлечение и вставка данных — продолжение первой статьи. Здесь рассказаывается, как привязать CustomXml (это секция внутри самого документа, которая служит источником данных) к Content Controls, и небольшой пример как прочитать и записать CustomXml. Таблицы в формах Word 2013 — статья написанная спустя почти 6 лет и расписывает как то же самое сделать в Word 2013. Там во-первых, уже не требуется сторонних инструментов, а во-вторых (что важнее, наверное), появилась возможность создавать на формах таблицы с переменным числом строк.
ну и под занавес — пример, как на осове шаблона сгененрировать готовый документ Программная генерация документов-форм в Word
Если интересно, можете для начала поиграться с примером — генерация "отчета по совещанию"
Microsoft does not currently recommend, and does not support, Automation of Microsoft Office applications from any unattended, non-interactive client application or component (including ASP, ASP.NET, DCOM, and NT Services), because Office may exhibit unstable behavior and/or deadlock when Office is run in this environment.
HgLab: Mercurial Server and Repository Management for Windows
Здравствуйте, Михаил Романов, Вы писали:
МР>Здравствуйте, Mazenrab, Вы писали:
M>>И да, насколько реально опасно использовать COM Ms Office на сервере? МР>Да в общем-то особой опасности и нет (по крайней мере я не знаю в чем она может состоять), но добиться стабильной работы довольно сложно.
M>>Посоветуйте что-нибудь приличное для генерации word-документов из шаблонов. МР>Если вы работаете с docx, то я настоятельно рекомендую посмотреть на такой механизм как Content Controls. С вашего позволения я сошлюсь на ряд своих статей по этой теме: МР>
МР>Электронные формы в Microsoft Word 2007: простые формы "парой кликов" — введение в тему: что такое CC и как на основе них нарисовать шаблон в Word 2007 МР>Электронные формы в Microsoft Word 2007: извлечение и вставка данных — продолжение первой статьи. Здесь рассказаывается, как привязать CustomXml (это секция внутри самого документа, которая служит источником данных) к Content Controls, и небольшой пример как прочитать и записать CustomXml. МР>Таблицы в формах Word 2013 — статья написанная спустя почти 6 лет и расписывает как то же самое сделать в Word 2013. Там во-первых, уже не требуется сторонних инструментов, а во-вторых (что важнее, наверное), появилась возможность создавать на формах таблицы с переменным числом строк. МР>ну и под занавес — пример, как на осове шаблона сгененрировать готовый документ Программная генерация документов-форм в Word МР>
МР>Если интересно, можете для начала поиграться с примером — генерация "отчета по совещанию"
Благодарю, буду изучать. Я правильно понимаю что это, по сути, тот же Open XML?
Здравствуйте, Нахлобуч, Вы писали:
Н>Здравствуйте, Mazenrab, Вы писали:
M>>И да, насколько реально опасно использовать COM Ms Office на сервере?
Н>Настоятельно не советуют:
Н>
Н>Microsoft does not currently recommend, and does not support, Automation of Microsoft Office applications from any unattended, non-interactive client application or component (including ASP, ASP.NET, DCOM, and NT Services), because Office may exhibit unstable behavior and/or deadlock when Office is run in this environment.
Да, спасибо — это я читал Уточнял на всякий случай вдруг сообщество считает иначе
Здравствуйте, Mazenrab, Вы писали:
M>Благодарю, буду изучать. Я правильно понимаю что это, по сути, тот же Open XML?
Если вы имеете в виду формат OpenXML, то да, данная функциональность доступна только в файлах этого формата (поэтому я и уточнил про работу с docx-это WordProcessingML документ).
Если же вы имели в виду Open XML SDK, то он здесь фактически не применяестя — он нужен только для вставки XML-данных, которые будут использоваться при генерации документа, но это можно легко обойти и заменять нужную Part документа, используя только System.IO.Packaging.
Вообще, чтоб было понятно как это работает: Вы открываете Word и создаете в нем документ-шаблон (можете взять готовый доекмент или свалить все на секретаря — в этом особая прелесть, т.к. документы может готовить специалист-предметник!). В те места, куда должны будут подставляться данные, вы вставляете элементы Content Controls. Получается примерно вот такой документ
Затем вы привязываете вставленные Content Controls к XML с данными (Custom XML), которая хранится в самом документе (в отдельной его части). Это вы делаете используя или сам Word (в версии 2013 и старше) или бесплатную утилиту Word Content Control Toolkit (к сожалению, она не умеет работать с Repeating Sections, кокторые появились в Word 2013 и используюятся для таблиц и списков).
Пишете код, либо с помошью Open XML SDK (немного проще), либо System.IO.Packaging (не сильно сложнее), который заменяет Custom XML на аналогичную по структуре, но уже с реальными данными.
Пользователи получают ваш готовый документ, открывают, а Word все рендерит.
Конечно, у подхода есть и свои недостатки/ограничения, например, таблицы с переменным числом строк можно сделать только начиная с 2013 офиса (и работать будут только там), а с переменным числом столбцов нельзя до сих пор. Или не получится делать изменение форматов (например, в зависимости от данных подкрасить текст разными цветами) — только вставка самих данных.
Но есть и плюсы:
Как я уже говорил — шаблоны готовятся в самом Word, т.е. простом и привычном инструменте. Можете даже перепоручать подготовку специалистам-предметникам (тем, кто заказывает эти документы). Причем даже после того, как вы сделали привязку данных, никто не мешает драбатывать документ в том же Word (например добавить полей или поменять стиль)
Все инструменты (кроме Word и VS — но они вроде как присутсвуют в любом случае) — бесплатные.
(вот это нужно далеко не всем, но я все же упомяну) Механизм работает в 2 стороны: вы можете генерировать документы, подставляя XML с данными, а можете выдавать пользователям шаблоны (например, то же заявление), размеченные Content Controls с защитой от изменения (защита, конечно, липовая — просто от случайных искажений), которые они будут заполнять в удобном виде (нормальные контролы для даты, выпадающие списки, ...), а для извлечения этих введенных данных, достаточно будет прочитать Custom XML.
Здравствуйте, Михаил Романов, Вы писали:
МР>Здравствуйте, Mazenrab, Вы писали:
M>>Благодарю, буду изучать. Я правильно понимаю что это, по сути, тот же Open XML? МР>Если вы имеете в виду формат OpenXML, то да, данная функциональность доступна только в файлах этого формата (поэтому я и уточнил про работу с docx-это WordProcessingML документ). МР>Если же вы имели в виду Open XML SDK, то он здесь фактически не применяестя — он нужен только для вставки XML-данных, которые будут использоваться при генерации документа, но это можно легко обойти и заменять нужную Part документа, используя только System.IO.Packaging.
МР>Вообще, чтоб было понятно как это работает: МР> МР>Вы открываете Word и создаете в нем документ-шаблон (можете взять готовый доекмент или свалить все на секретаря — в этом особая прелесть, т.к. документы может готовить специалист-предметник!). В те места, куда должны будут подставляться данные, вы вставляете элементы Content Controls. Получается примерно вот такой документ http://mihailromanov.files.wordpress.com/2013/09/image48.png МР>Затем вы привязываете вставленные Content Controls к XML с данными (Custom XML), которая хранится в самом документе (в отдельной его части). Это вы делаете используя или сам Word (в версии 2013 и старше) или бесплатную утилиту Word Content Control Toolkit (к сожалению, она не умеет работать с Repeating Sections, кокторые появились в Word 2013 и используюятся для таблиц и списков). МР>Пишете код, либо с помошью Open XML SDK (немного проще), либо System.IO.Packaging (не сильно сложнее), который заменяет Custom XML на аналогичную по структуре, но уже с реальными данными. МР>Пользователи получают ваш готовый документ, открывают, а Word все рендерит. МР>
МР>Конечно, у подхода есть и свои недостатки/ограничения, например, таблицы с переменным числом строк можно сделать только начиная с 2013 офиса (и работать будут только там), а с переменным числом столбцов нельзя до сих пор. Или не получится делать изменение форматов (например, в зависимости от данных подкрасить текст разными цветами) — только вставка самих данных.
МР>Но есть и плюсы: МР>
МР>Как я уже говорил — шаблоны готовятся в самом Word, т.е. простом и привычном инструменте. Можете даже перепоручать подготовку специалистам-предметникам (тем, кто заказывает эти документы). Причем даже после того, как вы сделали привязку данных, никто не мешает драбатывать документ в том же Word (например добавить полей или поменять стиль) МР>Все инструменты (кроме Word и VS — но они вроде как присутсвуют в любом случае) — бесплатные. МР>(вот это нужно далеко не всем, но я все же упомяну) Механизм работает в 2 стороны: вы можете генерировать документы, подставляя XML с данными, а можете выдавать пользователям шаблоны (например, то же заявление), размеченные Content Controls с защитой от изменения (защита, конечно, липовая — просто от случайных искажений), которые они будут заполнять в удобном виде (нормальные контролы для даты, выпадающие списки, ...), а для извлечения этих введенных данных, достаточно будет прочитать Custom XML. МР>
Михаил, спасибо за развернутый ответ...мне вот что осталось непонятно — 2013 офис нужен только для формирования шаблона с повторяющимися секциями? Т.е. достаточно его иметь только у разработчиков или же у конечного пользователя тоже должен быть 13 офис? У нас сейчас ситуация такая. У всех в компании 10 офис и поменять его на 13 нельзя, но мы (разработчики) можем себе его поставить.
Здравствуйте, Mazenrab, Вы писали:
M>Михаил, спасибо за развернутый ответ...мне вот что осталось непонятно — 2013 офис нужен только для формирования шаблона с повторяющимися секциями? Т.е. достаточно его иметь только у разработчиков или же у конечного пользователя тоже должен быть 13 офис?
Если вам нужны в шаблонах повторяющиеся секции (т.е. таблицы и списки), то 2013 офис, нужен и у разработчиков и у пользователей. Увы.
У Microsoft ранее был в Word механизм, позволявший оперировать в Word переменным числом элементов для вставки и извлечения данных (он правда тоже назывался Custom XML из-за чего теперь есть некоторая путаница с Custom XML для Content Controls), но из-за иска i4i механизм был отключен. А сделать полную замену (или близко к тому) смогли только в Office 2013.
Посему, если в ваших отчетах нужны таблицы переменной величины а Office 2013 не доступен, то мне видятся следующие вараинты:
1. Сделать свой шаблонизатор. Например, можно размечать места для вставки с помощью bookmarks. Затем в документе находить нужные букмарки и вставлять реальные данные.
Тут потребуется некая библиотека, которая может не только формировать, но и читать документы. У Infragistics, похоже есть средства лишь для формирования документов с 0. Поэтому назову те, что знаю:
Aspose.Words for .NET — очень навороченная вещь. Умеет не только читать и менять Word-документы, но и рендерить их (например, если надо конвертировать в PDF). Самое гланое — имеет вполне вменяемую объектную модель для манипулирования документом (напоминает модель самого Word). Увы, стоит соответсвенно.
Open XML SDK — "ассемблер" для файлов в формате Open XML. По большому счету это набор типизированных классов, представляющих XML-структуру документов Office. Работать на таком уровне можно, но не слишком удобно (а иногда хочется просто застрелиться), зато бесплатно и от вендора.
Есть библиотеки от других поставщиков уомпонент, например от Syncfusion. О качестве судить не возьмусь, т.к. не работал.
2. Использовать какой-нибудь генератор отчетов, который поддерживает вывод в doc/docx
Например:
Stimulsoft Reports — по отзывам и обзору на сайте — отличный продукт! Но стоит денег
или бесплатный вариант от Microsoft: Microsoft.Reporting.WebForms.LocalReport (мы используем его, правда нам нужен PDF, но doc тоже поддерживается).
3. Сделать VSTO-плагин, уровня документа, который будет подставлять данные в поля документа (и расширять таблицу(ы) при необходимости). Сами данные при этом будут кэшироваться в документе (хотя в данном случае документ может вообще сам лазить куда надо за данными, но вам такое врятли нужно), а для обновления этих данных использовать специальный серверный класс Microsoft.VisualStudio.Tools.Applications.ServerDocument — он работает без использования Office.
Но тут уже надо смотреть, т.к. использование VSTO накладывает свои ограничения (например нужно устанавливать/обнолять плагины на машинах пользователей).
Если все же задумаетесь о таком варианте, то посмотрите на статью Managing Documents on a Server by Using the ServerDocument Class, а вообще про VSTO вцелом очень рекомендую книгу Eric Carter, Eric Lippert, Visual Studio Tools for Office 2007: VSTO for Excel, Word, and Outlook
4. Ну и самая, наверное экзотика (хотя почему?) — а не думали ли вы над вариантом формирования Excel-документов? Дело в том, что с Excel можно работать наподобие того, как работаете с Content Controls, причем там-то ограничений на рост таблиц в высоту отродясь не было
Если интересно, то в целом все выглядит так: Вы готовите XSD схему для данных, которые будете выгружать
Пользователи (разработчик документа) открывают вашу схему из Excel (наверняка есть механизм как все ваши схемы протолкнуть через групповые политики или аналоги, чтобы пользователям не нужно было даже файлы XSD открывать) и мышкой перетаскивают узлы дерева на нужные ячейки.
Выглядит примерно так:
Вы генерируите xml с данными и при помощи или VBA, или .Net + VSTO, или .Net + OpenXML SDK (если будете работать с xlsx-файлами) вставляете этот xml в документ.
Надеюсь, что что-то из этого будет вам полезно.
Здравствуйте, Mazenrab, Вы писали:
M>Посоветуйте что-нибудь приличное для генерации word-документов из шаблонов.
И если не сложно — отпишитесь потом, на каком решении решите остановиться.