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();
Come si aggiunge un wordDocument.Save(); ? Ho provato e l'unico codice possibile vicino ad esso è .Close() e questo non funziona per me. – RicL
Grazie a kd7 per la tua domanda e risposta. –