无法保存在MemoryStream中加载的已编辑docx文件

时间:2017-06-30 21:23:51

标签: c# azure asp.net-web-api2 memorystream

我在 C#中有 WebAPI ,我需要通过POST加载文档,修改一些参数,然后将其保存到Azure Blob帐户。

我可以读取文件,我可以修改参数,但是当我将其保存到Azure时,文档将保存为原始文件。

/* file es del tipo System.Net.Http.StreamContent que viene en un POST */

byte[] byteArray = await file.ReadAsByteArrayAsync();
MemoryStream docStream = new MemoryStream();

docStream.Write(byteArray, 0, byteArray.Length);
docStream.Seek(0x00000000, SeekOrigin.Begin);

WordprocessingDocument doc = WordprocessingDocument.Open(docStream, true);
MainDocumentPart mainDocumentPart = doc.MainDocumentPart;

var descedants = mainDocumentPart.Document.Body.Descendants<SdtElement>();

var idRef = descedants.Where(c => c.FirstChild.Elements<SdtAlias>().Where(v => v.Val == "Asunto").Count() > 0).FirstOrDefault();
if (idRef != null && user != null)
{
    var tNomRef = idRef.Elements<SdtContentRun>().FirstOrDefault().FirstOrDefault();
    var textNomRef = (DocumentFormat.OpenXml.OpenXmlLeafTextElement)tNomRef.LastOrDefault();
    textNomRef.Text = info.idDocumento;
}

var titRef = descedants.Where(c => c.FirstChild.Elements<SdtAlias>().Where(v => v.Val == "Título").Count() > 0).FirstOrDefault();
if (titRef != null && user != null)
{
    var tNomRef = idRef.Elements<SdtContentRun>().FirstOrDefault().FirstOrDefault();
    var textNomRef = (DocumentFormat.OpenXml.OpenXmlLeafTextElement)tNomRef.LastOrDefault();
    textNomRef.Text = info.nomDocumento;
}

/* Este objeto se encarga de subir el archivo a un Blob Storage de Azure */
CloudBlockBlob blob = imagesContainer.GetBlockBlobReference(xNombre);
docStream.Position = 0;
blob.UploadFromStream(docStream);
docStream.Close();
docStream.Dispose();

2 个答案:

答案 0 :(得分:1)

您正在从流中填充DOM结构。

除非您实际将其保存回某处,否则原始流不会受到影响。

您应该创建一个新流并将编辑过的文档保存到它。

答案 1 :(得分:0)

修改doc(WordprocessingDocument)之后,需要先将更改保存回docStream(MemoryStream),然后再将docStream上传到blob存储。你需要做的只是在上传docStream之前添加doc.Save()。以下代码供您参考。

doc.Save();

CloudBlockBlob blob = imagesContainer.GetBlockBlobReference(xNombre);
docStream.Position = 0;