日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 分析excel模板_java如何读取Excel简单模板

發布時間:2023/12/10 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 分析excel模板_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()的方法應該有漏洞,先這么用著

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

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> readexcel(string filepath) throws filenotfoundexception, fileformatexception {

// 檢查和獲取workbook對象

this.prereadcheck(filepath);

workbook wb = null;

map> map = new hashmap>();

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

list list = new arraylist();

row row = sheet.getrow(i);

if(null!=row){

for (int j=0;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

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;

}

}

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

希望與廣大網友互動??

點此進行留言吧!

總結

以上是生活随笔為你收集整理的java 分析excel模板_java如何读取Excel简单模板的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。