杭州华育LOGO

学员作品 学员心得技术园地 潮人地 Android(安卓)培训 杭州电脑(计算机)培训 杭州网络营销培训 杭州JAVA培训
返回首页
当前位置: 主页 > 学员天地 > 技术园地 >

杭州java培训之读取rtf模板内容替换变化部分形成新rtf文档

时间:2013-10-14 16:42来源:csdn 作者:jxvc_extmail_2006 点击:
杭州java培训之java读取rtf模板内容替换变化部分形成新rtf文档 java读取word文档时,虽然网上介绍了很多插件poi、java2Word、jacob、itext等等,poi无法读取格式(新的API估计行好像还在处于研发阶段,不太稳定,做项目不太敢用);java2Word、jacob容易报错

杭州java培训之java读取rtf模板内容替换变化部分形成新rtf文档

 java读取word文档时,虽然网上介绍了很多插件poi、java2Word、jacob、itext等等,poi无法读取格式(新的API估计行好像还在处于研发阶段,不太稳定,做项目不太敢用);java2Word、jacob容易报错找不到注册,比较诡异,我曾经在不同的机器上试过,操作方法完全一致,有的机器不报错,有的报错,去他们论坛找高人解决也说不出原因,项目部署用它有点玄;itxt好像写很方便但是我查了好久资料没有见到过关于读的好办法。经过一番选择还是折中点采用rtf较好,毕竟rtf是开源格式,不需要借助任何插件,只需基本IO操作外加编码转换即可。rtf格式文件表面看来和doc没啥区别,都可以用word打开,各种格式都可以设定。

 

功能:读取rtf模板内容,替换变化部分,形成新的rtf文档。

 

思路:

       1、采用字节的形式读取rtf模板内容

       2、将可变的内容字符串转为rtf编码

       3、替换原文中的可变部分,形成新的rtf文档。

替换的关键字,在word上手动打进去,有的可能不能替换成功,因为在rtf文件中,有时候会在在标识符$$中间加了一一段编码,需要从myeclipse上复制过去

注:先复制过去,再设置字体

发现中文替换的时候 出现乱码。

后来发现 rtf对中文的处理 不同的工具保存的rtf 文本处理方式不同。

================================================================================

int inext=0;//用来判断中文 编码出现 第一次出现为0 第二次出现为1
public String strToRtf(String content){     
   char[] digital = "0123456789ABCDEF".toCharArray();
        StringBuffer sb = new StringBuffer("");
        byte[] bs = content.getBytes(); 
        int bit;       
        for (int i = 0; i < bs.length; i++) {
            bit = (bs[i] & 0x0f0) >> 4;   
        /*中文支持
         *思路:通过getBytes获取的中文的assii小于0,根据rtf中文的的编码
         * 所以只需要在中文的2个编码 第一个编码前加    第二个编码后加
         * 加了一个变量inext 用来判断中文的assii 前一个和后一个。
         * 这样在rtf中文的乱码就可以解决了。
         */ 
            if(bs[i]>0){
              sb.append("\\'"); 
            }else{               
               if(inext==0){
                //通过写字板创建的rtf模板
                   //sb.append("\\lang2052\\f1"); 
                //通过WPS2009创建的rtf模板
                // sb.append("\\lang1033 \\langnp1033 \\langfe2052 \\langfenp2052 \\cf1");
                //通过MS word创建的rtf模板
                sb.append("\\loch\\af2\\hich\\af2\\dbch\\f31505");
                sb.append("\\'"); 
                   inext=1;
              }else{
               sb.append("\\'");                   
              }
            }        
            sb.append(digital[bit]);
            bit = bs[i] & 0x0f;
            sb.append(digital[bit]);
            if(bs[i]<0&&inext==1){
            // 通过写字板创建的rtf模板
            //sb.append("\\lang1033\\f0");
            // 通过WPS2009创建的rtf模板
            //sb.append(" \\lang1033\\langnp1033 \\langfe2052\\langfenp2052 \\cf1");
            // 通过MS word创建的rtf模板
             sb.append("\\hich\\af2\\dbch\\af31505\\loch\\f2");
            inext=0;
            } 
        }       
        return sb.toString();       
}

================================================================================
================================================================================

附 文件源码 供大家参考

================================================================================

package test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;

 


public class OperatorRTF {
/**
* 字符串转换为rtf编码
* 中文支持
* @param content
* @return
*/
int inext=0;//用来判断中文 编码出现 第一次出现为0 第二次出现为1
public String strToRtf(String content){     
   char[] digital = "0123456789ABCDEF".toCharArray();
        StringBuffer sb = new StringBuffer("");
        byte[] bs = content.getBytes(); 
        int bit;       
        for (int i = 0; i < bs.length; i++) {
            bit = (bs[i] & 0x0f0) >> 4;   
        /*中文支持
         *思路:通过getBytes获取的中文的assii小于0,根据rtf中文的的编码
         * 所以只需要在中文的2个编码 第一个编码前加    第二个编码后加
         * 加了一个变量inext 用来判断中文的assii 前一个和后一个。
         * 这样在rtf中文的乱码就可以解决了。
         */ 
            if(bs[i]>0){
              sb.append("\\'"); 
            }else{               
               if(inext==0){
                //通过写字板创建的rtf模板
                   //sb.append("\\lang2052\\f1"); 
                //通过WPS2009创建的rtf模板
                // sb.append("\\lang1033 \\langnp1033 \\langfe2052 \\langfenp2052 \\cf1");
                //通过MS word创建的rtf模板
                sb.append("\\loch\\af2\\hich\\af2\\dbch\\f31505");
                sb.append("\\'"); 
                   inext=1;
              }else{
               sb.append("\\'");                   
              }
            }        
            sb.append(digital[bit]);
            bit = bs[i] & 0x0f;
            sb.append(digital[bit]);
            if(bs[i]<0&&inext==1){
            // 通过写字板创建的rtf模板
            //sb.append("\\lang1033\\f0");
            // 通过WPS2009创建的rtf模板
            //sb.append(" \\lang1033\\langnp1033 \\langfe2052\\langfenp2052 \\cf1");
            // 通过MS word创建的rtf模板
             sb.append("\\hich\\af2\\dbch\\af31505\\loch\\f2");
            inext=0;
            } 
        }

        
        return sb.toString();       
}

 

/**
* 替换文档的可变部分
* @param content 原来的文本
* @param markersign 标记符号
* @param replacecontent 替换的内容 
* 用replacecontent替换markersign
* @return
*/
public String replaceRTF(String content,String markersign,String replacecontent){
   String rc = strToRtf(replacecontent);  
   String target = "";
   markersign="$"+markersign+"$";
   target = content.replace(markersign,rc);     
   return target;
}

 

/*替换模板

 * @param inputPath
* @param outPath
* @param data
* @return
     */
public void rgModel(String inputPath, String outPath, HashMap data) {
   // TODO Auto-generated method stub
   /* 字节形式读取模板文件内容,将结果转为字符串 */
   String sourname = inputPath+"\\"+"模板.rtf";
   String sourcecontent = "";
   InputStream ins = null;
   try{
    ins = new FileInputStream(sourname);
    //byte[] b = new byte[1024];//对应在while中使用bytesRead = ins.read(b, 0, 1024); 
    //byte[] b = new byte[16384]; //对应在while中使用bytesRead = ins.read(b);
    byte[] b = new byte[1638400];//提高对于RTF文件的读取速度,特别是对于1M以上的文件        

 if (ins == null) {
              System.out.println("源模板文件不存在");
         }
         int bytesRead = 0;
         while (true) {
             //bytesRead = ins.read(b, 0, 1024); // return final read bytes counts
            bytesRead = ins.read(b,0,1638400);
             if(bytesRead == -1) {// end of InputStream
            System.out.println("读取模板文件结束");
            break;
             }
             sourcecontent += new String(b, 0, bytesRead); // convert to string using bytes
          }
   }catch(Exception e){
    e.printStackTrace();
   }
   /* 修改变化部分 */
   String targetcontent = "";
   String oldText="";
   Object newValue;
   /* 结果输出保存到文件 */
   try { 
    Iterator keys = data.keySet().iterator();
    int keysfirst=0;
            while (keys.hasNext())
            {
                oldText = (String) keys.next();
                newValue = data.get(oldText);
                String newText = (String) newValue; 
                inext=0;//add by wde 改为初始状态
     if(keysfirst==0){    
      targetcontent = replaceRTF(sourcecontent,oldText,newText);
      keysfirst=1;
     }else{
      targetcontent = replaceRTF(targetcontent,oldText,newText); 
      keysfirst=1;
     }  
            }       
       
         
    FileWriter fw = new FileWriter(outPath,true);
            PrintWriter out = new PrintWriter(fw);
            if(targetcontent.equals("")||targetcontent==""){
            out.println(sourcecontent);
            }else{
            out.println(targetcontent);
            }
            out.close();
            fw.close();
            System.out.println(outPath+" 生成文件成功");
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
}

public static void main(String[] args) {
   // TODO Auto-generated method stub
   SimpleDateFormat sdf=new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
   Date current=new Date();
        String targetname = sdf.format(current).substring(0,4) + "年";
        targetname += sdf.format(current).substring(5,7) + "月";
        targetname += sdf.format(current).substring(8,10) + "日";
        targetname += sdf.format(current).substring(11,13) + "时";                
        targetname += sdf.format(current).substring(14,16) + "分";
        targetname += sdf.format(current).substring(17,19) + "秒";
        targetname+=".rtf";
   OperatorRTF oRTF = new OperatorRTF();

       //*****************************************
   //利用HashMap读取数据库中的数据
        HashMap map = new HashMap();
        map.put("timetop","张三");
        map.put("info","0155");
        map.put("idea","公元前2000年");
        map.put("advice","13");
        map.put("infosend","168");     
        //******************************************
        oRTF.rgModel("C:\\YQ","c:\\YQ\\"+targetname, map);
  
  
}
}

(责任编辑:杭州华育 ;杭州java培训,网络营销培训,杭州计算机培训,it培训,详询客服报名咨询
分享到:
顶一下
(1)
100%
踩一下
(0)
0%
------分隔线----------------------------
提交报名信息

2018年杭州将加大力度经济转型,吸纳更多的技术人才落户杭州,软件人才需求量更是大幅提升,针对目前杭州IT行业人才需求“井喷”现象,华育软件杭州实训基地与杭州155家IT名企合作,建立人才培养与输送关系,启动“Eduask国家高端IT紧缺人才培养工程”。6月针对杭州地区18-28岁大中专生待业青年发放68个技能实训名额(应届大中专毕业生优先),经短期专业岗前实训后推荐进入企业,起薪4500-8000元,五险一金。

姓名: * 性别:
学历: 电话: *
所在地: *
您目前状况:
留言:
*