¿Cómo se puede crear un documento de Word en C #?

Tengo un proyecto en el que me gustaría generar un informe de exportación en formato MS Word. El informe incluirá imágenes / gráficos, tablas y texto. ¿Cuál es la mejor manera de hacer esto? Herramientas de terceros? ¿Cuáles son tus experiencias?

La respuesta dependerá ligeramente de si la aplicación se está ejecutando en un servidor o si se está ejecutando en la máquina cliente. Si está ejecutando en un servidor, querrá usar uno de los formatos de generación de oficinas basados ​​en XML, ya que existen problemas conocidos al usar Office Automation en un servidor .

Sin embargo, si está trabajando en el equipo cliente, puede elegir entre usar Office Automation o utilizar el formato Office Open XML (consulte los enlaces a continuación), que es compatible con Microsoft Office 2000 y ya sea de forma nativa o mediante service packs. Sin embargo, un recordatorio de esto es que quizás no puedas insertar algunos tipos de gráficos o imágenes que deseas mostrar.

La mejor manera de hacer las cosas dependerá de la cantidad de tiempo que tenga para invertir en el desarrollo. Si sigue la ruta de la Automatización de Office, hay bastantes buenos tutoriales que se pueden encontrar a través de Google y que son bastante fáciles de aprender. Sin embargo, el formato XML de Open Office es bastante nuevo, por lo que es posible que la curva de aprendizaje sea un poco más alta.

Office Open XML Iinformation

Biblioteca libre de DocX para crear documentos DocX, desarrollada activamente y muy fácil e intuitiva de usar. Dado que CodePlex está muriendo, el proyecto se ha movido a github .

Pasé la última semana aproximadamente informándome sobre Office Open XML . Tenemos una aplicación de base de datos que almacena datos de encuestas que queremos reportar en Microsoft Word. En realidad, puede crear archivos de Word 2007 (docx) desde cero en C #. Open XML SDK versión 2 incluye una aplicación genial llamada Document Reflector que realmente proporcionará el código C # para recrear completamente un documento de Word. Puedes usar partes o todo el código, y sustituir los bits que quieras cambiar sobre la marcha. El archivo de ayuda incluido con el SDK también contiene algunas buenas muestras de código.

No hay necesidad de Office Interop ni de ningún otro software de Office en el servidor; los nuevos formatos son 100% XML.

¿Ha considerado usar .RTF como alternativa?

Es compatible con la incrustación de imágenes y tablas, así como texto, se abre de forma predeterminada con Microsoft Word y, aunque su funcionalidad es más limitada (cuenta cualquier formateo avanzado) para algo que se ve y se siente como un documento de Word, no está lejos.

Sus usuarios finales probablemente no lo notarán.

He encontrado que Aspose Words es la mejor, ya que no todo el mundo puede abrir Office Open XML / *. Los archivos de formato docx y Word interop y Word Automation pueden tener errores. Aspose Words es compatible con la mayoría de los tipos de archivos de documentos desde Word 97 en adelante.

Es un componente de pago pero tiene un gran soporte. La otra alternativa como ya se sugirió es RTF.

Para generar documentos de Word con Office Automation dentro de .NET, específicamente en C # o VB.NET:

  1. Agregue la referencia de ensamblado Microsoft.Office.Interop.Word a su proyecto. La ruta es \ Visual Studio Tools para Office \ PIA \ Office11 \ Microsoft.Office.Interop.Word.dll .

  2. Siga el ejemplo del código de Microsoft que puede encontrar aquí: http://support.microsoft.com/kb/316384/en-us .

Schmidty, si desea generar documentos de Word en un servidor web, necesitará una licencia para cada cliente (no solo para el servidor web). Vea esta sección en el primer enlace publicado por Rob:

“Además de los problemas técnicos, también debe considerar los problemas de licencia. Las pautas de licencia actuales impiden que las aplicaciones de Office se utilicen en un servidor para atender las solicitudes de los clientes, a menos que esos clientes tengan copias autorizadas de Office. las estaciones de trabajo sin licencia no están cubiertas por el Contrato de licencia de usuario final (EULA) “.

Si cumple con los requisitos de licencia, creo que deberá usar COM Interop, para ser específicos, las Asambleas de interoperabilidad primarias de Office XP .

Consulte VSTO (Visual Studio Tools for Office). Es bastante simple crear una plantilla de Word, inyectar una isla de datos xml en ella, y luego enviarla al cliente. Cuando el usuario abre el documento en Word, Word lee el xml y lo transforma en WordML y lo renderiza. Deberá consultar la clase ServerDocument de la biblioteca VSTO. No se requiere licencia adicional de mi experiencia.

He tenido un gran éxito utilizando Syncfusion Backoffice DocIO, que admite formatos doc y docx.

En versiones anteriores no era compatible con todo en Word, pero de acuerdo con su lista lo probamos con tablas y texto como un enfoque de combinación de correspondencia y funcionó bien.

Sin embargo, no estoy seguro acerca de la importación de imágenes. En su página de blurb http://www.syncfusion.com/products/DocIO/Backoffice/features/default.aspx dice

Blockquote Essential DocIO tiene soporte para insertar imágenes Scalar y Vector en el documento, en casi todos los formatos. Bitmap, gif, png y tiff son algunos de los tipos de imágenes comunes compatibles.

Entonces vale la pena considerar

Como han mencionado otros, puede comstackr un documento RTF, hay algunas buenas bibliotecas RTF para .net como http://www.codeproject.com/KB/string/nrtftree.aspx

Enfrenté este problema y creé una pequeña biblioteca para esto. Fue utilizado en varios proyectos y luego decidí publicarlo. Es gratis y muy simple, pero estoy seguro de que te ayudará con la tarea. Invoque la biblioteca Office Open XML Library, http://invoke.co.nz/products/docx.aspx .

He escrito una serie de publicaciones de blog sobre la generación de documentos Open XML WordprocessingML . Mi enfoque es que cree un documento de plantilla que contenga controles de contenido, y en cada control de contenido escriba una expresión XPath que defina cómo recuperar el contenido de un documento XML que contiene los datos que dirigen el proceso de generación de documentos. El código es gratuito y está licenciado bajo la Licencia Recíproca de Microsoft (Ms-RL) . En esa misma serie de publicaciones de blog, también exploro un enfoque en el que escribes código C # en controles de contenido. El proceso de generación de documentos luego procesa el documento de plantilla y genera un progtwig C # que genera los documentos deseados. Una ventaja de este enfoque es que puede usar cualquier fuente de datos como fuente de datos para el proceso de generación de documentos. Ese código también está licenciado bajo la Licencia Recíproca de Microsoft.

Actualmente hago esto exactamente.

Si el documento no es muy grande, no contiene imágenes y tal, entonces lo almaceno como un RTF con # MergeFields # y simplemente lo reemplazo por contenido, enviando el resultado al usuario como RTF.

Para documentos más grandes, incluidas imágenes e imágenes insertadas dinámicamente, guardo de nuevo el documento de Word inicial como un archivo de página web * .mht único que contiene # MergeFields #. Luego hago lo mismo que arriba. Usando esto, puedo renderizar fácilmente una DataTable con algunas tags de tabla Html básicas y reemplazar una de las # MergeFields # con una tabla completa.

Las imágenes se pueden almacenar en su servidor y la url incrustada en el documento también.

Curiosamente, los nuevos formatos de archivo de Office 2007 son en realidad archivos zip: si cambia el nombre de la extensión a .zip, puede abrirlos y ver sus contenidos. Esto significa que debe poder cambiar el contenido, como las imágenes dentro y fuera, usando una simple biblioteca zip C #.

@Dale Ragan: Eso funcionará para el formato XML de Office 2003, pero eso no es portátil (como, por ejemplo, los archivos .doc o .docx).

Para leer / escribir ésos, necesitarás usar el control ActiveX de la Biblioteca de objetos de Word:

http://www.codeproject.com/KB/aspnet/wordapplication.aspx

@ Danny Smurf: en realidad, este artículo describe lo que se convertirá en el formato Office Open XML con el que Rob respondió. Prestaré más atención a los enlaces que publico por el momento para asegurarme de que no estén obsoletos. De hecho, hice una búsqueda en WordML, que es como se llamaba en ese momento.

Creo que el formato Office Open XML es la mejor manera de hacerlo.

LibreOffice también admite interacción sin cabeza a través de API. Lamentablemente, actualmente no hay mucha información sobre esta función todavía 🙁

También podría usar el generador de documentos de Word. Se puede usar para la implementación del lado del cliente o del lado del servidor. De la descripción del proyecto:

WordDocumentGenerator es una utilidad para generar documentos de Word a partir de plantillas que usan Visual Studio 2010 y Open XML 2.0 SDK. WordDocumentGenerator ayuda a generar documentos de Word tanto no actualizables como actualizables basados ​​en plantillas predefinidas que usan cambios mínimos de código. Los controles de contenido se utilizan como marcadores de posición para la generación de documentos. Es compatible con Word 2007 y Word 2010.

Agarralo: http://worddocgenerator.codeplex.com/

Descargar SDK: http://www.microsoft.com/en-us/download/details.aspx?id=5124

Otra alternativa es Windward Docgen (descargo de responsabilidad: soy el fundador). Con Windward puede diseñar la plantilla en Word, incluidas imágenes, tablas, gráficos, indicadores y todo lo que desee. Puede establecer tags donde se insertan datos de un origen de datos XML o SQL (incluida la funcionalidad como para cada bucle, importar, etc.). Y luego genere el informe a DOCX, PDF, HTML, etc.