zoukankan      html  css  js  c++  java
  • 生成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;
            }
    
  • 相关阅读:
    Hibernate关联的集合对象排序
    Hibernate级联查询的分页问题
    Hibernate双向一对多级联保存优化
    Struts流程分析+源码分析
    jsp自定义函数库
    Java异常处理和设计
    struts2总体介绍
    struts和struts2的区别
    搭建struct环境
    struts-config.xml的配置
  • 原文地址:https://www.cnblogs.com/ajeyone/p/1920788.html
Copyright © 2011-2022 走看看