Domanda

Ho un po 'di codice che aprirà un documento Word 2007 (docx) e aggiornerà la CustomXmlPart appropriata (aggiornando così i Controlli del contenuto nel documento stesso mentre sono mappati sulla CustomXmlPart) ma non riesco a capire come salvarlo come nuovo file.! Sicuramente non può essere così difficile!

Il mio pensiero attuale è che devo aprire il modello e copiare il contenuto in un nuovo documento vuoto - file per file, aggiornando CustomXmlPart quando lo incontro. Chiamami vecchio stile ma mi sembra un po 'goffo!

Perché non posso semplicemente fare un WordprocessingDocument.SaveAs (nome file); ...?

Per favore, dimmi che qui mi manca qualcosa di semplice.

Grazie in anticipo

È stato utile?

Soluzione

Ti riferisci all'SDK OpenXml? Sfortunatamente, a partire da OpenXml SDK 2.0, non esiste un metodo SaveAs. Dovrai:

  1. Crea una copia temporanea del tuo file modello, nominandolo come preferisci.
  2. Esegui le tue modifiche OpenXml sul file sopra.
  3. Salva le sezioni appropriate (ad es. usando il metodo. myWordDocument.MainDocumentPart.Document.Save () per il contenuto principale o someHeaderPart.Header.Save () per un'intestazione particolare).

Altri suggerimenti

In effetti puoi, almeno, in OpenXml SDK 2.5. Tuttavia, fai attenzione a lavorare con una copia del file originale, poiché le modifiche all'XML si rifletteranno effettivamente nel file. Qui hai i metodi Load and Save della mia classe personalizzata (dopo aver rimosso un codice di convalida, ...):

    public void Load(string pathToDocx)
    {
        _tempFilePath = CloneFileInTemp(pathToDocx);
        _document = WordprocessingDocument.Open(_tempFilePath, true);
        _documentElement = _document.MainDocumentPart.Document;
    }    

    public void Save(string pathToDocx)
    {
        using(FileStream fileStream = new FileStream(pathToDocx, FileMode.Create))
        {
            _document.MainDocumentPart.Document.Save(fileStream);
        }
    }

Avere " _document " come istanza WordprocessingDocument .

In Open XML SDK 2.5 Close salva le modifiche quando AutoSave è true. Vedi la mia risposta qui: https://stackoverflow.com/a/36335092/3285954

Puoi usare un MemoryStream per scrivere le modifiche, piuttosto che nel file originale. Di conseguenza, è possibile salvare quel MemoryStream in un nuovo file:

byte[] byteArray = File.ReadAllBytes("c:\\temp\\mytemplate.docx");
using (var stream = new MemoryStream())
{
    stream.Write(byteArray, 0, byteArray.Length);
    using (var wordDoc = WordprocessingDocument.Open(stream, true))
    {
       // Do work here
       // ...
       wordDoc.MainDocumentPart.Document.Save(); // won't update the original file 
    }
    // Save the file with the new name
    stream.Position = 0;
    File.WriteAllBytes("C:\\temp\\newFile.docx", stream.ToArray()); 
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top