Enregistrer le document de traitement de texte modifié dans un nouveau fichier

j'essaie d'ouvrir un document Word, modifier du texte, puis enregistrez les modifications dans un nouveau document. Je peux faire le premier pas en utilisant le code ci-dessous, mais je n'arrive pas à trouver comment sauvegarder les modifications dans un nouveau document (en spécifiant le chemin et le nom du fichier).

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:datahello.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);
            }
        }
      }
    }
}

je suis un débutant complet à cela, alors pardonnez la question de base!

34
demandé sur Jehof 2012-01-11 15:04:10

6 réponses

Si vous utilisez un MemoryStream , vous pouvez enregistrer les modifications dans un nouveau fichier comme ceci:

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()); 
}
30
répondu amurra 2012-01-11 11:55:09

in Open XML SDK 2.5:

    File.Copy(originalFilePath, modifiedFilePath);

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

wordprocessingDocument.AutoSave est vrai par défaut donc fermez et éliminez sauvegardera les modifications. wordprocessingDocument.Close n'est pas nécessaire explicitement parce que le bloc d'utilisation l'appellera.

cette approche n'exige pas que le contenu du fichier entier soit chargé en mémoire comme dans la réponse acceptée. Ce n'est pas un problème pour les petits fichiers, mais dans mon cas je dois traiter plus de fichiers docx avec XLSX intégré et le contenu pdf en même temps de sorte que le l'utilisation de la mémoire serait assez élevé.

6
répondu user3285954 2016-03-31 13:37:34

copiez simplement le fichier source vers la destination et faites des changements à partir de 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();
    }

espérons que ça marche.

3
répondu Mohamed Alikhan 2014-10-27 07:08:08

cette approche vous permet d'amortir le fichier" template "sans mettre le tout dans un byte[] , ce qui lui permet peut-être d'être moins gourmand en ressources.

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();
    }
}
1
répondu pimbrouwers 2018-07-17 12:20:10

la principale ressource pour Open XML est openxmldeveloper.org. Il y a plusieurs présentations et exemples de projets pour manipuler des documents:

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

Voir aussi la question suivante:

la Lecture d'un Mot 2007 table à l'aide de C#

0
répondu Sabuncu 2017-05-23 12:26:19

Pour moi ce a bien fonctionné:

// 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);
        }
    }
}
-2
répondu ren 2013-04-03 14:21:05