2012-01-11 8 views
30

Sto tentando di aprire un documento di Word, modificare del testo e salvare le modifiche in un nuovo documento. Posso ottenere il primo bit usando il codice qui sotto ma non riesco a capire come salvare le modifiche in un documento NUOVO (specificando il percorso e il nome del file).Salva WordprocessingDocument modificato in nuovo file

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); 
      } 
     } 
     } 
    } 
} 

Sono un principiante assoluto in questo, quindi perdona la domanda di base!

risposta

28

Se si utilizza un MemoryStream è possibile salvare le modifiche in un nuovo file come this:

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()); 
} 
-1

Per me this ha funzionato bene:

// 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); 
     } 
    } 
} 
+0

Questo lo salva nel documento SAME e pertanto non risponde alla domanda. –

3

Basta copiare il file di origine nella destinazione e apportare modifiche da lì.

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(); 
    } 

Spero che questo funzioni.

+2

1. Sembra che tu voglia scrivere 'wordDoc.Save()'. 2. Non esiste il metodo 'Save()'. Quindi questa non mi sembra una soluzione valida. C'è qualcosa che mi manca ?? –

+0

Si noti che questo codice 'MainDocumentPart.Document.Save()' non salverà l'intero documento pacchetto/parola. Ci sono altre parti che devono essere salvate (il mio problema era che le note a piè di pagina non stavano salvando, che non sono sotto il 'MainDocumentPart'). Ho finito per usare la risposta accettata piuttosto che cercare di capire quali bit avevo bisogno di chiamare salvare. –

+0

Per quelli che hai salvato individualmente. –

4

In SDK Open XML 2.5:

File.Copy(originalFilePath, modifiedFilePath); 

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

wordprocessingDocument.AutoSave vale per default così vicino e lo smaltimento salverà le modifiche. wordprocessingDocument.Close non è necessario in modo esplicito perché il blocco using lo chiamerà.

Questo approccio non richiede l'intero contenuto del file da caricare in memoria come nella risposta accettata. Non è un problema per i file di piccole dimensioni, ma nel mio caso devo elaborare più file docx con contenuto xlsx e pdf incorporato allo stesso tempo, quindi l'utilizzo della memoria sarebbe piuttosto elevato.

Problemi correlati