2012-05-19 16 views
16

Non riesco a eseguire lo streaming di un documento word che creo rapidamente sul browser. Ricevo costantemente un messaggio da Microsoft Word che il documento è corrotto.Streaming in memoria Documento Word che utilizza OpenXML SDK con ASP.NET produce un documento "corrotto"

Quando eseguo il codice tramite un'applicazione console e estrapro ASP.NET dall'immagine, il documento viene generato correttamente senza problemi. Credo che tutto sia incentrato sulla scrittura del file.

Qui è il mio codice:

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(); 
       } 

      } 

ho looked ad un sacco di links - ma niente funziona. Molte persone usano MemoryStream.WriteTo e alcuni usano BinaryWrite - a questo punto non sono sicuro di quale sia il modo corretto. Inoltre ho provato il tipo di contenuto più lungo, vale a dire application/vnd.openxmlformats-officedocument.wordprocessingml.document ma senza fortuna.

Alcuni screenshots - anche se si tenta di recuperare si ottiene lo stesso

Solution "parti mancanti o non valido" per coloro che inciampano su questa questione:

All'interno del usando() .. direttiva di WordProcessingDocument, è necessario chiamare:

wordDocument.Save();

anche per trasmettere correttamente il MemoryStream, utilizzare questo nel esterno blocco utilizzando:

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

Come si aggiunge un wordDocument.Save(); ? Ho provato e l'unico codice possibile vicino ad esso è .Close() e questo non funziona per me. – RicL

+1

Grazie a kd7 per la tua domanda e risposta. –

risposta

7

Uso CopyTo invece, v'è un errore nel WriteTo che rende sicuro per scrivere il l'intero contenuto del buffer quando lo stream di destinazione non supporta la scrittura di tutto in una volta.

1

Credo che il valore ContentType non sia corretto; questo è per il formato Word 97 - 2003. Cambiarlo a:

application/vnd.openxmlformats-officedocument.wordprocessingml.document 

e vedere se questo risolve il problema.

2

Ho copiato e incollato il codice e ho notato che: "wordDocument.close();" mancava clausule, aggiunto e funzionava (l'ho fatto in Asp.NET MVC witing un'azione)

0

Ad ampliare la risposta di Rodion e abbinare le variabili utilizzate nelle domande questo è ciò che ha funzionato per me:

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(); 
Problemi correlati