前言
这是本人写的一个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;
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;
@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.*;
public class excelRead {
//日志输出
private static Logger logger = LoggerFactory.getLogger(excelRead.class);
//定义excel类型
private static final String XLS = "xls";
private static final String XLSX = "xlsx";
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;
}
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;
}
private static List
5.测试类
package com.cly.utils.Excel;
import java.util.*;
public class Readtest {
public static void main(String[] args) throws Exception {
List> result =excelRead.ReadExcelByRC("D:.xls",2,10,false);
System.out.println(result.size());
System.out.println(result);
List result2 = excelRead.ReadExcelByPOJO("D:.xls",2,10,ExcelPOJO.class);
System.out.println(result2.size());
System.out.println(result2);
}
}
6.运行结果和说明
exce表格数据
方法一的运行结果
1.ture:key为列名
2.false:key为第几列列数
方法二的运行结果
实体类的所有成员变量一定要加上自定义注释@excelRescoure,不然会报错
还有很多不足的地方,请多多指点,希望能给你带来帮助。
SpringBoot实现内存数据导出成Excel在另一篇文章 文章地址:https://www.jb51.net/article/202767.htm
总结
到此这篇关于SpringBoot实现Excel读取的文章就介绍到这了,更多相关SpringBoot实现Excel读取内容请搜索考高分网以前的文章或继续浏览下面的相关文章希望大家以后多多支持考高分网!