使用Template.docx生成.docx文件

时间:2014-01-13 22:42:01

标签: c# ms-word

我正在考虑.docx文档生成器。它基本上用作(它是一个C#控制台应用程序):

DocxGenerator.exe ATemplate.docx varsDefinations.txt

ATemplate.docx将为基本模板提供一些要填充的字段。 varsDefinations.txt将提供这些变量来填充字段。

但是,我根本不知道如何实现这一点。我一直在搜索Open XML和其他文档。 现在的障碍是我应该在这种情况下使用的领域。

例如,ATemplate.docx可能是这样的:

亲爱的{Field1},

我们很高兴告诉你{Field2}。

此致 {字段3}

在varsDefinations.txt中,我想这样做:

Field1 =“可爱的人回答我的问题”; Field2 =“你是有史以来最好的”; Field3 =“Payson”;

有人做过这样的事吗? (我确信这是肯定的!因为我收到了很多“对不起”的信件。)

总之,我的问题是:

  1. 我应该使用哪个字段,以便将其视为变量

  2. 如何使用C#读取文件以便我可以“检测”所有变量字段

  3. 提前非常感谢你。

    -------------------编辑1 -------------------------- -

    1. 我认为我可以使用“mergefield”(回答问题1)。

    2. 对于问题2,这将有效: http://www.codeproject.com/Articles/38575/Fill-Mergefields-in-docx-Documents-without-Microso

    3. 这将有所帮助。这正是我想要的。

2 个答案:

答案 0 :(得分:1)

您好我建议您在文本文件中的每个信息之间保留一个分隔符。

我猜您的文本文件(varsDefinations.txt)是这样的。请注意,我将“ - ”保留为行之间的分隔符。

varsDefinations.txt如下所示:

 Lovely people who answer my question -
 that you are the best ever -
 Payson

然后,这里是生成word文档作为指定目标的代码。在这里,我正在使用.doc文件。您可以将其替换为.docx。

以下是符合您要求的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.IO;
using System.Data.OleDb;

namespace WordFileGeneratorFromTextFileConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                string textfileName = "varsDefinations.txt";
                string wordfileName = "ATemplate.doc";
                string fileNameWithPath = @"C:\Quotations\" + wordfileName;

                CustomMessage aMesssage = new CustomMessage();

                //Reading from text file
                using (FileStream fs =
                    new FileStream(@"C:\Quotations\" + textfileName,FileMode.OpenOrCreate, FileAccess.Read))
                {
                    StreamReader sr = new StreamReader(fs);

                    string temp = sr.ReadToEnd();
                    string[] temparr = temp.Split('-');
                    for (int i = 0; i < temparr.Length;i++ )
                    {
                        string s = temparr[i];
                        if (s.Contains('\r'))
                        {
                            s = s.Replace('\r', ' ');
                        }
                        if (s.Contains('\n'))
                        {
                            s = s.Replace('\n', ' ');
                        }
                        temparr[i] = s;
                    }
                    if (temparr != null)
                    {
                        aMesssage.HeaderMessage = temparr[0];
                        aMesssage.MainMessage = temparr[1];
                        aMesssage.MessageSender = temparr[2];
                    }
                    sr.Close();
                }

                //Writing to word document
                using (FileStream fs = new FileStream(fileNameWithPath, FileMode.OpenOrCreate, FileAccess.Write))
                {
                    StreamWriter sw = new StreamWriter(fs);
                    sw.WriteLine(aMesssage.HeaderMessage);
                    sw.WriteLine(aMesssage.MainMessage);
                    sw.WriteLine(aMesssage.MessageSender);

                    sw.Close();
                }

                //Opening Word Document
                System.Diagnostics.Process.Start(fileNameWithPath);

            }
            catch (IOException ex)
            {
                Console.WriteLine(ex.Message.ToString());
            }
            catch (Exception ex2)
            {
                Console.WriteLine(ex2.Message.ToString());
            }
        }
    }

    class CustomMessage
    {
        public string HeaderMessage { get; set; }
        public string MainMessage { get; set; }
        public string MessageSender { get; set; }
    }
}

答案 1 :(得分:1)

有几件事需要考虑。

首先检查您是否希望非IT人员从Microsoft Word中创建模板。

其次你需要多次出现(一个循环)吗?

如果要由IT人员创建模板,您可以使用以下方法:

  • 使用Word创建模板。
  • 在zip中打开XML。
  • Word在各处引入了许多小的XML片段,并且也可以在变量名称中出现。
  • 对其进行编辑,使您选择的变量名称不再包含XML标记。
  • 确保所选的变量名称不包含在其他位置,例如b64编码的图片中。包含非base64字符修复了。
  • 在您的控制台程序中打开生成的模板docx,只需替换所有匹配项。

如果模板由非IT人员创建,则方法会变得更加复杂:

  • 使用Word创建模板。
  • 您的控制台程序应该第一次解析XML,构建树和文本的序列化版本(第1阶段解析器)。
  • 单独处理照片,因为它们会变得非常大并且耗费内存。
  • 您可以将XML树和序列化版本提供给第二阶段解析器,这是一个能够处理所选变量名称的普通文本解析器。您可以使用lex / yacc或ANTLR使用简单的LALR解析器。
  • 在解析器中,用其代表值替换变量名称。

当您添加循环时,您需要确保手动编写XML以避免复制的XML片段不平衡,或者创建一个平衡XML的算法,以确保重复元素一起形成有效的XML。

关于你的问题:我们制作了类似的软件,你可能会发现我们使用过的命名,比如$ F {x}。手册位于http://www.invantive.com/en/doc/invantive-composition/Invantive.Producer.Composition.Word.en.pdf,语法在1.6节中,以及后续步骤。