2012-05-19 40 views
16

No puedo transmitir un documento de Word que creo sobre la marcha al navegador. Constantemente recibo un mensaje de Microsoft Word de que el documento está dañado.Transmitir en la memoria Documento de Word con OpenXML SDK w/ASP.NET da como resultado un documento "corrupto"

Cuando ejecuto el código a través de una aplicación de consola y elimino ASP.NET de la imagen, el documento se genera correctamente sin problemas. Creo que todo se centra en escribir el archivo.

Aquí está mi código:

using (MemoryStream mem = new MemoryStream()) 
      { 
       // Create Document 
       using (WordprocessingDocument wordDocument = WordprocessingDocument.Create(mem, 
      WordprocessingDocumentType.Document, true)) 
       { 
        // Add a main document part. 
        MainDocumentPart mainPart = wordDocument.AddMainDocumentPart(); 

        new Document(new Body()).Save(mainPart); 

        Body body = mainPart.Document.Body; 
        body.Append(new Paragraph(
           new Run(
            new Text("Hello World!")))); 

        mainPart.Document.Save(); 
        // Stream it down to the browser 

        // THIS IS PROBABLY THE CRUX OF THE MATTER <--- 
        Response.AppendHeader("Content-Disposition", "attachment;filename=HelloWorld.docx"); 
        Response.ContentType = "application/vnd.ms-word.document"; 
        mem.WriteTo(Response.OutputStream); 
        Response.End(); 
       } 

      } 

tengo looked a una gran cantidad de links - pero nada funciona. Mucha gente usa MemoryStream.WriteTo y algunos usan BinaryWrite; en este momento no estoy seguro de cuál es la forma correcta. También probé el tipo de contenido más largo, es decir, application/vnd.openxmlformats-officedocument.wordprocessingml.document pero no tuve suerte.

Algunas capturas de pantalla - incluso si intenta recuperar se obtiene el mismo

Solución "parte falta o no válido" para aquellos que tropiezan en esta pregunta:

Dentro del uso de() .. directiva de WordProcessingDocument, debe llamar a:

wordDocument.Save();

también para transmitir correctamente el MemoryStream, utilice esta en el exterior utilizando el bloque:

Response.ContentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; 
       Response.AppendHeader("Content-Disposition", "attachment;filename=HelloWorld.docx"); 
       mem.Position = 0; 
       mem.CopyTo(Response.OutputStream); 
       Response.Flush(); 
       Response.End(); 

enter image description here enter image description here

+0

Cómo se agrega una palabraDocument.Save(); ? Intenté y el único código posible cercano es .Close() y eso no funciona para mí. – RicL

+1

Gracias kd7 por su pregunta y respuesta. –

Respuesta

7

Uso CopyTo lugar, hay un error en WriteTo que le hace dejar de escribir el todo el contenido del búfer cuando el flujo de destino no admite escribir todo de una vez.

1

Creo que su valor ContentType es incorrecto; eso es para Word 97 - formato 2003. Cámbielo a:

application/vnd.openxmlformats-officedocument.wordprocessingml.document 

y vea si eso soluciona el problema.

2

He copiado y pegado su código y he notado que el: "wordDocument.close();" Clausule faltaba, lo agregó y funcionó (lo hice en Asp.NET MVC buscando una acción)

0

Para ampliar la respuesta de Rodion y combinar las variables utilizadas en las preguntas esto es lo que funcionó para mí:

Response.ContentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; 
Response.AppendHeader("Content-Disposition", "attachment;filename=HelloWorld.docx"); 
mem.Position = 0; 
byte[] arr = mem.ToArray(); 
Response.BinaryWrite(arr); 
Response.Flush(); 
Response.End(); 
Cuestiones relacionadas