封装poi导入篇

Posted vvxtoys

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了封装poi导入篇相关的知识,希望对你有一定的参考价值。

前言

有封装的想法好久了,项目中有不少地方需要使用导入功能,导入虽说不能,但是每次都要为了特定类写一个特定方法,很麻烦,我很讨厌一直写这种东西了,正好趁着这次机会就写一个可以解决这种问题的小项目。

maven

 <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>4.0.0</version>
        </dependency>
<dependency>

基础工具类

package cc.vvxtoys.vhelper.excelhelper.util;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFCell;

public class LoaderUtil {
    
    public static String getValue(Cell cell) {
        switch (cell.getCellType()) {
        case BOOLEAN:
            return String.valueOf(cell.getBooleanCellValue()).trim();
        case NUMERIC:
            if(HSSFDateUtil.isCellDateFormatted(cell)){
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                return String.valueOf(sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue()))).trim();
            }
            BigDecimal bd = new BigDecimal(String.valueOf(cell.getNumericCellValue()).trim());
            return bd.toPlainString();
        default:
            return String.valueOf(cell.getStringCellValue()).trim();
        }
    }
    // 空行
    public static boolean isBlank(Row row) {
        for (int i = 0; i < row.getLastCellNum(); i++) {
            Cell cell = row.getCell(i);
            if (cell != null && cell.getCellType() != CellType.BLANK) {
                return false;
            }
        }
        return true;
    }
    
    public static boolean isEmpty(Object obj) {
        if (obj instanceof Cell) {
            Cell cell = (Cell) obj;
            return getValue(cell) == null || "".equals(getValue(cell));
        }
        return obj == null || obj.toString().trim().equals("");
    }
}

实体

package cc.vvxtoys.vhelper.excelhelper.loader;

import java.lang.reflect.Array;
import java.util.stream.BaseStream;
import java.util.stream.IntStream;
import java.util.stream.Stream;

/**
 * @author vvxtoys
 * @date 2018年10月30日上午11:34:23
 * @Description: TODO
 * @version V1.0
 */
public class ExcelLoader<T> {

    private int version;        //excel版本
    private Class<T> clazz;     //解析类型 javaben或者map
    private String path;        //路径
    private int startRow;       //解析开始条数
    private int endRow;         //解析结束条数
    private int[] indexs;       //对应列下标
    private String[] colums;    //列名
    private String sheetName;   //工作表名
    private int sheetIndex;     //工作表下标
    private int sheetMaxIndex;  //最大工作表下标
    

    public static class Builder<T> {
        private int version;
        private Class<T> clazz;
        private String path;
        private int startRow;
        private int endRow;
        private int[] indexs;
        private String[] colums;
        private String sheetName;
        private int sheetIndex  = -1;//默认值
        private int sheetMaxIndex;

        public Builder(String path){
            verifyPath(path);
        }
        
        public Builder(Class<T> clazz, String path) {
            this.clazz = clazz;
            verifyPath(path);
        }
        public void verifyPath(String path){
            this.path = path;
            if(path.endsWith(".xlsx")){
                this.version = 1;
            }else if(path.endsWith(".xls")){
                this.version = 0;
            }else{
                throw new IllegalArgumentException("path is unavailable!");
            }
        }
        
        public Builder<T> setStartRow(int startRow){
            this.startRow = startRow;
            return this;
        }
        
        public Builder<T> setEndRow(int endRow){
            this.endRow = endRow;
            return this;
        }
        
        public Builder<T> setIndexs(int[] indexs){
            this.indexs = indexs;
            return this;
        }
        
        public Builder<T> setColums(String[] colums){
            this.colums = colums;
            return this;
        }
        
        public Builder<T> setSheetName(String sheetName){
            this.sheetName = sheetName;
            return this;
        }
        
        public Builder<T> setSheetIndex(int sheetIndex){
            this.sheetIndex = sheetIndex;
            return this;
        }
        
        public Builder<T> setSheetMaxIndex(int sheetMaxIndex){
            this.sheetMaxIndex = sheetMaxIndex;
            return this;
        }
        
                                    
        public ExcelLoader<T> builder() {
            if(endRow == 0){
                endRow = version == 0?65535:1048575;//对应xls、xlsx
            }
            return new ExcelLoader<T>(this);
        }

    }
    private ExcelLoader(Builder<T> builder) {
        this.clazz = builder.clazz;
        this.path = builder.path;
        this.version = builder.version;
        this.colums = builder.colums;
        this.indexs = builder.indexs;
        this.sheetName = builder.sheetName;
        this.startRow = builder.startRow;
        this.endRow = builder.endRow;
        this.sheetMaxIndex = builder.sheetMaxIndex;
        this.sheetIndex = builder.sheetIndex;
    }   
    private void generatorColums(int len){
        colums = new String[len];
        //1.8
        IntStream.range(0,len).forEach(i -> Array.set(colums, i, "C"+i));
        //1.7
//      for(int i=0;i<len;i++){
//          colums[i] = "C"+i;
//      }
    }   
    private void generatorIndexs(int len){
        //1.8
        indexs = IntStream.range(0, len).toArray();
        //1.7
//      indexs = new int[len];
//      for(int i=0;i<len;i++){
//          indexs[i] = i;
//      }
    }   
    public void generator(int len){
        if (this.indexs == null) {
            generatorIndexs(len);
        }
        if(this.colums == null){
            generatorColums(len);
        }
    }   
    public String getPath(){
        return this.path;
    }
    public int getVersion() {
        return version;
    }
    public int getStartRow() {
        return startRow;
    }
    public int getEndRow() {
        return endRow;
    }
    public int[] getIndexs() {
        return indexs;
    }
    public String[] getColums() {
        return colums;
    }
    public String getSheetName() {
        return sheetName;
    }
    public int getSheetIndex() {
        return sheetIndex;
    }
    public int getSheetMaxIndex() {
        return sheetMaxIndex;
    }
    
    public Class<T> getClazz() {
        return clazz;
    }
    public int parserType(){
        if(this.clazz == null){
            return 0;//转换为map
        }
        return 1;//转换为javabean
    }
}

处理类

package cc.vvxtoys.vhelper.excelhelper.loader;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import cc.vvxtoys.vhelper.common.utils.BeanUtil;
import cc.vvxtoys.vhelper.excelhelper.util.LoaderUtil;

public class Loader<T> {

    private ExcelLoader<T> el;

    public Loader(ExcelLoader<T> el) {
        this.el = el;
    }

    public List<?> parsingExcel() {
        if (el.getVersion() == 0) {
            return parsingExcelByXls();
        } else {
            return parsingExcelByXlsx();
        }
    }

    /**
     * @author vvxtoys
     * @date 2018年11月1日上午10:26:01
     * @Description: 解析优先级 
     * 1.sheetName sheet页名 
     * 2.index sheet下标 
     * 3.maxindex sheet最大下标
     */
    private List<?> parsingExcelByXls() {
        List<T> list = new ArrayList<T>();// bean list
        List<Map<String, Object>> resultList = new ArrayList<>();// map list
        HSSFWorkbook workbook = null;
        try {
            int maxIndex = el.getSheetMaxIndex();// sheet页最大下标
            int index = el.getSheetIndex();// sheet页下标
            InputStream is = new FileInputStream(el.getPath());
            workbook = new HSSFWorkbook(is);
            HSSFSheet sheet = null;
            int len = 0;// 自动生成数组参数
            int sheetMaxNumber = workbook.getNumberOfSheets();// sheet个数
            if (el.getSheetName() != null) {
                sheet = workbook.getSheet(el.getSheetName());
                maxIndex = 1;// 不用遍历所有sheet页
            } else if (index != -1) {
                if (index < 0 || index > sheetMaxNumber) {
                    throw new IndexOutOfBoundsException("index is out of bounds");
                }
                sheet = workbook.getSheetAt(index);
                maxIndex = 1;
            } else {
                if (maxIndex < 1) {
                    maxIndex = 1;
                } else if (maxIndex > sheetMaxNumber) {
                    maxIndex = sheetMaxNumber;
                }
            }

            if (el.getColums() == null || el.getIndexs() == null) {
                int startRow = el.getStartRow();
                int startIndex = 0;
                if (startRow <= 0) {
                    startIndex = 0;
                } else {
                    startIndex = startRow - 1;
                }
                if (sheet == null) {
                    len = workbook.getSheetAt(0).getRow(startIndex).getPhysicalNumberOfCells();
                } else {
                    len = sheet.getRow(startIndex).getPhysicalNumberOfCells();
                }
                if (len == 0) {
                    throw new IllegalArgumentException("start column is blank");
                }
                el.generator(len);
            }

            for (int s = 0; s < maxIndex; s++) {
                if (sheet == null) {
                    sheet = workbook.getSheetAt(s);
                }
                int sheetMaxRow = sheet.getLastRowNum();// 行数
                int startRow = el.getStartRow();
                int endRow = el.getEndRow();
                int startIndex = 0;
                int endIndex = 0;
                if (startRow <= 0) {
                    startIndex = 0;
                } else {
                    startIndex = startRow - 1;
                }
                if (endRow > sheetMaxRow) {
                    endIndex = sheetMaxRow + 1;
                } else {
                    endIndex = endRow;
                }
                for (int rowNum = startIndex; rowNum < endIndex; rowNum++) {
                    HSSFRow row = sheet.getRow(rowNum);
                    if (LoaderUtil.isBlank(row)) {// 空行
                        continue;
                    }
                    Map<String, Object> result = new HashMap<>();
                    for (int i = 0; i < el.getColums().length; i++) {
                        HSSFCell cell = row.getCell(el.getIndexs()[i]);
                        if (!LoaderUtil.isEmpty(cell)) {
                            result.put(el.getColums()[i], LoaderUtil.getValue(cell));
                        }
                    }
                    resultList.add(result);
                }
            }

            if (el.parserType() == 0) {
                return resultList;
            } else {
                Class<T> clazz = el.getClazz();
                for (Map<String, Object> m : resultList) {
                    list.add(BeanUtil.mapToBean(m, clazz));
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } 
        
//      finally {
//          if (workbook != null) {
//              try {
//                  workbook.close();
//              } catch (IOException e) {
//                  e.printStackTrace();
//              }
//          }
//      }

        return list;
    }

    private List<?> parsingExcelByXlsx() {
        List<T> list = new ArrayList<T>();// bean list
        List<Map<String, Object>> resultList = new ArrayList<>();// map list
        XSSFWorkbook workbook = null;
        try {
            int maxIndex = el.getSheetMaxIndex();// sheet页最大下标
            int index = el.getSheetIndex();// sheet页下标
            InputStream is = new FileInputStream(el.getPath());
            workbook = new XSSFWorkbook(is);
            XSSFSheet sheet = null;
            int len = 0;// 自动生成数组参数
            int sheetMaxNumber = workbook.getNumberOfSheets();// sheet个数
            if (el.getSheetName() != null) {
                sheet = workbook.getSheet(el.getSheetName());
                maxIndex = 1;// 不用遍历所有sheet页
            } else if (index != -1) {
                if (index < 0 || index > sheetMaxNumber) {
                    throw new IndexOutOfBoundsException("index is out of bounds");
                }
                sheet = workbook.getSheetAt(index);
                maxIndex = 1;
            } else {
                if (maxIndex < 1) {
                    maxIndex = 1;
                } else if (maxIndex > sheetMaxNumber) {
                    maxIndex = sheetMaxNumber;
                }
            }

            if (el.getColums() == null || el.getIndexs() == null) {
                int startRow = el.getStartRow();
                int startIndex = 0;
                if (startRow <= 0) {
                    startIndex = 0;
                } else {
                    startIndex = startRow - 1;
                }
                if (sheet == null) {
                    len = workbook.getSheetAt(0).getRow(startIndex).getPhysicalNumberOfCells();
                } else {
                    len = sheet.getRow(startIndex).getPhysicalNumberOfCells();
                }
                if (len == 0) {
                    throw new IllegalArgumentException("start column is blank");
                }
                el.generator(len);
            }
            for (int s = 0; s < maxIndex; s++) {
                if (sheet == null) {
                    sheet = workbook.getSheetAt(s);
                }
                int sheetMaxRow = sheet.getLastRowNum();// 行数
                int startRow = el.getStartRow();
                int endRow = el.getEndRow();
                int startIndex = 0;
                int endIndex = 0;
                if (startRow <= 0) {
                    startIndex = 0;
                } else {
                    startIndex = startRow - 1;
                }
                if (endRow > sheetMaxRow) {
                    endIndex = sheetMaxRow + 1;
                } else {
                    endIndex = endRow;
                }
                for (int rowNum = startIndex; rowNum < endIndex; rowNum++) {
                    XSSFRow row = sheet.getRow(rowNum);
                    if (LoaderUtil.isBlank(row)) {// 空行
                        continue;
                    }
                    Map<String, Object> result = new HashMap<>();
                    for (int i = 0; i < el.getColums().length; i++) {
                        XSSFCell cell = row.getCell(el.getIndexs()[i]);
                        if (!LoaderUtil.isEmpty(cell)) {
                            result.put(el.getColums()[i], LoaderUtil.getValue(cell));
                        }
                    }
                    resultList.add(result);
                }
            }

            if (el.parserType() == 0) {
                return resultList;
            } else {
                Class<T> clazz = el.getClazz();
                for (Map<String, Object> m : resultList) {
                    list.add(BeanUtil.mapToBean(m, clazz));
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (workbook != null) {
                try {
                    workbook.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return list;
    }

}

beanUtil

public static <T> T mapToBean(Map<String, Object> map, Class<T> clazz) {
        if (map == null) {
            return null;
        }
        T obj = null;
        try{
            obj = clazz.newInstance();
            BeanUtils.populate(obj, map);
        }catch (Exception e) {
            e.printStackTrace();
        }
        return obj;
    }

调用类

package cc.vvxtoys.vhelper.excelhelper;

import java.util.List;

import cc.vvxtoys.vhelper.excelhelper.loader.ExcelLoader;
import cc.vvxtoys.vhelper.excelhelper.loader.Loader;
import cc.vvxtoys.vhelper.excelhelper.loader.ExcelLoader.Builder;

public class ExcelLoaderHelper{
    
    Builder<?> builder;
    
    public ExcelLoaderHelper(String path) {
        builder = new Builder<>(path);
    }
    
    public ExcelLoaderHelper(String path,Class<?> clazz) {
        builder = new Builder<>(clazz, path);
    }
    
    /**
     * @author vvxtoys
     * @date   2018年11月2日上午10:06:18
     * @Description: 设置起始行
     * @param startRow 
     */
    public void setStartRow(int startRow){
        builder.setStartRow(startRow);
    }
    /**
     * @author vvxtoys
     * @date   2018年11月2日上午10:07:02
     * @Description: 设置结束行
     * @param endRow 
     */
    public void setEndRow(int endRow){
        builder.setEndRow(endRow);
    }
    /**
     * @author vvxtoys
     * @date   2018年11月2日上午10:07:40
     * @Description: 指定列下标
     * @param indexs
     */
    public void setIndexs(int[] indexs){
        builder.setIndexs(indexs);
    }
    /**
     * @author vvxtoys
     * @date   2018年11月2日上午10:08:08
     * @Description: 设置列名
     * @param colums
     * @return
     */
    public void setColums(String[] colums){
        builder.setColums(colums);
    }
    /**
     * @author vvxtoys
     * @date   2018年11月2日上午10:09:08
     * @Description: 根据sheet名读取
     * @param sheetName
     */
    public void setSheetName(String sheetName){
        builder.setSheetName(sheetName);
    }
    /**
     * @author vvxtoys
     * @date   2018年11月2日上午10:09:25
     * @Description: 读取指定下标sheet
     * @param sheetIndex
     * @return
     */
    public void setSheetIndex(int sheetIndex){
        builder.setSheetIndex(sheetIndex);
    }
    /**
     * @author vvxtoys
     * @date   2018年11月2日上午10:10:34
     * @Description: 设置可读取最大sheet页
     * @param sheetMaxIndex
     */
    public void setSheetMaxIndex(int sheetMaxIndex){
        builder.setSheetMaxIndex(sheetMaxIndex);
    }
    
    
    @SuppressWarnings("rawtypes")
    public List<?> loadExcelToMap(){    
        ExcelLoader<?> el = builder.builder();
        Loader loader = new Loader<>(el);
        return loader.parsingExcel();
    }
    @SuppressWarnings({"rawtypes"})
    public List<?> loadExcelToBean(){
        ExcelLoader<?> el = builder.builder();
        if(el.getClazz() == null){
            throw new IllegalArgumentException("cannot be cast to NULL");
        }
        Loader loader = new Loader<>(el);
        return loader.parsingExcel();
    }
}

以上是关于封装poi导入篇的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot图文教程9—SpringBoot 导入导出 Excel 「Apache Poi」

Java-poi-excel-对空值单元格的读取

如何把word文档导入到数据库中——java POI

POI对Excel进行读取操作,工具类,便于操作数据

poi导入excel

如何用JAVA将Excel中的数据导入到sqlserver的表中