基於hutool和POI的excel匯入工具類
excel匯入也可以很簡單,利用POI進行匯入,以及強大的hutool工具類,再加上對業務的理解,就可以封裝成一個超級好用的業務類了。
maven依賴
<!-- Hutool超級工具類 http://hutool.mydoc.io/ -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version> 4.0.9</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version >
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml-schemas -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.17</version >
</dependency>
這個是模板excel,根據模板的座標來載入資料excel
這個是資料excel,理論上是一堆雜亂的看不懂的資料
helper類業務封裝
package org.microservice.tcbj.yytsg.checksys.util;
import java.util.LinkedHashMap;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import com.alibaba.fastjson.JSON;
import cn.hutool.core.io.FileUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
/**
* excel業務封裝
* @author zhengkai
*/
public class ExcelBizHelper {
public static String abc="#ABCDEFGHIJKLNMOPQRSTUVWXYZ";
public Map<String,String> readExcel() {
//模板處理 sheetIndex=0代表第一個
ExcelReader readerModel = ExcelUtil.getReader(FileUtil.file("C:\\Users\\Administrator\\Desktop\\體檢資料\\20180418發樣檢測條目篩選.xlsx"),0);
Map<String,String> excelMapModel=new LinkedHashMap<String,String>();
addCellToMapPlus(readerModel, excelMapModel, 1, 50, 2);
System.out.println(JSON.toJSONString(excelMapModel));
//資料處理 sheetName頁簽名稱
ExcelReader reader = ExcelUtil.getReader(FileUtil.file("C:\\Users\\Administrator\\Desktop\\體檢資料\\匿名.xls"), "1");
Map<String,String> excelMap=new LinkedHashMap<String,String>();
//遍歷模板excel資料,處理資料excel
for (String modelkey:excelMapModel.keySet()) {
//獲取座標值
String valuePath = excelMapModel.get(modelkey);
if(!StringUtils.isBlank(valuePath)) {
valuePath=valuePath.replace("(","").replace(")", "");
String[] rowcell = valuePath.split(",");
//根據座標,獲取對應的資料excel的值
addCellToMap3(reader, excelMap, modelkey, Integer.valueOf(rowcell[0]) , abc.indexOf(rowcell[1]));
}
}
System.out.println(JSON.toJSONString(excelMap));
return excelMap;
}
/*public static void main(String[] args) {
ExcelBizHelper helper=new ExcelBizHelper();
helper.readExcel();
}*/
/**
* 將excel座標資料新增到map(key,value)
* 例如資料(1,A)='姓名',(1,B)='XXX'
* 只需呼叫addCellToMap(row=1,cell=1,。。。)
* cell引數,A=1,B=2,C=3以此類推
* 即可獲取map('姓名','XXX')
* @author zhengkai
*/
public void addCellToMap(ExcelReader reader,Map<String,String> map,int row,int cell) {
map.put(getValue(reader.getSheet().getRow(row-1).getCell(cell-1)), getValue(reader.getSheet().getRow(row-1).getCell(cell)));
}
/**
* 將excel座標資料新增到map(str+key,value)
* 例如資料(1,A)='姓名',(1,B)='XXX'
* 只需呼叫addCellToMap(str='使用者資訊',row=1,cell=1,。。。)
* cell引數,A=1,B=2,C=3以此類推
* 即可獲取map('使用者資訊-姓名','XXX')
* @author zhengkai
*/
public void addCellToMap2(ExcelReader reader,Map<String,String> map,String str,int row,int cell) {
map.put(str+"-"+getValue(reader.getSheet().getRow(row-1).getCell(cell-1)), getValue(reader.getSheet().getRow(row-1).getCell(cell)));
}
/**
* 迴圈遍歷將excel座標資料新增到map(key,value)
* 例如資料(1,B)='姓名',(1,C)='XXX'
* 例如資料(2,B)='性別',(2,C)='YYY'
* 只需呼叫addCellToMapPlus(row_start=1,row_end=2,cell=1,。。。)
* cell引數,A=1,B=2,C=3以此類推
* 即可獲取map{('姓名','XXX')+map('性別','YYY')
* @author zhengkai
*/
public void addCellToMapPlus(ExcelReader reader,Map<String,String> map,int row_start,int row_end,int cell) {
for(int r=row_start;r<=row_end;r++) {
addCellToMap(reader, map, r, cell);
}
}
/**
* 迴圈遍歷將excel座標資料新增到map(str+key,value)
* 例如資料(1,B)='姓名',(1,C)='XXX'
* 例如資料(2,B)='性別',(2,C)='YYY'
* 只需呼叫addCellToMapPlus2(row_start=1,row_end=2,cell=1,str='使用者資訊'。。。)
* cell引數,A=1,B=2,C=3以此類推
* 即可獲取map{('使用者資訊-姓名','XXX')+map('使用者資訊-性別','YYY')
* @author zhengkai
*/
public void addCellToMap2Plus(ExcelReader reader,String str,Map<String,String> map,int row_start,int row_end,int cell) {
for(int r=row_start;r<=row_end;r++) {
addCellToMap2(reader, map, str, r, cell);
}
}
/**
* 將excel座標資料新增到map(str+key,value)
* 例如資料(1,B)='XXX'
* 只需呼叫addCellToMap3(namestr='姓名',row=1,cell=2,。。。)
* cell引數,A=1,B=2,C=3以此類推
* 即可獲取map('姓名','XXX')
* @author zhengkai
*/
public void addCellToMap3(ExcelReader reader,Map<String,String> map,String namestr,int row,int cell) {
map.put(namestr, getValue(reader.getSheet().getRow(row-1).getCell(cell-1)));
}
/**
* 獲取excel的值
* @author zhengkai
*/
public String getValue(Cell c) {
try {
if(CellType.NUMERIC.equals(c.getCellTypeEnum())) {
return c.getNumericCellValue()+"";
}else{
return c.getStringCellValue()+"";
}
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
}
最終效果
座標資料:
{“肝-內分泌”:”(63,D)”,”肝-免疫”:”(58,F)”,”肝-營養”:”(59,H)”,”膽囊”:”(62,D)”,”蛋白質代謝”:”(71,F)”,”肺”:”(59,D)”,”胸腺-免疫”:”(56,F)”,”扁桃體”:”(55,F)”,”呼吸系統”:”(105,F)”,”胰腺-內分泌”:”(61,D)”,”碳水化合物”:”(72,F)”,”代謝紊亂”:”(28,F)”,”消化酶”:”(75,F)”,”脂肪代謝能力”:”(73,F)”,”膽固醇”:”(104,F)”,”維生素A”:”(71,C)”,”維生素B”:”(72,C)”,”維生素C”:”(73,C)”,”維生素D”:”(74,C)”,”維生素E”:”(75,C)”,”維生素K”:”(77,C)”,”蛋白質”:”(71,F)”,”氨基酸”:”(78,F)”,”碳水化合物代謝”:”(72,F)”,”環境汙染-環境”:”(20,F)”,”汞合金”:”(17,F)”,”石棉”:”(18,F)”,”食物新增劑”:”(19,F)”,”氯化物”:”(21,F)”,”工業汙染”:”(22,F)”,”殺蟲劑”:”(23,F)”,”重金屬”:”(24,F)”,”放射物-環境”:”(25,F)”,”藥物毒素”:”(26,F)”,”美容毒素”:”(27,F)”,”鋅(Zn)”:”(113,F)”,”硫(S)”:”(116,F)”,”鈉(Na)”:”(117,F)”,”硒 (Se)”:”(119,F)”,”鉀 (K)”:”(120,F)”,”磷 ( P)”:”(121,F)”,”鎂(Mg)”:”(123,F)”,”錳(Mn)”:”(124,F)”,”鐵 (Fe)”:”(126,F)”,”碘(I)”:”(127,F)”,”鉻 (Cr)”:”(130,F)”,”鈣 (Ca)”:”(133,F)”}- 取值資料:
{“肝-內分泌”:”40.0”,”肝-免疫”:”89.0”,”肝-營養”:”40.0”,”膽囊”:”77.0”,”蛋白質代謝”:”9.0”,”肺”:”40.0”,”胸腺-免疫”:”38.0”,”扁桃體”:”84.0”,”呼吸系統”:”45.0”,”胰腺-內分泌”:”55.0”,”碳水化合物”:”93.0”,”代謝紊亂”:”94.0”,”消化酶”:”18.0”,”脂肪代謝能力”:”87.0”,”膽固醇”:”102.0”,”維生素A”:”122.0”,”維生素B”:”46.0”,”維生素C”:”69.0”,”維生素D”:”104.0”,”維生素E”:”75.0”,”維生素K”:”113.0”,”蛋白質”:”9.0”,”氨基酸”:”57.0”,”碳水化合物代謝”:”93.0”,”環境汙染-環境”:”85.0”,”汞合金”:”72.0”,”石棉”:”95.0”,”食物新增劑”:”87.0”,”氯化物”:”95.0”,”工業汙染”:”69.0”,”殺蟲劑”:”91.0”,”重金屬”:”91.0”,”放射物-環境”:”64.0”,”藥物毒素”:”80.0”,”美容毒素”:”97.0”,”鋅(Zn)”:”48.0”,”硫(S)”:”56.0”,”鈉(Na)”:”48.0”,”硒 (Se)”:”64.0”,”鉀 (K)”:”104.0”,”磷 ( P)”:”90.0”,”鎂(Mg)”:”46.0”,”錳(Mn)”:”48.0”,”鐵 (Fe)”:”24.0”,”碘(I)”:”90.0”,”鉻 (Cr)”:”48.0”,”鈣 (Ca)”:”121.0”}
*。abc那個字母序號獲取其實還沒怎麼完善,excel的序號是從A~Z,AA~ZZ的,等改天有空優化一下這個
*。感謝hutool群的網友反饋,poi-ooxml包已經包含了poi包,不需要引入,已經去除
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>