生成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; }