将数据从C#winForms treeView导出到MS-Word MergeFields

时间:2014-04-16 21:44:54

标签: c# .net winforms ms-word mergefield

我有一个用c#编写的winForm应用程序,我有一个treeview包含目录中的文件。 它还包含有关每个文件的数据(完整路径,创建时间,大小),如下所示:

This is my treeview

我正在尝试将此数据导出到MS-Word模板,如下所示: enter image description here

我的问题是复制每个文件的mergeFields并插入每个文件属性(文件数量更改),如下所示:

enter image description here

这是我的代码:

private void btnExportWord_Click_1(object sender, EventArgs e)
    {
        object oMissing = Missing.Value;
        Word.Application oWord = new Word.Application();
        Word.Document oWordDoc = new Word.Document();
        oWord.Visible = false;
        oWordDoc = oWord.Documents.Add(ref oMissing, ref oMissing, ref oMissing, ref oMissing);           
        Object oTemplatePath = @"C:\test\MyXMLTemplate.dotx";         
        oWordDoc = oWord.Documents.Add(ref oTemplatePath, ref oMissing, ref oMissing, ref oMissing);

        for (int i = 0; i < treeViewXMLFiles.Nodes[0].Nodes.Count; i++)
        {
            string strFilename = treeViewXMLFiles.Nodes[0].Nodes[i].Text;
            string strFull_path = treeViewXMLFiles.Nodes[0].Nodes[i].Nodes[0].Text;
            string strCreationTime = treeViewXMLFiles.Nodes[0].Nodes[i].Nodes[1].Text;
            string strSize = treeViewXMLFiles.Nodes[0].Nodes[i].Nodes[2].Text;

            foreach (Word.Field myMergeField in oWordDoc.Fields)
            {
                Word.Range rngFieldCode = myMergeField.Code;
                String fieldText = rngFieldCode.Text;
                if (fieldText.StartsWith(" MERGEFIELD"))
                {
                    Int32 endMerge = fieldText.IndexOf("\\");
                    Int32 fieldNameLength = fieldText.Length - endMerge;
                    String fieldName = fieldText.Substring(11, endMerge - 11);
                    fieldName = fieldName.Trim();

                    if (fieldName == "File_Name")
                    {
                        myMergeField.Select();
                        oWord.Selection.TypeText(strFilename);
                    }
                    if (fieldName == "Full_Path")
                    {
                        myMergeField.Select();
                        oWord.Selection.TypeText(strFull_path);
                    }
                    if (fieldName == "CreationTime")
                    {
                        myMergeField.Select();
                        oWord.Selection.TypeText(strCreationTime);
                    }
                    if (fieldName == "Size")
                    {
                        myMergeField.Select();
                        oWord.Selection.TypeText(strSize);
                    }
                }
            }                
        }           
        Object oSaveAsFile = (Object)@"C:\test\FINISHED_XML_Template.doc";            
        oWordDoc.SaveAs(ref oSaveAsFile, ref oMissing, ref oMissing, ref oMissing,
ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
ref oMissing, ref oMissing);

        oWordDoc.Close(false, ref oMissing, ref oMissing);
        oWord.Quit(ref oMissing, ref oMissing, ref oMissing);
    }

我很长时间没有成功地寻找答案 我希望这里有人可以帮助我。

1 个答案:

答案 0 :(得分:1)

如果在单个文档中复制合并字段,您应该执行以下操作:

  1. 创建单个目标文档。

  2. 使用合并字段加载模板作为另一个文档。

  3. for (int i = 0; i < treeViewXMLFiles.Nodes[0].Nodes.Count; i++)循环中,执行以下操作:

    3.1选择模板的内容并将其附加到目标文档。

    3.2使用当前树视图节点中的数据替换(!)目标文档(!)中的合并字段。请注意,您需要替换目标文档中的字段,这样字段就会消失,而且只是简单的&#39;文字依旧。如果你不这样做,for循环会在后续迭代过程中再次偶然发现同一个字段并弄乱以前复制的内容。 (您的代码似乎已经正确地进行了字段替换。)


  4. 任何只应在具有合并字段的序列之前或之后出现一次的文本(例如&#34; Hello all&#34;介绍性短语,例如)需要在for循环执行之前/之后附加到目标文档

    将这些文本片段保存在单独的模板文件中可以使代码相对容易,但是您必须处理最多三个模板文件而不是一个模板文件。 但是,在您具有编程C#和Word的丰富经验之后,您可能会想到一种方法,只允许您维护一个模板。 (有不同的方法可以做到这一点;例如,您可以在模板中使用特定的格式样式来标记要为每个树视图节点复制的内容以及在目标文档中只出现一次的内容。)