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

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java如何讀取Excel簡單模板

java如何讀取Excel簡單模板

2021-06-06 14:11Bour Java教程

這篇文章主要為大家詳細介紹了java如何讀取Excel簡單模板,具有一定的參考價值,感興趣的小伙伴們可以參考一下

場景:對于經常需要導入excel模板或數據來解析后加以應用的,使用頻率非常之高,做了一個比較穩定的版本,體現在這些地方

工具:org.apache.poi

使用前必須了解這些:

1、要解析,那肯定先判斷是不是excel

2、xls后綴的excel,是03版及以前的用hssfworkbook類
      xlsx后綴的excel,是07版及以后的用xssfworkbook解析

3、getworkbook這個方法是我自己亂造各種excel數據不斷測試搜索修正得出的結果,其他的像簡單的判斷后綴xls還是xlsx來決定用hssh還是xssf是不保險的,比如你可能沒遇過org.apache.poi.openxml4j.exceptions.invalidformatexception這樣的異常,當然這個異常仍然是因為excel類型導致獲取workbook時出錯,然而我查到的結果是,excel最底層是xml實現的,類型問題出在這兒,看異常的描述也可以稍微看出來openxml4j.exceptions

4 、可能出現空行,空的單元格,或者單元格值為空的情況,這些情況,在我的readexcel()方法里都考慮到了,為什么我不用迭代器,或者加強的for each循環?就是因為這些坑爹的空單元格或者空行啊,迭代器內部在取cell單元格對象時跳過這些空的對象,who knows why?我也不知道,反正我測試過,跳過去了,本來5個單元格,一個空的,結果就只得到4個數據,即使用cell.isempty()和cell!=null來判斷,也沒卵用,因為遍歷的時候直接跳過去了,都沒有判斷的機會

5、取單元格數據,這個就比較簡單了,判斷單元格類型,根據類型做相應的處理取出來,但是我覺得我這個getcellvalue()的方法應該有漏洞,先這么用著

下面上代碼,簡單描述下關鍵部位

 

?
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
import java.io.file;
import java.io.fileinputstream;
import java.io.filenotfoundexception;
import java.io.ioexception;
import java.io.inputstream;
import java.io.pushbackinputstream;
import java.util.arraylist;
import java.util.hashmap;
import java.util.map;
import java.util.list;
import org.apache.poi.poixmldocument;
import org.apache.poi.openxml4j.exceptions.invalidformatexception;
import org.apache.poi.openxml4j.opc.opcpackage;
import org.apache.poi.poifs.filesystem.poifsfilesystem;
import org.apache.poi.ss.usermodel.cell;
import org.apache.poi.ss.usermodel.row;
import org.apache.poi.ss.usermodel.sheet;
import org.apache.poi.ss.usermodel.workbook;
import org.apache.poi.xssf.usermodel.xssfworkbook;
import org.apache.poi.hssf.usermodel.hssfcell;
import org.apache.poi.hssf.usermodel.hssfworkbook;
import org.apache.xmlbeans.impl.piccolo.io.fileformatexception;
/**
 *yanbiao 2016.10.25
 */
public class excelutil {
 
  private static final string extension_xls = "xls";
  private static final string extension_xlsx = "xlsx";
 
/**
* 文件檢查
*/
private void prereadcheck(string filepath) throws filenotfoundexception, fileformatexception {
 
file file = new file(filepath);
if (!file.exists()) {
throw new filenotfoundexception("導入的文件不存在:" + filepath);
}
if (!(filepath.endswith(extension_xls) || filepath.endswith(extension_xlsx))) {
throw new fileformatexception("傳入的文件不是excel");
}
}
 /**
   * 取得workbook對象
   * xls:hssfworkbook,03版
   * xlsx:xssfworkbook,07版
  */
 private workbook getworkbook(string filepath) throws ioexception, invalidformatexception {
    //直接判斷后綴來返回相應的workbook對象多數情況沒問題,但是這個更保險,第3條已經說明 
    workbook wb = null;
    inputstream is = new fileinputstream(filepath);
    if (!is.marksupported()) {
      is = new pushbackinputstream(is, 8);
    }
    if (poifsfilesystem.haspoifsheader(is)) {
       return new hssfworkbook(is);
    }
    if (poixmldocument.hasooxmlheader(is)) {
      return new xssfworkbook(opcpackage.open(is));
    }
    throw new illegalargumentexception("您的excel版本目前不支持poi解析");
  }
 
  /**
   * 讀取excel文件內容
   */
  public map<integer, list<string>> readexcel(string filepath) throws filenotfoundexception, fileformatexception {
    // 檢查和獲取workbook對象
    this.prereadcheck(filepath);
    workbook wb = null;
    map<integer,list<string>> map = new hashmap<integer, list<string>>();
    try {
      wb = this.getworkbook(filepath);
      // 默認只讀取第一個sheet
      sheet sheet = wb.getsheetat(0);
      int rowcount = sheet.getlastrownum();//邏輯行,包括空行
      int cellcount = sheet.getrow(0).getlastcellnum();//第一行(將來作為字段的行)有多少個單元格
      for (int i=0;i<rowcount;i++) {          //這里用最原始的for循環來保證每行都會被讀取
         list<string> list = new arraylist<string>();
         row row = sheet.getrow(i);
         if(null!=row){
            for (int j=0;j<cellcount;j++) {
             list.add(getcellvalue(row.getcell(j)));  //這里也是用for循環,用cell c:row這樣的遍歷,空單元格就被拋棄了 
            }
            system.out.println("第"+(row.getrownum()+1)+"行數據:"+list.tostring());
            map.put(row.getrownum(), list);
          }else{
            for (int j=0;j<cellcount;j++) {
              list.add("無數據");  
            }
            system.out.println("第"+(i+1)+"行數據:"+list.tostring());
            map.put(i, list);
        }    
      }   
    } catch (exception e) {
        system.out.println("讀取excel異常:"+e.getmessage());
        e.printstacktrace();
      } finally {
         if (wb != null) {
           try {
               wb.close();
            } catch (ioexception e) {
               e.printstacktrace();
             }
         }
       }
    return map;  
  }
  /**
   * 取單元格的值
   */
  private string getcellvalue(cell c) {
    if (c == null) {
      return "無數據";
    }
    string value = "";
    switch (c.getcelltype()){
    case hssfcell.cell_type_numeric://數字
       value = c.getnumericcellvalue()+"";
    break;
    case hssfcell.cell_type_string://字符串
      value = c.getstringcellvalue();
    break;
    case hssfcell.cell_type_boolean://boolean
      value = c.getbooleancellvalue()+"";
    break;
    case hssfcell.cell_type_formula://公式
      value = c.getcellformula()+"";
    break;
    case hssfcell.cell_type_blank://空值
      value= "無數據";
     break;
    case hssfcell.cell_type_error:
      value = "非法字符";
     break;
    default:
      value= "未知類型";
     break;   
    }
    return value;
  }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://www.cnblogs.com/yb38156/p/9821804.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 99久久免费国产香蕉麻豆 | 狠狠色96视频 | 久久精品亚洲精品国产欧美 | 男同精品视频免费观看网站 | 国内精品视频免费观看 | 日本69av| 极限淫生小说 | 亚洲男人天| 97自拍视频在线观看 | 女人爽到喷水的视频免费看 | 国产亚洲综合精品一区二区三区 | 色综合视频在线观看 | 亚洲国产成人久久精品hezyo | 国产青草亚洲香蕉精品久久 | tubehdxx丝袜正片 | 青草视频网站 | 亚洲第成色999久久网站 | 国产精品一级视频 | 韩国三级日本三级香港三级黄 | 我被黄总征服的全过程 | 国产在亚洲线视频观看 | 手机在线免费观看日本推理片 | 精品一区二区三区视频日产 | 亚洲日本va中文字幕 | 人人看人人射 | 2021国产麻豆剧传媒剧情最新 | 欧美三级不卡视频 | 男人摸女人下面 | 国产久视频 | 成全动漫视频在线观看 | 亚洲高清免费在线观看 | 韩国最新理论片奇忧影院 | 30分钟的高清视频在线观看 | 天天色综合6| 嫩草影院永久在线一二三四 | 污黄在线观看 | 扒开女人下面使劲桶屁股动漫 | 视频在线播放 | 国产在线观看人成激情视频 | 日韩国产欧美视频 | 国内自拍2020 |