Formatting rtf文件包含防止字段合并的奇怪格式数据
我使用Word 2007创建了一个RTF文件。我想插入合并字段,这些字段可以在以后的阶段解析并与数据库信息合并。文件中有“亲爱的[问候][姓氏]你好吗?”。然后我将[姓氏]部分编辑为[姓氏]。如果我现在查看rtf源,它包含大量不需要的字符,如下所示: 亲爱的[问候][}{\rtlch\fcs1\af31507\ltrch\fcs0\insrsid657321 last}{\rtlch\fcs1\af31507\ltrch\fcs0\insrsid204086 name}{\rtlch\fcs1\af31507\ltrch\fcs0\insrsid2434881]{\rtlch\fcs1\af31507\ltrch\fcs0\insrsid204086\r\n\par你好吗 这意味着当我尝试合并时,[lastname]已损坏,无法找到进行合并。 有人知道这里发生了什么吗?我如何防止Word嵌入所有这些不需要的东西?Formatting rtf文件包含防止字段合并的奇怪格式数据,formatting,document,rtf,Formatting,Document,Rtf,我使用Word 2007创建了一个RTF文件。我想插入合并字段,这些字段可以在以后的阶段解析并与数据库信息合并。文件中有“亲爱的[问候][姓氏]你好吗?”。然后我将[姓氏]部分编辑为[姓氏]。如果我现在查看rtf源,它包含大量不需要的字符,如下所示: 亲爱的[问候][}{\rtlch\fcs1\af31507\ltrch\fcs0\insrsid657321 last}{\rtlch\fcs1\af31507\ltrch\fcs0\insrsid204086 name}{\rtlch\fcs1\
谢谢。最后我使用System.Windows.Forms.RichTextBox解决了这个问题,如下所示:
public class RTF
{
/// <summary>
/// Merge the merge data with the target RTF document
/// </summary>
/// <param name="byteStream">Original RTF document</param>
/// <param name="mergeDatatable">Merge Data (as per sproc_GetDocumentMergeData)</param>
/// <returns>String representation of the RTF document</returns>
public static string GetMergedRTFDocument(byte[] byteStream,DataTable mergeDatatable)
{
System.Windows.Forms.RichTextBox rtb = new System.Windows.Forms.RichTextBox();
MemoryStream stream = new MemoryStream(byteStream);
rtb.LoadFile(stream, System.Windows.Forms.RichTextBoxStreamType.RichText); // Use for RTF
int selstart = 0;
string findTerm = "";
DataRow mergerow = mergeDatatable.Rows[0];
foreach (DataColumn col in mergeDatatable.Columns)
{
findTerm = "[" + col.ColumnName + "]";
selstart = rtb.Find(findTerm);
while (selstart > -1)
{
rtb.SelectionStart = selstart;
rtb.SelectedText = mergerow[col].ToString();
selstart = rtb.Find(findTerm);
}
}
return rtb.Rtf;
}
}
公共类RTF
{
///
///将合并数据与目标RTF文档合并
///
///原始RTF文件
///合并数据(根据存储过程\u GetDocumentMergeData)
///RTF文档的字符串表示形式
公共静态字符串GetMergeDrtDocument(字节[]ByTestStream,数据表mergeDatatable)
{
System.Windows.Forms.RichTextBox rtb=新的System.Windows.Forms.RichTextBox();
MemoryStream stream=新的MemoryStream(ByTestStream);
加载文件(stream,System.Windows.Forms.RichTextBoxStreamType.RichText);//用于RTF
int selstart=0;
字符串findTerm=“”;
DataRow mergerow=mergeDatatable.Rows[0];
foreach(mergeDatatable.Columns中的DataColumn列)
{
findTerm=“[”+列名称+“]”;
selstart=rtb.Find(findTerm);
while(selstart>-1)
{
rtb.SelectionStart=selstart;
rtb.SelectedText=mergerow[col].ToString();
selstart=rtb.Find(findTerm);
}
}
返回rtb.Rtf;
}
}
最后,我使用System.Windows.Forms.RichTextBox解决了这个问题,如下所示:
public class RTF
{
/// <summary>
/// Merge the merge data with the target RTF document
/// </summary>
/// <param name="byteStream">Original RTF document</param>
/// <param name="mergeDatatable">Merge Data (as per sproc_GetDocumentMergeData)</param>
/// <returns>String representation of the RTF document</returns>
public static string GetMergedRTFDocument(byte[] byteStream,DataTable mergeDatatable)
{
System.Windows.Forms.RichTextBox rtb = new System.Windows.Forms.RichTextBox();
MemoryStream stream = new MemoryStream(byteStream);
rtb.LoadFile(stream, System.Windows.Forms.RichTextBoxStreamType.RichText); // Use for RTF
int selstart = 0;
string findTerm = "";
DataRow mergerow = mergeDatatable.Rows[0];
foreach (DataColumn col in mergeDatatable.Columns)
{
findTerm = "[" + col.ColumnName + "]";
selstart = rtb.Find(findTerm);
while (selstart > -1)
{
rtb.SelectionStart = selstart;
rtb.SelectedText = mergerow[col].ToString();
selstart = rtb.Find(findTerm);
}
}
return rtb.Rtf;
}
}
公共类RTF
{
///
///将合并数据与目标RTF文档合并
///
///原始RTF文件
///合并数据(根据存储过程\u GetDocumentMergeData)
///RTF文档的字符串表示形式
公共静态字符串GetMergeDrtDocument(字节[]ByTestStream,数据表mergeDatatable)
{
System.Windows.Forms.RichTextBox rtb=新的System.Windows.Forms.RichTextBox();
MemoryStream stream=新的MemoryStream(ByTestStream);
加载文件(stream,System.Windows.Forms.RichTextBoxStreamType.RichText);//用于RTF
int selstart=0;
字符串findTerm=“”;
DataRow mergerow=mergeDatatable.Rows[0];
foreach(mergeDatatable.Columns中的DataColumn列)
{
findTerm=“[”+列名称+“]”;
selstart=rtb.Find(findTerm);
while(selstart>-1)
{
rtb.SelectionStart=selstart;
rtb.SelectedText=mergerow[col].ToString();
selstart=rtb.Find(findTerm);
}
}
返回rtb.Rtf;
}
}
您可以使用正则表达式来完成这个合并过程。我已经写了一篇关于如何实现这一点的博客文章
可以在Github上找到用PHP编写的示例:
您可以使用正则表达式来完成此合并过程。我已经创建了一篇关于如何完成此操作的博客文章 可以在Github上找到用PHP编写的示例:
您保存为RTF而不是纯文本有什么原因吗?@mbeckish-我继承了一个系统,其中有很多RTF文档包含字段合并字符-我需要使用RTF格式我想我不明白您的问题-为什么您要问如何让Word不将RTF命令插入RTF文档?@mbeckish-因为我想这样做使用C#string replace方法将[lastname]替换为,比如说'Smith',但是replace函数找不到[lastname],因为它被破坏成了我在原始帖子中显示的奇怪字符序列-谢谢你的帮助是的,但是“奇怪字符序列”在您的示例中,有一组RTF命令。如果它是RTF文件,那么您必须弄清楚如何在这些命令存在的情况下解析该文件。您不能期望Word在保存RTF文件时没有RTF命令。是否有原因将其保存为RTF而不是纯文本?@mbeckish-我继承了一个包含大量RTF文档的系统包含字段合并字符-我需要坚持rtf格式我想我不理解你的问题-为什么你要问如何让Word不将rtf命令插入rtf文档?@mbeckish-因为我想使用C#string replace方法将[lastname]替换为,比如说,“Smith”,但替换函数找不到[lastname]因为它被破坏成了我在原始帖子中展示的奇怪的字符序列-谢谢你的帮助是的,但是“奇怪的字符序列”在您的示例中,有一组RTF命令。如果它是RTF文件,那么您必须了解如何在这些命令存在的情况下解析该文件。您不能指望Word保存一个没有RTF命令的RTF文件。