Syncfusion DocIO 用合并字段替换文本
Syncfusion DocIO Replace Text with merge Field
我有一大堆文档,其中包含像 ~{fieldToBeReplaced} 这样的纯文本位置标记,我希望将其替换为合并字段。
我有以下代码,它插入合并字段,然后插入文本 << MERGEFIELD_NAME >>。
我想要的是显示名称的合并域,就像我在 word 中插入->合并域一样。
</p>
<pre><code>//linqPad Script
void Main()
{
Console.WriteLine("::::: Replacing BookMarks ::::: ");
//Search And Replace bookmarks
try
{
var replaceDir = new DirectoryInfo(saveFileLocation);
var bookmarkFiles = replaceDir.GetFiles().ToList();
foreach (var bkmFile in bookmarkFiles)
{
if (SearchReplaceBookmarks(bkmFile.FullName))
{
Console.WriteLine("Bookmarks Replace:" + bkmFile.Name + " ::: ");
}
}
}
catch (Exception ex)
{
Console.WriteLine("ERROR: ::: " + ex.Message);
}
}
static string startDir = Path.GetDirectoryName(Util.CurrentQueryPath);
string saveFileLocation = startDir + @"\Converted\";
private List<fieldReplace> fieldList = new List<fieldReplace>() {
//new fieldReplace("",""),
new fieldReplace("~{U-nm}","_Doctor"),
new fieldReplace("~{P-nl}","_Patient_Surname","Patient_Firstname"),
new fieldReplace("~{DOBN}","_Patient_DOB"),
new fieldReplace("~{U-ph","_Doctor_PhoneWork"),//Surgeon Business
new fieldReplace("~{U-pm}","_Doctor_PhoneMobile")//Surgeon After Hours
}
// Define other methods and classes here
private bool SearchReplaceBookmarks(string filename)
{
try
{
WordDocument wordDocument = new WordDocument(filename);
//Adds one section and one paragraph to the document
foreach (var fld in fieldList)
{
var replaceBookmark = wordDocument.Find(fld.TextToReplace, false, true);
//if the bookmark is in the list then
while (replaceBookmark != null)
{
//Find and replace text with merge field.
var paragraph = new WParagraph(wordDocument);
for (int i =0 ; i<= fld.FieldNames.Length-1;i++){
var field = paragraph.AppendField(fld.FieldNames[i], FieldType.FieldMergeField);
field.FieldType = FieldType.FieldMergeField;
if (i < fld.FieldNames.Length - 1) { paragraph.AppendText(", ");}
}
var selection = new TextSelection(paragraph, 0, paragraph.Text.Length);
wordDocument.Replace(fld.TextToReplace, selection, true, true); //This is where the Merge Field is meant to be inserted
replaceBookmark = wordDocument.FindNext(paragraph, fld.TextToReplace, false, true);
}
}
//Debug.Write( wordDocument.MailMerge.MappedFields);
wordDocument.Save(filename, FormatType.Docx);
wordDocument.Close();
return true;
}
catch (Exception ex)
{
Console.WriteLine("ERROR:" + filename + " ::: " + ex.Message);
return false;
}
}
private class fieldReplace
{
public fieldReplace(string oldText, params string[] newNewFieldName)
{
this.TextToReplace = oldText;
this.FieldNames = newNewFieldName;
}
public string TextToReplace { get; set; }
public string[] FieldNames { get; set; }
}
在分析您提到的场景时,
1)从Word文档中查找占位符文本。
2) 将占位符文本替换为合并字段和 MS Word 文档中要替换的字段。
是的,使用 DocIO 可以将占位符文本替换为与 MS Word 等效的合并字段。我们已修改您的代码以满足您的要求。我们使用了 Replace() 方法的 TextBodyPart 重载。请找到以下代码片段。
修改后的代码片段
TextBodyPart bodyPart = new TextBodyPart(wordDocument);
bodyPart.BodyItems.Add(段落); wordDocument.Replace(fld.TextToReplace, bodyPart, true, true);
如有其他问题,请通过 support@syncfusion.com 联系我们的支持团队,以获得及时的帮助。
我有一大堆文档,其中包含像 ~{fieldToBeReplaced} 这样的纯文本位置标记,我希望将其替换为合并字段。
我有以下代码,它插入合并字段,然后插入文本 << MERGEFIELD_NAME >>。
我想要的是显示名称的合并域,就像我在 word 中插入->合并域一样。
</p>
<pre><code>//linqPad Script
void Main()
{
Console.WriteLine("::::: Replacing BookMarks ::::: ");
//Search And Replace bookmarks
try
{
var replaceDir = new DirectoryInfo(saveFileLocation);
var bookmarkFiles = replaceDir.GetFiles().ToList();
foreach (var bkmFile in bookmarkFiles)
{
if (SearchReplaceBookmarks(bkmFile.FullName))
{
Console.WriteLine("Bookmarks Replace:" + bkmFile.Name + " ::: ");
}
}
}
catch (Exception ex)
{
Console.WriteLine("ERROR: ::: " + ex.Message);
}
}
static string startDir = Path.GetDirectoryName(Util.CurrentQueryPath);
string saveFileLocation = startDir + @"\Converted\";
private List<fieldReplace> fieldList = new List<fieldReplace>() {
//new fieldReplace("",""),
new fieldReplace("~{U-nm}","_Doctor"),
new fieldReplace("~{P-nl}","_Patient_Surname","Patient_Firstname"),
new fieldReplace("~{DOBN}","_Patient_DOB"),
new fieldReplace("~{U-ph","_Doctor_PhoneWork"),//Surgeon Business
new fieldReplace("~{U-pm}","_Doctor_PhoneMobile")//Surgeon After Hours
}
// Define other methods and classes here
private bool SearchReplaceBookmarks(string filename)
{
try
{
WordDocument wordDocument = new WordDocument(filename);
//Adds one section and one paragraph to the document
foreach (var fld in fieldList)
{
var replaceBookmark = wordDocument.Find(fld.TextToReplace, false, true);
//if the bookmark is in the list then
while (replaceBookmark != null)
{
//Find and replace text with merge field.
var paragraph = new WParagraph(wordDocument);
for (int i =0 ; i<= fld.FieldNames.Length-1;i++){
var field = paragraph.AppendField(fld.FieldNames[i], FieldType.FieldMergeField);
field.FieldType = FieldType.FieldMergeField;
if (i < fld.FieldNames.Length - 1) { paragraph.AppendText(", ");}
}
var selection = new TextSelection(paragraph, 0, paragraph.Text.Length);
wordDocument.Replace(fld.TextToReplace, selection, true, true); //This is where the Merge Field is meant to be inserted
replaceBookmark = wordDocument.FindNext(paragraph, fld.TextToReplace, false, true);
}
}
//Debug.Write( wordDocument.MailMerge.MappedFields);
wordDocument.Save(filename, FormatType.Docx);
wordDocument.Close();
return true;
}
catch (Exception ex)
{
Console.WriteLine("ERROR:" + filename + " ::: " + ex.Message);
return false;
}
}
private class fieldReplace
{
public fieldReplace(string oldText, params string[] newNewFieldName)
{
this.TextToReplace = oldText;
this.FieldNames = newNewFieldName;
}
public string TextToReplace { get; set; }
public string[] FieldNames { get; set; }
}
在分析您提到的场景时, 1)从Word文档中查找占位符文本。 2) 将占位符文本替换为合并字段和 MS Word 文档中要替换的字段。
是的,使用 DocIO 可以将占位符文本替换为与 MS Word 等效的合并字段。我们已修改您的代码以满足您的要求。我们使用了 Replace() 方法的 TextBodyPart 重载。请找到以下代码片段。
修改后的代码片段 TextBodyPart bodyPart = new TextBodyPart(wordDocument); bodyPart.BodyItems.Add(段落); wordDocument.Replace(fld.TextToReplace, bodyPart, true, true);
如有其他问题,请通过 support@syncfusion.com 联系我们的支持团队,以获得及时的帮助。