无法保存在 MemoryStream 中加载的已编辑 docx 文件
Can't save edited docx file loaded in 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();
您正在从流中填充 DOM 结构。
除非您实际将其保存回某个地方,否则原始流不会受到影响。
您应该创建一个新流并将编辑后的文档保存到其中。
修改doc(WordprocessingDocument) 后,您需要先将更改保存回docStream(MemoryStream),然后再将docStream 上传到blob 存储。您需要做的只是在上传 docStream 之前添加 doc.Save() 。以下代码供您参考。
doc.Save();
CloudBlockBlob blob = imagesContainer.GetBlockBlobReference(xNombre);
docStream.Position = 0;
我在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();
您正在从流中填充 DOM 结构。
除非您实际将其保存回某个地方,否则原始流不会受到影响。
您应该创建一个新流并将编辑后的文档保存到其中。
修改doc(WordprocessingDocument) 后,您需要先将更改保存回docStream(MemoryStream),然后再将docStream 上传到blob 存储。您需要做的只是在上传 docStream 之前添加 doc.Save() 。以下代码供您参考。
doc.Save();
CloudBlockBlob blob = imagesContainer.GetBlockBlobReference(xNombre);
docStream.Position = 0;