作者:白变小樱啊 | 来源:互联网 | 2022-02-03 13:29
这篇文章主要给大家介绍了关于SpringBoot实现Excel读取的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
前言
这是本人写的一个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
5.测试类
package com.cly.utils.Excel;
import java.util.*;
/**
* @author : CLy
* @ClassName : Readtest
* @date : 2020/7/9 16:31
**/
public class Readtest {
public static void main(String[] args) throws Exception {
/** 方法一
* fileName:Excel文件路径
* StatrRow:读取的开始行数(默认填0)
* EndRow:读取的结束行数(填-1为全部)
* ExistTop:是否存在头部(如存在则读取数据时会把头部拼接到对应数据作为KEY,若无则KEY为当前列数)
*/
List> result =excelRead.ReadExcelByRC("D:.xls",2,10,false);
System.out.println(result.size());
System.out.println(result);
/**
* 方法二
* ReadExcelByPOJO(String fileName, int StatrRow, int EndRow, Class t)
* fileName:Excel文件路径
* StatrRow:读取的开始行数(默认填0)
* EndRow:读取的结束行数(填-1为全部)
* Class:传过来的实体类类型
*/
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读取内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!