1
votes

I was able to create a Word Document with content controls mapped to an Xml schema and using the code from this blog: http://seroter.wordpress.com/2009/12/23/populating-word-2007-templates-through-open-xml/ I am able to insert data into the word document.

The question I have is, is it possible to replace the the code below so that I can use an Xml file instead of having to write this for each finding:

//create XML string matching schema custom XML path
            string newXml = "<root>" +
                "<FINDING>Adobe Flash Player contains multiple...</FINDING>" +
                "<STATUS>Open</STATUS>" +
                "<THREATLEVEL>High</THREATLEVEL>" +
                "<RECOMMENDATION>Update Flash Player to version...</RECOMMENDATION>" +
                "<DEVICEAFFECTED>UserPC</DEVICEAFFECTED>" +
                "<SCANNER>XXXXXX</SCANNER>" +
                "</root>";

I have tried replacing this with: string newXml = @"C:\Users\Christopher\Desktop\BookData\TestReport.xml"; and created a nested using statement with StreamReader and the existing StreamWriter but the word document would not populate and there would not be any errors.

--I just tried to replace that code with this: //create XML string matching schema custom XML path string newXml = @"C:\Users\Christopher\Desktop\BookData\TestReport.xml"; using (StreamReader sr = new StreamReader (newXml)) { newXml = sr.ReadToEnd(); }

and I no longer get the error when I open the document, but the content controls are not populating?

Thank you.

1

1 Answers

0
votes

Turns out the problem I was running into was that my code and examples were not actually deleting the previous CustomXMLParts located in the "CustomXML" folder. I the code working in two ways, the first is a Windows Form App with one button (btnGenerate) which allows you to select both the template.docx and customXML.xml files. The second is the a Console Program. Cheers Windows Form Application:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DocumentFormat.OpenXml.Packaging;
using System.IO;
using System.Threading;


namespace TestReportCreator_Beta
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    [STAThread]
    private void btnGenerate_Click(object sender, EventArgs e)
    {
        string outFile = @"C:\Users\Christopher\Desktop\BookData\TestReportBetaEND.docx";

        OpenFileDialog OFD = new OpenFileDialog();
        OFD.Multiselect = false;
        OFD.Title = "Open Word Document";
        OFD.Filter = "Word Document|*.docx;*.domx";
        OFD.ShowDialog();
        string docPath = OFD.FileName;
        OFD.Title = "Opne Xml Document";
        OFD.Filter = "Xml Document|*.xml";
        OFD.ShowDialog();
        string xmlPath = OFD.FileName;

        // convert template to document
        File.Copy(docPath, outFile);

        using (WordprocessingDocument doc = WordprocessingDocument.Open(outFile, true))
        {
            MainDocumentPart mdp = doc.MainDocumentPart;
            if (mdp.CustomXmlParts != null)
            {
                mdp.DeleteParts<CustomXmlPart>(mdp.CustomXmlParts);
            }
            CustomXmlPart cxp = mdp.AddCustomXmlPart(CustomXmlPartType.CustomXml);
            FileStream fs = new FileStream(xmlPath, FileMode.Open);
            cxp.FeedData(fs);
            mdp.Document.Save();
        } 
    }
}
}

Here is the Console Program Version

using System; using System.Collections.Generic;
using System.Linq; using System.Text;
using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing; using System.IO;

namespace BookData
{
class Program
{

    static void Main(string[] args)
    {
        string template = @"C:\Users\Christopher\Desktop\BookData\TestReportBeta.docx";
        string outFile = @"C:\Users\Christopher\Desktop\BookData\TestReportBetaEND.docx";
        string xmlPath = @"C:\Users\Christopher\Desktop\BookData\TestReport.xml";

        // convert template to document
        File.Copy(template, outFile);

        using (WordprocessingDocument doc = WordprocessingDocument.Open(outFile, true))
        {
            MainDocumentPart mdp = doc.MainDocumentPart;
            if (mdp.CustomXmlParts != null)
            {
                mdp.DeleteParts<CustomXmlPart>(mdp.CustomXmlParts);
            }
            CustomXmlPart cxp = mdp.AddCustomXmlPart(CustomXmlPartType.CustomXml);
            FileStream fs = new FileStream(xmlPath, FileMode.Open);
            cxp.FeedData(fs);
            mdp.Document.Save();
        } 
    }
}
}

I hope you fellow developers and office automation folks out there are able put this to good use!