J'ai créé une DLL qui prend un modèle Word, j'ai un code qui édite le document en utilisant openXML puis le résultat est envoyé par flux mémoire à un service web où les documents sont téléchargés à l'utilisateur. Le problème est que le flux de mémoire envoie est le document de modèle d'origine sans les mises à jour OU envoie le format XML de document Word mis à jour où le document est évidemment endommagé. Voici le code:L'édition de docx avec openxml renvoie une mémoire invalide
string strTemplate = AppDomain.CurrentDomain.BaseDirectory + "Report Template.docx";
WordprocessingDocument wdDocument;
//stream the template
byte[] fileBytes = File.ReadAllBytes(strTemplate);
MemoryStream memstreamDocument = new MemoryStream();
memstreamDocument.Write(fileBytes, 0, (int)fileBytes.Length);
wdDocument = WordprocessingDocument.Open(memstreamDocument, true);
//CODE TO UPDATE TEMPLATE
//Save entire document
wdDocument.MainDocumentPart.Document.Save();
Après avoir enregistré le document, si vous utilisez le code suivant le flux de mémoire renvoie le modèle d'origine sans aucune mise à jour du document:
return memstreamDocument;
Si vous utilisez le code suivant la mémoire flux renvoie les données OpenXML avec les mises à jour, mais le document est corrompu:
MemoryStream memstreamUpdatedDocument = new MemoryStream();
Stream streamDocument = wdDocument.MainDocumentPart.GetStream();
streamDocument.CopyTo(memstreamUpdatedDocument);
return memstreamUpdatedDocument;
Voici mon code dans le service Web qui fonctionne très bien:
HttpResponse response = HttpContext.Current.Response;
MemoryStream stream = GR.GetReport("", intReportID, Culture, ConnectionString, false);
response.Clear();
response.ClearHeaders();
response.ClearContent();
response.AddHeader("content-disposition", "attachment; filename=\"" + "Report_" + intReportID+ ".docx\"");
response.ContentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
response.ContentEncoding = Encoding.GetEncoding("ISO-8859-1");
stream.Position = 0;
stream.CopyTo(response.OutputStream);
response.End();
return response;