前言
这是本人写的一个SpringBoot对Excel读取的方法,实测能用,待提升的地方有很多,有不足之处请多多指点。
Excel2003版(后缀为.xls)最大行数是65536行,最大列数是256列。
Excel2007以上的版本(后缀为.xlsx)最大行数是1048576行,最大列数是16384列。
提供2种方法读取:
1.根据指定的开始和结束行数读取返回结果,结果格式为List
2.根据指定的开始和结束行数读取返回结果,结果格式为List
请根据实际内存堆可用大小进行读取,太多可进行分段读取(类似分页的原理)
读取Excel所需要的几个类

1.在pom.xml加上依赖
org.apache.poi
poi
4.0.1
org.apache.poi
poi-ooxml
4.0.1
2.ExcelPOJO实体类
package com.cly.utils.Excel;
/**
* @author : CLy
* @ClassName : ExcelPOJO
* @date : 2020/7/9 17:13
* 实体类所有成员变量都需要有GET,SET方法
* 所有成员变量都要加上注解@excelRescoure(value = "?"),?为Excel真实列名,必须一一对应
* @excelRescoure(value = "?"),?可为空,需要用到才赋值
* 成员变量目前只允许String,Double,Interge,Float
**/
public class ExcelPOJO {
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPasswork() {
return passwork;
}
public void setPasswork(String passwork) {
this.passwork = passwork;
}
public String getLook() {
return look;
}
public void setLook(String look) {
this.look = look;
}
@excelRescoure(value = "XM")
private String name;
@excelRescoure(value = "SFZH")
private String passwork;
@excelRescoure()
private String look;
@Override
public String toString(){
return "name:"+this.getName()+",passwork:"+this.getPasswork()+",look:"+this.getLook();
}
public ExcelPOJO() {}
}
3.@interface自定义注解(用于实体类读取)
package com.cly.utils.Excel;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @author : CLy
* @ClassName : myRescoure
* @date : 2020/7/10 9:31
**/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface excelRescoure {
String value() default "";//默认为空
}
4.excelRead类(读取Excel数据类)有很多冗余的代码,可抽离出来
package com.cly.utils.Excel;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.sun.org.apache.bcel.internal.generic.NEW;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.formula.functions.T;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.xml.transform.Source;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.*;
import java.text.DecimalFormat;
import java.util.*;
/**
* @author : CLy
* @ClassName : excelRead
* @date : 2020/7/9 11:08
**/
public class excelRead {
//日志输出
private static Logger logger = LoggerFactory.getLogger(excelRead.class);
//定义excel类型
private static final String XLS = "xls";
private static final String XLSX = "xlsx";
/**
* 根据文件后缀名类型获取对应的工作簿对象
* @param inputStream 读取文件的输入流
* @param fileType 文件后缀名类型(xls或xlsx)
* @return 包含文件数据的工作簿对象
*/
private static Workbook getWorkbook(InputStream inputStream, String fileType) throws IOException {
//用自带的方法新建工作薄
Workbook workbook = WorkbookFactory.create(inputStream);
//后缀判断有版本转换问题
//Workbook workbook = null;
//if (fileType.equalsIgnoreCase(XLS)) {
// workbook = new HSSFWorkbook(inputStream);
//} else if (fileType.equalsIgnoreCase(XLSX)) {
// workbook = new XSSFWorkbook(inputStream);
//}
return workbook;
}
/**
* 将单元格内容转换为字符串
* @param cell
* @return
*/
private static String convertCellValueToString(Cell cell) {
if (cell == null) {
return null;
}
String returnValue = null;
switch (cell.getCellType()) {
case NUMERIC: //数字
Double doubleValue = cell.getNumericCellValue();
// 格式化科学计数法,取一位整数,如取小数,值如0.0,取小数点后几位就写几个0
DecimalFormat df = new DecimalFormat("0");
returnValue = df.format(doubleValue);
break;
case STRING: //字符串
returnValue = cell.getStringCellValue();
break;
case BOOLEAN: //布尔
Boolean booleanValue = cell.getBooleanCellValue();
returnValue = booleanValue.toString();
break;
case BLANK: // 空值
break;
case FORMULA: // 公式
returnValue = cell.getCellFormula();
break;
case ERROR: // 故障
break;
default:
break;
}
return returnValue;
}
/**
* 处理Excel内容转为List