我正在考虑.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”;
有人做过这样的事吗? (我确信这是肯定的!因为我收到了很多“对不起”的信件。)
总之,我的问题是:
我应该使用哪个字段,以便将其视为变量
如何使用C#读取文件以便我可以“检测”所有变量字段
提前非常感谢你。
-------------------编辑1 -------------------------- -
我认为我可以使用“mergefield”(回答问题1)。
对于问题2,这将有效: http://www.codeproject.com/Articles/38575/Fill-Mergefields-in-docx-Documents-without-Microso
答案 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人员创建模板,您可以使用以下方法:
如果模板由非IT人员创建,则方法会变得更加复杂:
当您添加循环时,您需要确保手动编写XML以避免复制的XML片段不平衡,或者创建一个平衡XML的算法,以确保重复元素一起形成有效的XML。
关于你的问题:我们制作了类似的软件,你可能会发现我们使用过的命名,比如$ F {x}。手册位于http://www.invantive.com/en/doc/invantive-composition/Invantive.Producer.Composition.Word.en.pdf,语法在1.6节中,以及后续步骤。