将数据从C#winForms树视图导出到MS Word合并字段

将数据从C#winForms树视图导出到MS Word合并字段,c#,.net,winforms,ms-word,mergefield,C#,.net,Winforms,Ms Word,Mergefield,我有一个用c#编写的winForm应用程序,还有一个包含目录文件的树视图。 它还包含关于每个文件的数据(完整路径、创建时间、大小),如下所示: 我正在尝试将此数据导出到MS Word模板,如下所示: 我的问题是复制每个文件的合并字段,并在适当位置插入每个文件属性(文件数量更改),如下所示: 这是我的代码: private void btnExportWord_Click_1(object sender, EventArgs e) { object oMissing

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

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

我的问题是复制每个文件的合并字段,并在适当位置插入每个文件属性(文件数量更改),如下所示:

这是我的代码:

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);
    }
private void btnExportWord\u单击\u 1(对象发送方,事件参数e)
{
对象删除=缺少.Value;
Word.Application oWord=新单词.Application();
Word.Document oWordDoc=新的Word.Document();
oWord.Visible=false;
oWordDoc=oWord.Documents.Add(引用删除、引用删除、引用删除、引用删除);
对象oTemplatePath=@“C:\test\MyXMLTemplate.dotx”;
oWordDoc=oWord.Documents.Add(ref-oTemplatePath,ref-omising,ref-omising,ref-omising);
对于(int i=0;i
我一直在寻找答案,但没有成功。

我希望这里的任何人都能帮助我。

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

  • 创建单个目标文档

  • 将带有合并字段的模板作为另一个文档加载

  • 在(int i=0;i循环中,执行以下操作:

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

    3.2将目标文档中的合并字段(!)替换为当前树视图节点中的数据。请注意,您需要替换目标文档中的字段,以便这些字段消失,只保留“纯”文本。如果不这样做,for循环将在后续迭代中再次在相同的字段上绊倒,并将以前复制的内容弄乱。(您的代码似乎已经正确地进行了字段替换。)


  • 任何只应在带有合并字段的序列之前或之后出现一次的文本(例如,“Hello all”介绍性短语)都需要在for循环执行之前/之后附加到目标文档中

    将这些文本片段保存在单独的模板文件中可以使代码相对容易,但您将不得不处理多达三个模板文件,而不仅仅是一个模板文件。
    然而,在您获得了大量的C#和Word编程经验之后,您可能会考虑一种只允许维护单个模板的方法。(有不同的方法可以做到这一点;例如,您可以在模板中使用特定的格式样式来标记每个treeview节点要复制的内容,以及应该在目标文档中只出现一次的内容。)

    您似乎以错误的顺序嵌套了foreach循环。首先,迭代每个treeview节点,并为每个这样的节点添加一个新的(合并的)文档。然后,用节点中的数据填充新添加文档的合并字段。(当前,您只创建一个合并文档,并反复设置同一个合并文档的合并字段…)但是,您似乎只希望将这些内容都放在一个文档的一页上,对吗?是的,我希望在运行期间为每个文件复制合并字段。我将尝试切换循环并将for循环放在第一位,但我仍然对合并字段有问题这是我的正确代码,但它只填充第一个文件的详细信息,不复制每个文件的合并字段我更改了上面的代码,现在工作正常,但它只填充了fi的详细信息