追海逐风

导航

生成WORD的替代方案:生成RTF

周知WORD的二进制格式是相当复杂的,如果不用Office提供的COM对象生成是非常困难的。而WORD完全可以识别RTF格式,对于一般的文档是完全可以替代WORD的。且RTF是基于文本的,这就简化了对文档的处理,只需处理字符串即可。理论上不用任何组件即可生成RTF文件,但实际上RTF的格式也很复杂,如果不是要生成任意的文档,那么可以用模板的方法。

1. 先在WORD中编辑好模板,在要替换字符串的地方用个占位标识符,占位标识符的选择很重要,不能与RTF中的格式代码相同。

2. 再将该文档另存为RTF格式,这个文件就可以当做模板了。在程序中可以读取这个文件,替换标识符为你想要的文本,就可以生成定制化的文档了。

有两个需要注意的地方:

1. 占位标识符不能与RTF中的格式代码相同,经过小心选择是完全可以避免的,比如给所有标识符加双下划线前缀“__”等等。

2. 对中文的处理,RTF中是不能直接存储中文的(到底能不能不太清楚),需要转化为ASCII双字节的表示方法,如“王”转化为RTF格式双字节是“\'cd\'f5”。

 

附一段简单的代码,写的比较乱,但大体意思有了

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                StreamReader sr = File.OpenText("E:\\template.rtf");
                String all = sr.ReadToEnd();
                sr.Close();

                String generated = all.Replace("__name", ToRtfAscii(txtName.Text)).Replace("__gender", ToRtfAscii(txtGender.Text))
                    .Replace("__birthday", ToRtfAscii(txtBirthday.Text)).Replace("__email", ToRtfAscii(txtEmail.Text))
                    .Replace("__mobile", ToRtfAscii(txtMobile.Text)).Replace("__zzmm", ToRtfAscii(txtZZMM.Text));
                StreamWriter sw = File.CreateText("E:\\generated.rtf");
                
                sw.Write(generated);
                sw.Close();

                MessageBox.Show("生成成功");
            }
            catch(Exception ex)
            {
                MessageBox.Show("生成失败" + ex.ToString());
            }
        }

        private static String ToRtfAscii(String s)
        {
            byte[] asciiBytes = Encoding.GetEncoding("GB2312").GetBytes(s);
            
            StringBuilder sb = new StringBuilder();
            foreach (byte b in asciiBytes)
            {
                sb.Append(String.Format("\\'{0:x}", b));
            }

            String str = sb.ToString();
            return str;
        }

posted on 2010-12-29 16:08  追海逐风  阅读(1126)  评论(0编辑  收藏  举报