2011-03-25 161 views
12

Quiero convertir una página html a docx en C#, ¿cómo puedo hacerlo?Convertir Html a Docx en C#

+1

http://stackoverflow.com/questions/32151/best-way-to-export-html-to-word-without-having-ms-word-installed –

+0

@PranayRana, esta publicación tiene mucha más información que la uno que ha vinculado. ¿Lo has notado en absoluto? – Rahul

Respuesta

4

El uso de ese código para convertir

Microsoft.Office.Interop.Word.Application word = 
    new Microsoft.Office.Interop.Word.Application(); 
Microsoft.Office.Interop.Word.Document wordDoc = 
    new Microsoft.Office.Interop.Word.Document(); 
Object oMissing = System.Reflection.Missing.Value; 
wordDoc = word.Documents.Add(ref oMissing, ref oMissing, ref oMissing, ref oMissing); 
word.Visible = false; 
Object filepath = "c:\\page.html"; 
Object confirmconversion = System.Reflection.Missing.Value; 
Object readOnly = false; 
Object saveto = "c:\\doc.pdf"; 
Object oallowsubstitution = System.Reflection.Missing.Value; 

wordDoc = word.Documents.Open(ref filepath, ref confirmconversion, 
    ref readOnly, ref oMissing, 
    ref oMissing, ref oMissing, ref oMissing, ref oMissing, 
    ref oMissing, ref oMissing, ref oMissing, ref oMissing, 
    ref oMissing, ref oMissing, ref oMissing, ref oMissing); 
object fileFormat = WdSaveFormat.wdFormatPDF; 
wordDoc.SaveAs(ref saveto, ref fileFormat, ref oMissing, ref oMissing, ref oMissing, 
    ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, 
    ref oMissing, ref oMissing, ref oMissing, ref oallowsubstitution, ref oMissing, 
    ref oMissing); 
0

Aspose.Words for .NET es un componente comercial que le permite lograr esto.

+0

Una muestra para [convertir el documento HTML a Word] (http://www.aspose.com/documentation/.net-components/aspose.words-for-.net/aspose.words.loadformat.html) utilizando Aspose. Las palabras para .NET también se pueden ver. –

+1

Tuve algunos problemas con ASPOSE pasando de html a docx, como problemas de estilo y formato de imagen que parecían bastante básicos para mí y los consideraron como limitaciones del producto ... – Ariel

+0

De acuerdo. La falta de soporte para CSS, incluso CSS incrustado, significa que tiene que formatear todas las tablas, párrafos e incluso listas usted mismo. – nullnvoid

0

MigraDoc puede ayudar. O usando herramientas VS para Office. O conectándose a Office a través de COM.

0

Puede considerar el uso de PHPDocX que ofrece una herramienta muy conveniente para convertir archivos HTML y/o cadenas de texto HTML en WordML.

Tiene un montón de opciones, entre ellas:

  1. puede filtrar usando selector de estilo CSS, que trozos de HTML deben pueden insertar en el documento de Word.
  2. Puede elegir si descargar la imagen o dejarla como enlaces externos.
  3. Analiza formularios HTML.
  4. Puede usar estilos de Word nativos para tablas y párrafos que sobrescriban el CSS original.
  5. Transforma anclas HTML en los marcadores de Word.
  6. etcétera

Yo espero que les sea útil :-)

7

A continuación hace lo mismo que el código de Luis, pero sólo un poco más fácil de leer y se aplica a una aplicación ASP.NET MVC:

var word = new Microsoft.Office.Interop.Word.Application(); 
word.Visible = false; 

var filePath = Server.MapPath("~/MyFiles/Html2PdfTest.html"); 
var savePathPdf = Server.MapPath("~/MyFiles/Html2PdfTest.pdf"); 
var wordDoc = word.Documents.Open(FileName: filePath, ReadOnly: false); 
wordDoc.SaveAs2(FileName: savePathPdf, FileFormat: WdSaveFormat.wdFormatPDF); 

también puede guardar en otros formatos, como docx así:

var savePathDocx = Server.MapPath("~/MyFiles/Html2PdfTest.docx"); 
var wordDoc = word.Documents.Open(FileName: filePath, ReadOnly: false); 
wordDoc.SaveAs2(FileName: savePathDocx, FileFormat: WdSaveFormat.wdFormatXMLDocument); 
+1

Recuerde llamar 'wordDoc.Close()' y 'wordDoc.Quit()' para deshacerse del objeto después, de lo contrario, quedará con instancias de palabra que se ejecuta en segundo plano. –

2

Mi solución usa Html2OpenXml junto con DocumentFormat.OpenXml (NuGet package for Html2OpenXml is here) para proporcionar una solución elegante para ASP.NET MVC.

WordHelper.cs

public static class WordHelper 
{ 
    public static byte[] HtmlToWord(String html) 
    { 
     const string filename = "test.docx"; 
     if (File.Exists(filename)) File.Delete(filename); 

     using (MemoryStream generatedDocument = new MemoryStream()) 
     { 
      using (WordprocessingDocument package = WordprocessingDocument.Create(
        generatedDocument, WordprocessingDocumentType.Document)) 
      { 
       MainDocumentPart mainPart = package.MainDocumentPart; 
       if (mainPart == null) 
       { 
        mainPart = package.AddMainDocumentPart(); 
        new Document(new Body()).Save(mainPart); 
       } 

       HtmlConverter converter = new HtmlConverter(mainPart); 
       Body body = mainPart.Document.Body; 

       var paragraphs = converter.Parse(html); 
       for (int i = 0; i < paragraphs.Count; i++) 
       { 
        body.Append(paragraphs[i]); 
       } 

       mainPart.Document.Save(); 
      } 

      return generatedDocument.ToArray(); 
     } 
    } 
} 

controlador

[HttpPost] 
    [ValidateInput(false)] 
    public FileResult Demo(CkEditorViewModel viewModel) 
    { 
     return File(WordHelper.HtmlToWord(viewModel.CkEditorContent), 
      "application/vnd.openxmlformats-officedocument.wordprocessingml.document"); 
    } 

que estoy usando CKEditor para generar HTML para esta muestra.

0

Microsoft no recomienda el uso de aplicaciones de oficina en el servidor web. sin embargo, esto se puede hacer con bastante facilidad utilizando el OpenXML 2,5

Todo lo que tiene que hacer realmente se divide el HTML ("<", '>') continuación, para cada parte empujarlo hacia el detector y determinar si es una etiqueta HTML o no

Luego, para cada parte que se puede empezar a convertir el HTML a "Ejecutar" y "RunProperties" y el texto no HTML se coloca simplemente en el "texto"

Suena duro entonces que es ... y sí, no tengo idea de por qué no hay un código disponible para hacer exactamente esto.

Cosas a tener en cuenta. Los dos formatos no se convierten limpiamente entre sí, por lo que si se centra en el código más limpio posible, se encontrará con un problema en el que el formato se vuelve desordenado.