使用Java读取Word文件的简单例子分享

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文档
 
主要程序如下:

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();
  }

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();
 }
 return sourcecontent ;
}

以上为核心代码,剩余部分就是替换,从新组装java中的String.replace(oldstr,newstr);方法可以实现,在这就不贴了。源代码部分详见附件。
运行源代码前提:
c盘创建YQ目录,将附件中"模板.rtf"复制到YQ目录之下,运行OpreatorRTF.java文件即可,就会在YQ目录下生成文件名如:21时15分19秒_cheney_记录.rtf 的文件。

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 {

    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();

    }

    public String replaceRTF(String content,String replacecontent,int flag){

       String rc = strToRtf(replacecontent);

       String target = "";

       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;

    }

    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

       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 = "";

       String array[] = content.split("~");

       for(int i=0;i<array.length;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);

    }

}

使用POI读取word文件的表格数据的示例:

<span style="font-size:14px;">package com.poi.world; 

import java.io.FileInputStream; 

import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.Paragraph;
import org.apache.poi.hwpf.usermodel.Range;
import org.apache.poi.hwpf.usermodel.Table;
import org.apache.poi.hwpf.usermodel.TableCell;
import org.apache.poi.hwpf.usermodel.TableIterator;
import org.apache.poi.hwpf.usermodel.TableRow;
import org.apache.poi.poifs.filesystem.POIFSFileSystem; 

public class POI_Word{
  public static void main(String[] args){
    try {
      String[] s=new String[20];
      FileInputStream in=new FileInputStream("D:\\mayi.doc");
      POIFSFileSystem pfs=new POIFSFileSystem(in);
      HWPFDocument hwpf=new HWPFDocument(pfs);
      Range range =hwpf.getRange();
      TableIterator it=new TableIterator(range);
      int index=0;
      while(it.hasNext()){
        Table tb=(Table)it.next();
        for(int i=0;i<tb.numRows();i++){
          //System.out.println("Numrows :"+tb.numRows());
          TableRow tr=tb.getRow(i);
          for(int j=0;j<tr.numCells();j++){
            //System.out.println("numCells :"+tr.numCells());
//           System.out.println("j  :"+j);
            TableCell td=tr.getCell(j);
            for(int k=0;k<td.numParagraphs();k++){
              //System.out.println("numParagraphs :"+td.numParagraphs());
              Paragraph para=td.getParagraph(k);
               s[index]=para.text().trim();
               index++;
            }
          }
        }
      }
//     System.out.println(s.toString());
      for(int i=0;i<s.length;i++){
        System.out.println(s[i]);
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}</span>
(0)

相关推荐

  • Java中使用正则表达式的一个简单例子及常用正则分享

    import java.util.Scanner; public class regexTest { // 新建类 public static void main(String[] args){ // 主方法 Scanner sc = new Scanner(System.in); // new Scanner类对象 System.out.println("Please Enter Email:"); String email = sc.nextLine(); System.out.p

  • JAVA中实现链式操作(方法链)的简单例子

    在使用jQuery时候,我们经常会看到或者使用到方法链,例如: 复制代码 代码如下: $("#p1").css("color","red").slideUp(2000).slideDown(2000); 这段代码的意思是选择器选择id为p1的html标签,颜色变红,之后slideup,再slidedown. 自然是可以将这几个方法分开写,但是不分开的话不仅有很好的易读性,代码量也会有减少,那么何乐而不为? 这种调用函数的方式在jQuery中称为&

  • java 中设计模式之单例

    java 中设计模式之单例 设计模式思想 什么是设计模式:我作为初学者,今天第一次正式学习设计模式,我觉得对与理解什么是设计模式很重要,那么什么是设计模式呢? 设计模式:解决问题的一种行之有效的思想. 设计模式:用于解决特定环境下.重复出现的特定问题的解决方案 我的理解是前人在软件设计的时候碰到了一类问题,他们总结出了一套行之有效,并且经过验证的解决方案. 设计模式的优点: 1.设计模式都是一些相对优秀的解决方案,很多问题都是典型的.有代表性的问题,学习设计模式,我们就不用自己从头来解决这些问题

  • JAVA实现单例模式的四种方法和一些特点

    一.饿汉式单例类 复制代码 代码如下: public class Singleton  {      private Singleton(){ } private static Singleton instance = new Singleton(); private static Singleton getInstance(){          return instance;      }  } 特点:饿汉式提前实例化,没有懒汉式中多线程问题,但不管我们是不是调用getInstance()

  • Java单例模式、饥饿模式代码实例

    class MyThreadScopeData {       // 单例     private MyThreadScopeData() {     }       // 提供获取实例方法     public static synchronized MyThreadScopeData getThreadInstance() {         // 从当前线程范围内数据集中获取实例对象         MyThreadScopeData instance = map.get();      

  • java多线程之线程安全的单例模式

    概念: java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种. 单例模式有一下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例.这些应用都或多或少具有资源管理器的功能.每台计算机可以有若干个打印机,但只能有一个Printer

  • java单例模式使用及注意事项

    1. 说明 1)单例模式:确保一个类只有一个实例,自行实例化并向系统提供这个实例 2)单例模式分类:饿单例模式(类加载时实例化一个对象给自己的引用),懒单例模式(调用取得实例的方法如getInstance时才会实例化对象)(java中饿单例模式性能优于懒单例模式,c++中一般使用懒单例模式) 3)单例模式要素: a)私有构造方法b)私有静态引用指向自己实例c)以自己实例为返回值的公有静态方法 2.实例 饿单例模式: 复制代码 代码如下: package com.wish.modedesign;

  • java单例模式4种使用方式分享

    1.Java Concurrency In Practice的List 复制代码 代码如下: public class Singleton {      private static class SingletonHolder {          public static Singleton resource = new Singleton();      }      public static Singleton getResource() {          return  Sing

  • Java单例模式的应用示例

    单例模式用于保证在程序的运行期间某个类有且仅有一个实例.其优势在于尽可能解决系统资源.通过修改构造方法的访问权限就可以实现单例模式. 代码如下: 复制代码 代码如下: public class Emperor {    private static Emperor emperor = null;// 声明一个Emperor类的引用 private Emperor() {// 将构造方法私有    } public static Emperor getInstance() {// 实例化引用   

  • 使用Java读取Word文件的简单例子分享

    java读取word文档时,虽然网上介绍了很多插件poi.java2Word.jacob.itext等等,poi无法读取格式(新的API估计行好像还在处于研发阶段,不太稳定,做项目不太敢用):java2Word.jacob容易报错找不到注册,比较诡异,我曾经在不同的机器上试过,操作方法完全一致,有的机器不报错,有的报错,去他们论坛找高人解决也说不出原因,项目部署用它有点玄:itxt好像写很方便但是我查了好久资料没有见到过关于读的好办法.经过一番选择还是折中点采用rtf最好,毕竟rtf是开源格式,

  • 用Ajax读取xml文件的简单例子

    到此就可以就发送请求读取服务器端的XML数据了,最后要做的就是处理数据了. 关于XMLHttpRequest对象,请参考About XMLHttpRequest Object一文. 看例子: //AjaxDemo.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"

  • java读取properties文件的方法

    本文实例讲述了java读取properties文件的方法.分享给大家供大家参考.具体实现方法如下: package com.test.demo; import java.util.Properties; import java.io.InputStream; import java.io.IOException; /** * 读取Properties文件的例子 * File: TestProperties.java */ public final class TestProperties { p

  • java读取properties文件的方法实例分析

    本文实例讲述了java读取properties文件的方法.分享给大家供大家参考.具体分析如下: 1.不在项目中读取: Properties properties = new Properties(); BufferedReader read = new BufferedReader(new InputStreamReader(new FileInputStream("文件的路径"),"utf-8")); properties.load(read); properti

  • Java中使用Apache POI读取word文件简单示例

    Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. 1.读取word 2003及word 2007需要的jar包 读取 2003 版本(.doc)的word文件相对来说比较简单,只需要 poi-3.5-beta6-20090622.jar 和 poi-scratchpad-3.5-beta6-20090622.jar 两个 jar 包即可, 而 2007 版本(.docx)就麻烦多,我说的这个麻烦不

  • Java读取txt文件和写入txt文件的简单实例

    写Java程序时经常碰到要读如txt或写入txt文件的情况,但是由于要定义好多变量,经常记不住,每次都要查,特此整理一下,简单易用,方便好懂! package edu.thu.keyword.test; import java.io.File; import java.io.InputStreamReader; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStream;

  • java读取wav文件(波形文件)并绘制波形图的方法

    本文实例讲述了java读取wav文件(波形文件)并绘制波形图的方法.分享给大家供大家参考.具体如下: 因为最近有不少网友询问我波形文件读写方面的问题,出于让大家更方便以及让代码能够得到更好的改进,我将这部分(波形文件的读写)代码开源在GitHub上面. 地址为https://github.com/sintrb/WaveAccess/,最新的代码.例子.文档都在那上面,我会在我时间精力允许的前提下对该项目进行维护,同时也希望对这方面有兴趣的网友能够加入到该开源项目上. 以下内容基本都过期了,你可以

  • Java IO 之文件读写简单实例

    Java IO 之文件读写简单实例 1.文件读 public class ReadFromFile { /** * 以字节为单位读取文件,常用于读二进制文件,如图片.声音.影像等文件. */ public static void readFileByBytes(String fileName) { File file = new File(fileName); InputStream in = null; try { System.out.println("以字节为单位读取文件内容,一次读一个字

  • 详解spring mvc(注解)上传文件的简单例子

    spring mvc(注解)上传文件的简单例子. 这有几个需要注意的地方 1.form的enctype="multipart/form-data" 这个是上传文件必须的 2.applicationContext.xml中 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/> 关于

  • java读取word文档,提取标题和内容的实例

    使用的工具为poi,需要导入的依赖如下 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <arti

随机推荐