Formatting rtf文件包含防止字段合并的奇怪格式数据

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\

我使用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嵌入所有这些不需要的东西?
谢谢。

最后我使用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文件。