Question

J'ai un peu de code qui ouvrira un document Word 2007 (docx) et mettra à jour le CustomXmlPart approprié (mettant ainsi à jour les contrôles de contenu dans le document car ils sont mappés sur le CustomXmlPart), mais je ne peux pas résoudre le problème. enregistrez ceci dans un nouveau fichier.! Cela ne peut sûrement pas être si difficile!

Je pense actuellement que je dois ouvrir le modèle et copier le contenu dans un nouveau document vide, fichier par fichier, en mettant à jour le CustomXmlPart lorsque je le rencontre. Appelez-moi à l'ancienne, mais cela me semble un peu maladroit!

Pourquoi ne puis-je pas simplement faire un WordprocessingDocument.SaveAs (nom du fichier); ...?

S'il vous plaît, dites-moi qu'il me manque quelque chose de simple ici.

Merci d'avance

Était-ce utile?

La solution

Faites-vous référence au SDK OpenXml? Malheureusement, à partir d'OpenXml SDK 2.0, il n'y a pas de méthode SaveAs. Vous aurez besoin de:

  1. Faites une copie temporaire de votre fichier de modèle, en le nommant comme vous le souhaitez.
  2. Effectuez vos modifications OpenXml sur le fichier ci-dessus.
  3. Enregistrez les sections appropriées (en utilisant, par exemple, la méthode. myWordDocument.MainDocumentPart.Document.Save () pour le contenu principal ou la méthode someHeaderPart.Header.Save () pour un en-tête particulier).

Autres conseils

En effet, vous pouvez au moins utiliser OpenXml SDK 2.5. Cependant, veillez à utiliser une copie du fichier d'origine, car les modifications apportées au XML seront réellement reflétées dans le fichier. Ici, vous avez les méthodes Load and Save de ma classe personnalisée (après avoir supprimé du code de validation, ...):

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

Avoir le " _document " en tant qu'instance WordprocessingDocument .

Dans Open XML SDK 2.5, Close enregistre les modifications lorsque AutoSave a la valeur true. Voir ma réponse ici: https://stackoverflow.com/a/36335092/3285954

Vous pouvez utiliser un MemoryStream pour écrire les modifications plutôt que dans le fichier d'origine. Par conséquent, vous pouvez enregistrer ce MemoryStream dans un nouveau fichier:

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()); 
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top