Ich habe eine Word-Dateivorlage und eine XML-Datei für Daten. Ich möchte Inhalte finden Inhaltskontrolle in Word und Daten aus XML abrufen und dann Text in Word-Vorlage ersetzen. Ich verwende den folgenden Code, aber es aktualisiert keine Word-Datei.

using (WordprocessingDocument document = WordprocessingDocument.CreateFromTemplate(txtWordFile.Text))       
{
           MainDocumentPart mainPart = document.MainDocumentPart;
            IEnumerable<SdtBlock> block = mainPart.Document.Body.Descendants<SdtBlock>().Where
                (r => r.SdtProperties.GetFirstChild<Tag>().Val == "TotalClose");
            Text t = block.Descendants<Text>().Single();
             t.Text = "13,450,542";
            mainPart.Document.Save();
}
0
farrukh aziz 20 Jän. 2019 im 15:40

3 Antworten

Beste Antwort

Ich denke, Sie sollten Änderungen an der temporären Datei schreiben. Siehe Speichern Sie das geänderte WordprocessingDocument in einer neuen Datei oder meinen Code aus dem Arbeitsprojekt:

    MemoryStream yourDocStream = new MemoryStream();
    ... // populate yourDocStream with .docx bytes
    using (Package package = Package.Open(yourDocStream, FileMode.Open, FileAccess.ReadWrite))
    {
        //  Load the document XML in the part into an XDocument instance.  
        PackagePart packagePart = LoadXmlPackagePart(package);
        XDocument xDocument = XDocument.Load(XmlReader.Create(packagePart.GetStream()));

        // making changes

        //  Save the XML into the package  
        using (XmlWriter xw = XmlWriter.Create(packagePart.GetStream(FileMode.Create, FileAccess.Write)))
        {
            xDocument.Save(xw);
        }

        var resultDocumentBytes = yourDocStream.ToArray();
    }
0
anechaev 20 Jän. 2019 im 13:18

Der grundlegende Ansatz, den Sie verwenden, funktioniert einwandfrei, aber ich bin überrascht, dass Sie beim Kompilieren keine Fehler erhalten, weil

IEnumerable<SdtBlock> block = mainPart.Document.Body.Descendants<SdtBlock>().Where
            (r => r.SdtProperties.GetFirstChild<Tag>().Val == "TotalClose");

Ist nicht kompatibel mit

Text t = block.Descendants<Text>().Single();

block, da IEnumberable keine Descendants Eigenschaft hat. Sie müssen entweder alle Elemente in IEnumerable durchlaufen und dies für jedes Element ausführen, oder Sie müssen ein einzelnes Element wie folgt definieren und instanziieren:

    using (WordprocessingDocument document = WordprocessingDocument.CreateFromTemplate(txtWordFile.Text))
    {
        MainDocumentPart mainPart = pkgDoc.MainDocumentPart;
        SdtBlock block = mainPart.Document.Body.Descendants<SdtBlock>().Where
            (r => r.SdtProperties.GetFirstChild<Tag>().Val == "test1").FirstOrDefault();
        Text t = block.Descendants<Text>().Single();
        t.Text = "13,450,542";
        mainPart.Document.Save();
     }
0
Cindy Meister 21 Jän. 2019 im 10:18