skybear1989 2012-07-04 17:41
浏览 444
已采纳

求java 完美解析 docx文档例子

求java 完美解析 docx文档例子

  • 写回答

3条回答 默认 最新

  • works001 2012-07-04 17:51
    关注

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

    ----- 实现的功能:读取rtf模板内容(格式和文本内容),替换变化部分,形成新的rtf文档。

    ----- 实现思路:模板中固定部分手动输入,变化的部分用$info$表示,只需替换$info$即可。

       1、采用字节的形式读取rtf模板内容
    
       2、将可变的内容字符串转为rtf编码
    
       3、替换原文中的可变部分,形成新的rtf文档
    

    主要程序如下:

    /**

    • 将制定的字符串转换为rtf编码

      */

    public String bin2hex(String bin) {
    char[] digital = "0123456789ABCDEF".toCharArray();
    StringBuffer sb = new StringBuffer("");
    byte[] bs = bin.getBytes();
    int bit;
    for (int i = 0; i < bs.length;i++) {
    bit = (bs[i] & 0x0f0) >> 4;

            sb.append("\\'");
            sb.append(digital[bit]);
            bit = bs[i] & 0x0f;
            sb.append(digital[bit]);
        }
        return sb.toString();
    }
    

    /**

    • 字节形式读取rtf模板内容

      */

    public String readByteRtf(InputStream ins, String path){

    String sourcecontent = "";
    try{
    ins = new FileInputStream(path);
    byte[] b = new byte[1024];
    if (ins == null) {
    System.out.println("源模板文件不存在");
    }
    int bytesRead = 0;
    while (true) {
    bytesRead = ins.read(b, 0, 1024); // return final read bytes counts
    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();
    }

    }

      以上为核心代码,剩余部分就是替换,从新组装java中的String.replace(oldstr,newstr);方法可以实现,在这就不贴了。源代码部分详见附件。运行源代码前提:
    

    c盘创建YQ目录,将附件中"模板.rtf"复制到YQ目录之下,运行OpreatorRTF.java文件即可,就会在YQ目录下生成文件名如:21时15分19秒_cheney_记录.rtf 的文件。。。。。文件名是在程序中指定的呵呵。由于是由商业软件中拆分出的demo所以只是将自己原来的写的程序分离,合并在一个java文件中,所以有的方法在示例程序中看似多余,没有必要那么麻烦。

     对于替换部分需要循环的特例程序,我不好拆分,里面很容易暴露商业软件的东西,所以就不贴了,有需要的话可以加我QQ或者MSN,一起讨论呵呵。附件传了半天也没有传上去,没有办法只有这样搞了呵呵。模板文件附件无法存放,需要的直接联系呵呵。其实直接看以下的java程序部分,就会明白
    

    /**

    • 以下部分是java源代码

      */

    package com;

    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;

    public class OperatorRTF {

    /**
    
    * 字符串转换为rtf编码
    
    * @param content
    
    * @return
    
    */
    
    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;
    
            sb.append("\\'");
    
            sb.append(digital[bit]);
    
            bit = bs[i] & 0x0f;
    
            sb.append(digital[bit]);
    
        }
    
        return sb.toString();
    
    }
    
    
    
    /**
    
    * 替换文档的可变部分
    
    * @param content
    
    * @param replacecontent
    
    * @param flag
    
    * @return
    
    */
    
    public String replaceRTF(String content,String replacecontent,int flag){
    
        String rc = strToRtf(replacecontent);
    
        String target = "";
    
        /*if(flag==0){
    
            target = content.replace("$time$",rc);
    
        }*/
    
        if(flag==0){
    
            target = content.replace("$timetop$",rc);
    
        }
    
        if(flag==1){
    
            target = content.replace("$info$",rc);
    
        }
    
        if(flag==2){
    
            target = content.replace("$idea$",rc);
    
        }
    
        if(flag==3){
    
            target = content.replace("$advice$",rc);
    
        }
    
        if(flag==4){
    
            target = content.replace("$infosend$",rc);
    
        }
    
        return target;
    
    }
    
    
    
    /**
    
    * 获取文件路径
    
    * @param flag
    
    * @return
    
    */
    
    public String getSavePath() {
    
    
    
        String path = "C:\\YQ";
    
    
    
        File fDirecotry = new File(path);
    
        if (!fDirecotry.exists()) {
    
            fDirecotry.mkdirs();
    
        }
    
        return path;
    
    }
    
    
    
    /**
    
    * 半角转为全角
    
    */
    
    public String ToSBC(String input){
    
       char[] c = input.toCharArray();
    
       for (int i = 0; i < c.length; i++){
    
           if (c[i] == 32){
    
               c[i] = (char) 12288;
    
               continue;
    
           }
    
           if (c[i] < 127){
    
            c[i] = (char) (c[i] + 65248);
    
           }
    
       }
    
       return new String(c);
    
    }
    
    
    
    public void rgModel(String username, String content) {
    
        // TODO Auto-generated method stub
    
        /*  构建生成文件名 targetname:12时10分23秒_username_记录.rtf */
    
        Date current=new Date();
    
        SimpleDateFormat sdf=new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    
        String targetname = sdf.format(current).substring(11,13) + "时";
    
        targetname += sdf.format(current).substring(14,16) + "分";
    
        targetname += sdf.format(current).substring(17,19) + "秒";
    
        targetname += "_" + username +"_记录.rtf";
    
    
    
        /* 字节形式读取模板文件内容,将结果转为字符串 */
    
        String strpath = getSavePath();
    
        String sourname = strpath+"\\"+"模板.rtf";
    
        String sourcecontent = "";
    
        InputStream ins = null;
    
        try{
    
            ins = new FileInputStream(sourname);
    
            byte[] b = new byte[1024];
    
            if (ins == null) {
    
                 System.out.println("源模板文件不存在");
    
            }
    
            int bytesRead = 0;
    
            while (true) {
    
                bytesRead = ins.read(b, 0, 1024); // return final read bytes counts
    
                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 = "";
    
        /**
    
        * 拆分之后的数组元素与模板中的标识符对应关系
    
        * array[0]:timetop    
    
        * array[1]:info     
    
        * array[2]:idea     
    
        * array[3]:advice       
    
        * array[4]:infosend 
    
        */
    
        String array[] = content.split("~");
    
        /**
    
        * 2008年11月27日:更新模板之后时间无需自动填充
    
        */
    
        /*String nowtime = sdf.format(current).substring(0,4) + "年";
    
        nowtime += sdf.format(current).substring(5,7) + "月";
    
        nowtime += sdf.format(current).substring(8,10) + "日";*/
    
        for(int i=0;i<array.length;i++){
    
            /*if(i==0){
    
                targetcontent = documentDoc.replaceRTF(sourcecontent,nowtime,i);
    
            }else{
    
                targetcontent = documentDoc.replaceRTF(targetcontent,array[i-1],i);
    
            }*/
    
            if(i==0){
    
                targetcontent = replaceRTF(sourcecontent, array[i], i);
    
            }else{
    
                targetcontent = replaceRTF(targetcontent, array[i], i);
    
            }
    
    
    
        }   
    
        /* 结果输出保存到文件 */
    
        try {
    
            FileWriter fw = new FileWriter(getSavePath()+"\\" + targetname,true);
    
            PrintWriter out = new PrintWriter(fw);
    
            if(targetcontent.equals("")||targetcontent==""){
    
                out.println(sourcecontent);
    
            }else{
    
                out.println(targetcontent);
    
            }
    
            out.close();
    
            fw.close();
    
            System.out.println(getSavePath()+"  该目录下生成文件" + targetname + " 成功");
    
        } catch (IOException e) {
    
            // TODO Auto-generated catch block
    
            e.printStackTrace();
    
        }
    
    }
    
    
    
    
    
    
    
    
    
    public static void main(String[] args) {
    
        // TODO Auto-generated method stub
    
        OperatorRTF oRTF = new OperatorRTF();
    
        /**
    
        * 被替换内容以"~"符号分割,处理的时候将其拆分为数组即可
    
        */
    
        String content = "2008年10月12日9时-2008年10月12日6时~我们参照检验药品的方法~我们参照检验药品的方法~我们参照检验药品的方法~我们参照检验药品的方法";
    
        oRTF.rgModel("cheney",content);
    
    
    
    }
    

    }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。