net name generate example comentarios c# ms-word ms-office openxml

name - xml comments c#



El documento de palabra de ahorro XML abre el archivo daƱado (1)

Cambie su propiedad DocumentData a esto y creo que debería funcionar. Lo importante es cerrar el documento antes de leer el flujo de memoria.

public byte[] DocumentData { get { this.document.ChangeDocumentType(WordprocessingDocumentType.MacroEnabledDocument); this.document.MainDocumentPart.Document.Save(); this.document.Close(); byte[] documentData = this.stream.ToArray(); return documentData; } }

Aunque soy nuevo en el mundo Open-XML, ya me he encontrado con algunos problemas / problemas al usarlo. La mayoría de ellos se resolvió fácilmente, pero no puedo evitar esto:

public class ReportDocument : IDisposable { private MemoryStream stream; private WordprocessingDocument document; private MainDocumentPart mainPart; public byte[] DocumentData { get { this.document.ChangeDocumentType(WordprocessingDocumentType.MacroEnabledDocument); byte[] documentData = this.stream.ToArray(); return documentData; } } public ReportDocument() { byte[] template = DocumentTemplates.SingleReportTemplate; this.stream = new MemoryStream(); stream.Write(template, 0, template.Length); this.document = WordprocessingDocument.Open(stream, true); this.mainPart = document.MainDocumentPart; } public void SetReport(Report report) { Body body = mainPart.Document.Body; var placeholder = body.Descendants<SdtBlock>(); this.SetPlaceholderTextValue(placeholder, "Company", WebApplication.Service.Properties.Settings.Default.CompanyName); this.SetPlaceholderTextValue(placeholder, "Title", String.Format("Status Report for {0} to {1}", report.StartDate.ToShortDateString(), report.ReportingInterval.EndDate.ToShortDateString())); //this.SetPlaceholderTextValue(placeholder, "Subtitle", String.Format("for {0}", report.ReportingInterval.Project.Name)); this.SetPlaceholderTextValue(placeholder, "Author", report.TeamMember.User.Username); this.SetPlaceholderTextValue(placeholder, "Date", String.Format("for {0}", DateTime.Today.ToShortDateString())); } private void SetPlaceholderTextValue(IEnumerable<SdtBlock> sdts, string alias, string value) { SdtContentBlock contentBlock = this.GetContentBlock(sdts, alias); Text text = contentBlock.Descendants<Text>().First(); text.Text = value; } private SdtContentBlock GetContentBlock(IEnumerable<SdtBlock> sdts, string alias) { return sdts.First(sdt => sdt.Descendants<SdtAlias>().First().Val.Value == alias).SdtContentBlock; } public void Dispose() { this.document.Close(); } }

Así que creo un documento nuevo, basado en una plantilla que gana a través de la secuencia de la memoria y quiero volver a escribirlo en una secuencia de memoria cuando se realizan los cambios.

El gran problema es que cuando guardo la matriz de bytes resultante, el archivo de datos docx está dañado:

El archivo document.xml in. / Word se llama document2.xml El documento.xml.rels in. / Word_rels se llama document2.xml.rels y contiene Espero que algunos de ustedes puedan proporcionarle buenas soluciones.

MFG SakeSushiBig