11
votes

Enregistrer un document openxml (mot) généré à partir d'un modèle

J'ai un peu de code qui ouvrira un document Word 2007 (DOCX) et mettra à jour le CustomXMLPart approprié (mettant ainsi à jour les commandes de contenu dans le document lui-même car elles sont mappées sur CustomXMLPart) mais ne peuvent pas déterminer comment Enregistrez ceci comme nouveau fichier.! Il ne peut sûrement pas être si difficile!

Ma pensée actuelle est que j'ai besoin d'ouvrir le modèle et de copier le contenu dans un nouveau document vierge - Fichier par fichier, mettez à jour le personnageXMLPART lorsque je le rencontre. Appelez-moi à l'ancienne mais cela semble un peu maladroit pour moi!

Pourquoi ne puis-je pas juste faire un wordprocessingingdocument.Saveas (nom de fichier); ...?

S'il vous plaît dites-moi que je manque quelque chose de simple ici.

Merci d'avance


2 commentaires

Je pensais que OpenXML était censé faire des choses Eriiser - pfft.! En quittant ce qui précède pour le moment où le moment est venu d'examiner la tâche suivante de la liste - intégrer une poignée de fichiers docx dans un seul docx (ne demandez pas!) Et je me donne simplement mal à la tête!


plus facile .. que la main-conducter le XML basé sur la spécification;)


4 Réponses :


15
votes

Parlez-vous du SDK OpenXML? Malheureusement, à partir de OpenXML SDK 2.0, il n'y a pas de méthode sauvée. Vous devrez:

  1. Faites une copie temporaire de votre fichier de modèle, nommant ce que vous voulez.
  2. Effectuez vos modifications openxml sur le fichier ci-dessus.
  3. Enregistrez les sections appropriées (c'est-à-dire à l'aide de la. mywordocument.maindocumentpart.document.save () Méthode pour le contenu principal ou Quelqu'unHeaderPart.header.save () Méthode pour un en-tête particulier).

3 commentaires

C'est à peu près ce que j'ai fini par faire - me semble un peu une omission. Si vous ouvrez un document et que vous le modifiez, il vous convient de pouvoir enregistrer la version mise à jour avec un nom différent.


La même chose peut être accomplie si vous lisez le fichier dans Memorytreams correct? Je veux éviter de faire des copies du fichier.


@Pabloromeo Je pense que cela pourrait être possible, mais ce n'est pas une approche que j'ai essayée quand je travaillais avec OpenXML. Vous pouvez probablement travailler avec le MemoryStream puis enregistrez-le sur un nom de fichier souhaité à la fin, si c'est le but. Ces liens peuvent aider: Utilisation de -Memory Ouvrir des documents XML et OpenXML et Memorystreams?



0
votes

En effet, vous pouvez, au moins, dans OpenXML SDK 2.5. Cependant, regarder de travailler avec une copie du fichier d'origine, car les modifications du XML seront réellement reflétées dans le fichier. Ici, vous avez les méthodes chargées et économisez de ma classe personnalisée (après avoir retiré du code de validation, ...): xxx

avoir "_document" en tant que wordprocessingingdocument instance .


0 commentaires

0
votes

in Open XML SDK 2.5 Fermer les modifications sauve les modifications lorsque l'automobile est vrai. Voir ma réponse ici: https://stackoverflow.com/a/36335092/3285954


0 commentaires

1
votes

Vous pouvez utiliser une mémoire Mémoire pour écrire les modifications plutôt que dans le fichier d'origine. Par conséquent, vous pouvez enregistrer cette mémoire Mémoire à 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()); 
}


0 commentaires