一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語言 - JAVA教程 - 使用Java讀取Word文件的簡單例子分享

使用Java讀取Word文件的簡單例子分享

2020-01-10 16:14ISH_ICODE JAVA教程

這篇文章主要介紹了使用Java讀取Word文件的簡單例子分享,包括讀取word文件的表格數(shù)據(jù)的示例,需要的朋友可以參考下

java讀取word文檔時,雖然網(wǎng)上介紹了很多插件poi、java2Word、jacob、itext等等,poi無法讀取格式(新的API估計行好像還在處于研發(fā)階段,不太穩(wěn)定,做項目不太敢用);java2Word、jacob容易報錯找不到注冊,比較詭異,我曾經(jīng)在不同的機器上試過,操作方法完全一致,有的機器不報錯,有的報錯,去他們論壇找高人解決也說不出原因,項目部署用它有點玄;itxt好像寫很方便但是我查了好久資料沒有見到過關(guān)于讀的好辦法。經(jīng)過一番選擇還是折中點采用rtf最好,畢竟rtf是開源格式,不需要借助任何插件,只需基本IO操作外加編碼轉(zhuǎn)換即可。rtf格式文件表面看來和doc沒啥區(qū)別,都可以用word打開,各種格式都可以設(shè)定。
 
----- 實現(xiàn)的功能:讀取rtf模板內(nèi)容(格式和文本內(nèi)容),替換變化部分,形成新的rtf文檔。
 
----- 實現(xiàn)思路:模板中固定部分手動輸入,變化的部分用$info$表示,只需替換$info$即可。
 
       1、采用字節(jié)的形式讀取rtf模板內(nèi)容
       2、將可變的內(nèi)容字符串轉(zhuǎn)為rtf編碼
       3、替換原文中的可變部分,形成新的rtf文檔
 
主要程序如下:
 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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("讀取模板文件結(jié)束");
        break;
       }
       sourcecontent += new String(b, 0, bytesRead); // convert to string using bytes
      }
 }catch(Exception e){
  e.printStackTrace();
 }
 return sourcecontent ;
}

   
      以上為核心代碼,剩余部分就是替換,從新組裝java中的String.replace(oldstr,newstr);方法可以實現(xiàn),在這就不貼了。源代碼部分詳見附件。
運行源代碼前提:
c盤創(chuàng)建YQ目錄,將附件中"模板.rtf"復(fù)制到Y(jié)Q目錄之下,運行OpreatorRTF.java文件即可,就會在YQ目錄下生成文件名如:21時15分19秒_cheney_記錄.rtf 的文件。 
 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
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("讀取模板文件結(jié)束");
 
              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文件的表格數(shù)據(jù)的示例:
使用Java讀取Word文件的簡單例子分享

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<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>

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品久线观看视频 | 欧美黑人换爱交换乱理伦片 | 亚洲欧美日韩综合在线播放 | 精品久久综合一区二区 | 极品蜜桃臀美女啪啪 | 日本68xxxxxxxxx24| 免费看a片毛片 | 国产一区二区不卡视频 | 国产午夜亚洲精品一区网站 | 国产一区二区精品久久91 | 特级www| 国产亚洲人成网站天堂岛 | 久久精品亚洲热综合一本 | 青春学堂在线观看 | 久久精品成人免费看 | 男人操女生 | 国产精品久久久久久福利 | 公园吃女人奶野战视频 | 色偷偷影院| 国产香蕉一区二区在线观看 | 国产乱码免费卡1卡二卡3卡四 | 日本漫画工囗全彩内番e绅 日本伦理动漫在线观看 | 日韩欧美国产综合精品 | 九九在线精品亚洲国产 | 婷射吧| 国产午夜免费秋霞影院 | a4yy欧美一区二区三区 | 国产美女操 | 成 人 亚洲 综合天堂 | 骚虎最新网址 | 高清男的插曲女的 欢迎你老狼 | 亚洲国产欧美在线人成aaaa20 | 九九精品视频一区二区三区 | 国内自拍网红在线自拍综合 | 青青网在线视频 | 国产精品网站在线观看 | 2019国产精品 | 都市风流贵妇激情 | 2020中文字幕 | 国产成人精品免费久久久久 | 亚洲精品国产成人 |