open office gratis documentformat descargar c# openxml openxml-sdk office-2007

c# - gratis - office xml handler windows 10 download



Guarde WordprocessingDocument modificado en un nuevo archivo (6)

El recurso principal para Open XML es openxmldeveloper.org. Tiene varias presentaciones y proyectos de muestra para manipular documentos:

http://openxmldeveloper.org/resources/workshop/m/presentations/default.aspx

También vea la siguiente pregunta:

Leyendo una tabla de Word 2007 usando C #

Estoy intentando abrir un documento de Word, cambiar algo de texto y luego guardar los cambios en un nuevo documento. Puedo obtener el primer bit utilizando el siguiente código, pero no puedo encontrar la manera de guardar los cambios en un documento NUEVO (especificando la ruta y el nombre del archivo).

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; using DocumentFormat.OpenXml.Packaging; using System.IO; namespace WordTest { class Program { static void Main(string[] args) { string template = @"c:/data/hello.docx"; string documentText; using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(template, true)) { using (StreamReader reader = new StreamReader(wordDoc.MainDocumentPart.GetStream())) { documentText = reader.ReadToEnd(); } documentText = documentText.Replace("##Name##", "Paul"); documentText = documentText.Replace("##Make##", "Samsung"); using (StreamWriter writer = new StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create))) { writer.Write(documentText); } } } } }

Soy un principiante completo en esto, ¡así que perdona la pregunta básica!


En Open XML SDK 2.5:

File.Copy(originalFilePath, modifiedFilePath); using (var wordprocessingDocument = WordprocessingDocument.Open(modifiedFilePath, isEditable: true)) { // Do changes here... }

wordprocessingDocument.AutoSave es verdadero por defecto, por lo que Close and Dispose guardará los cambios. wordprocessingDocument.Close no es necesario explícitamente porque el bloque que lo usa lo llamará.

Este enfoque no requiere que todo el contenido del archivo se cargue en la memoria como en la respuesta aceptada. No es un problema para archivos pequeños, pero en mi caso tengo que procesar más archivos docx con contenido embebido xlsx y pdf al mismo tiempo, por lo que el uso de la memoria sería bastante alto.


Este enfoque le permite almacenar en búfer el archivo "plantilla" sin agrupar todo el lote en un byte[] , lo que permite que consuma menos recursos.

var templatePath = @"c:/data/hello.docx"; var documentPath = @"c:/data/newFilename.docx"; using (var template = File.OpenRead(templatePath)) using (var documentStream = File.Open(documentPath, FileMode.OpenOrCreate)) { template.CopyTo(documentStream); using (var document = WordprocessingDocument.Open(documentStream, true)) { //do your work here document.MainDocumentPart.Document.Save(); } }


Para mí this funcionó bien:

// To search and replace content in a document part. public static void SearchAndReplace(string document) { using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true)) { string docText = null; using (StreamReader sr = new StreamReader(wordDoc.MainDocumentPart.GetStream())) { docText = sr.ReadToEnd(); } Regex regexText = new Regex("Hello world!"); docText = regexText.Replace(docText, "Hi Everyone!"); using (StreamWriter sw = new StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create))) { sw.Write(docText); } } }


Si usa un MemoryStream , puede guardar los cambios en un nuevo archivo como este:

byte[] byteArray = File.ReadAllBytes("c://data//hello.docx"); using (MemoryStream stream = new MemoryStream()) { stream.Write(byteArray, 0, (int)byteArray.Length); using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(stream, true)) { // Do work here } // Save the file with the new name File.WriteAllBytes("C://data//newFileName.docx", stream.ToArray()); }


Simplemente copie el archivo de origen en el destino y realice los cambios desde allí.

File.copy(source,destination); using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(destination, true)) { //Make changes to the document and save it. WordDoc.MainDocumentPart.Document.Save(); WordDoc.Close(); }

Espero que esto funcione.