Intereting Posts

Программно генерировать редактируемые документы Word из ASP.NET?

objectiveю является создание документов предложений, которые можно вручную отредактировать в Word после факта, но перед отправкой их клиентам.

Большое количество предложений будет составлено из существующего содержимого веб-сайта HTML (поддерживающего CMS), а также некоторой пользовательской (не HTML) инъекции для определенных сценариев. Конечно, условная логика может перейти на серверную ASP.NET, чтобы соответствующим образом изменять контент.

Я открыт для сторонних инструментов, если необработанные манипуляции с API Word трудны. На самом деле хорошим сторонним инструментом может быть ответ.

Используйте компонент Aspose Words для .Net.

Назначить слова Компонентную ссылку

Компонент изначально понимает формат файла Microsoft Word без необходимости установки каких-либо продуктов Microsoft Office в вашу прикладную среду. Затем вы можете начать с существующего шаблона слова или программно создать весь документ Microsoft Word с нуля. Затем объектная модель Word позволяет экспортировать файлы doc / docx и т. Д. И сохранять в качестве родного файла Word, где бы вы ни находились.

На их веб-сайте есть множество демонстраций.

Раньше я не использовал сторонних инструментов, поскольку я только когда-либо писал приложения автоматизации Office для ПК, на которых уже установлен Office.

Создание документов с нуля или их создание на шаблоне довольно просто. С помощью шаблонов вы можете определить закладки и поля слияния почты, чтобы упростить поиск и замену элементов документа.

Вот несколько вещей, которые могут оказаться полезными:

Именованные и необязательные аргументы
Объектная модель Word достаточно прост в работе. С VB.NET было проще работать, чем с C #: поскольку API автоматизации Office изначально был написан с учетом VB, вы могли бы воспользоваться дополнительными параметрами. В более ранних версиях C # вам нужно было указать каждый аргумент в вызовах API, что было довольно утомительно. Я понимаю, что это изменилось в Visual C # 2010:

Практическое руководство. Использование именованных и необязательных аргументов в офисном программировании (Руководство по программированию на C #) http://msdn.microsoft.com/en-us/library/dd264738.aspx

Учебники
Я нашел эти учебники весьма удобными:

Автоматизация программ Office с помощью VB.NET
http://www.xtremevbtalk.com/showthread.php?t=160433

Часто задаваемые вопросы по автоматизации VB.NET Office
http://www.xtremevbtalk.com/showthread.php?t=160459

Понимание объектной модели Word с точки зрения разработчика .NET
http://msdn.microsoft.com/en-us/library/aa192495%28office.11%29.aspx

Ранняя и поздняя привязка
Следует упомянуть о том, что поздняя привязка обычно рекомендуется, но это может быть очень полезно, если вы не знаете, какая версия Office будет развернута на хосте приложения. Раннее связывание имеет тенденцию работать быстрее и имеет преимущество intellisense в вашей среде IDE:

Использование раннего связывания и позднего связывания в автоматизации
http://support.microsoft.com/kb/245115

Раннее и позднее переплетение
http://word.mvps.org/faqs/interdev/earlyvslatebinding.htm

Поиск и замена
Одна вещь, о которой нужно знать, это то, что объекты поиска и замены могут работать не так, как вы ожидали. Вместо поиска всего документа он ищет только основной текст. Если в документе есть текстовые фреймы, они будут проигнорированы. Вместо этого вам нужно пройти через все StoryRanges и выполнить поиск содержимого каждого из них. Вот что я делаю в VB.NET для поиска основной текстовой истории и текстовых фреймов:

Private Sub FindReplaceAll(ByVal objDoc As Object, ByVal strFind As String, ByVal strReplacement As String) Dim rngStory As Object For Each rngStory In objDoc.StoryRanges Do If rngStory.StoryType = wdMainTextStory Or rngStory.StoryType = wdTextFrameStory Then With rngStory.Find .Text = strFind .Replacement.Text = strReplacement .Wrap = wdFindContinue .Execute(Replace:=wdReplaceAll) End With End If rngStory = rngStory.NextStoryRange Loop Until rngStory Is Nothing Next rngStory End Sub 

Объект коллекции StoryRanges
http://msdn.microsoft.com/en-us/library/bb178940%28office.12%29.aspx

У меня долгая история создания документов и слияния. В прежние времена мы широко использовали Office COM даже в приложениях на стороне сервера (ASP). В течение многих лет мы узнали, что этот подход вызывает множество проблем, и сегодня я всегда выступаю против использования Office COM (Word automation) практически в любом сценарии.

Благодаря внедрению Microsoft Open SDK для SDC нам удалось создать надежный компонент слияния почты, который был во много раз быстрее и гораздо более надежным, чем решение (ы) с Office COM. По моему опыту Open XML SDK позволяет разработчику создать прочное решение, но для его полезности и надежности требуется много усилий и времени.

На рынке имеется несколько хороших библиотек для генерации / обработки документов. Позднее мы закончили покупку одного и, на мой взгляд, создание собственного решения (на основе Open XML SDK или Office COM) просто никогда не окупается.

В настоящее время мы используем Docentric Toolkit, который является библиотекой обработки документов общего назначения и даже лучшим набором инструментов для создания шаблонов / почтового слияния для .NET. Он позволяет создавать шаблоны в MS Word, а затем заполнять их данными приложений и создавать финальные документы в разных форматах.

Вы можете использовать XSL для создания некоторого WordML.

Этот метод определенно запутан, но дает вам много энергии в вашем макете.

Для создания документа Word вам не нужны сторонние элементы управления. С 2007 года и далее Word может читать html в качестве документа Word. Вы просто сохраняете любую веб-страницу с расширением « .doc », и Word будет сортировать ее.

Просто создайте свою веб-страницу любым форматированием, а затем сохраните ее с расширением .doc.

Я использовал HttpWebRequest для вызова Url (с parmaters) на мою страницу, затем использовал WebResponse и Stream чтобы получить мою страницу в буфер, затем StreamReader и StreamWriter чтобы сохранить ее в фактическом документе. Затем я получил свою собственную пользовательскую функцию для загрузки файла.

Если кто-то хочет, чтобы мой код дал мне знать