1. 程式人生 > >基於hutool和POI的excel匯入工具類

基於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>