封装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导入篇的更多相关文章
- 封装poi导出篇
前言 先写的导入,以为导出会很简单,没想到导出的东西也不少,基于常用的几种样式和校验写了一个简单的导出,包括时间,数字,文字长度,下拉框,提示框校验,基础样式包括字体,字体颜色,背景颜色等功能,可以使 ...
- 在java poi导入Excel通用工具类示例详解
转: 在java poi导入Excel通用工具类示例详解 更新时间:2017年09月10日 14:21:36 作者:daochuwenziyao 我要评论 这篇文章主要给大家介绍了关于在j ...
- Java中使用poi导入、导出Excel
一.介绍 当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统.银行系统).或者是:我们已经习惯用Excel打印.这样在我们实际 ...
- POI导入导出
一.使用POI导出Execl表格 需要的jar包 package cn.yxj.poi; import java.io.FileOutputStream; import java.util.Date; ...
- Java利用POI导入导出Excel中的数据
首先谈一下今天发生的一件开心的事,本着一颗android的心我被分配到了PB组,身在曹营心在汉啊!好吧,今天要记录和分享的是Java利用POI导入导出Excel中的数据.下面POI包的下载地 ...
- poi 导入导出的api说明(大全)
原文链接:http://www.cnblogs.com/qingruihappy/p/8443101.html poi 导入导出的api说明(大全) 一. POI简介 ApachePOI是Apache ...
- poi导入Excel,数字科学记数法转换
在这里分享一下使用poi 导入Excel时 把数字转换为科学记数法的解决方法: 就是使用DecimalFormat对 i 进行了格式化 结果为:
- POI导入和导出Excel总结
POI导入和导出Excel总结 POI使用总结 1.POI读取Excel 打开工作簿的方式有以下两种简单的应用,POI读取和输出工作簿文件都可以通过以下两种方式来声明: //通过输入流的方式打开本 ...
- .Net Core ORM选择之路,哪个才适合你 通用查询类封装之Mongodb篇 Snowflake(雪花算法)的JavaScript实现 【开发记录】如何在B/S项目中使用中国天气的实时天气功能 【开发记录】微信小游戏开发入门——俄罗斯方块
.Net Core ORM选择之路,哪个才适合你 因为老板的一句话公司项目需要迁移到.Net Core ,但是以前同事用的ORM不支持.Net Core 开发过程也遇到了各种坑,插入条数多了也特别 ...
随机推荐
- c++中STL容器中的排序
1.c++STL中只有list自带了排序函数: (1).若list中存放的是int类型或者string类型,直接利用sort即可: list <int> list1; ...
- 简述iproute家族命令
ifconfig 是用来查看.配置.启用或禁用网络接口的工具.可以用这个工具来临时配置网卡的IP地址.掩码.广播地址.网关等. 语法 ifconfig [interface] 参数 up 启动指定网络 ...
- 基于C++的成功-失败法演示
确定搜索区间的一维搜索算法 求多元函数 f(x) 的最优解通常采用迭代的方法: 在可行域内任取一点 x0作为初始点,从 x0 出发,按照一定的方法,一次找到 x1,x2,x3,…,xn,…, 使得某个 ...
- 例:三位老师对某次数学竞赛进行了预测,他们的预测如下: 甲:学生A得了第一名,学生B得第三名。 乙:学生C得了第一名,学生D得第四名。 丙:学生D得了第二名,学生A得第三名。 结果表明,他们都说对了一半,说错了一半,并且无并列名次,输出A、B、C和D各自的名次。
public class demo { public static void main(String[] args) { int a,b,c,d;//代表四个学生 boolean x1,x2,x3;/ ...
- c/c++的常用函数和STL使用
一个超好用的c++网站:http://www.cplusplus.com/reference/string/string/erase/ 一.函数头中包含的函数 1.qsort函数对数组.结构体等进行排 ...
- python实现redis分布式锁
https://www.cnblogs.com/wangwei916797941/p/10030805.html
- 《大型网站系统与Java中间件实现》有感
头一次只用了一周的时间就看完一本书<大型网站系统与Java中间件实现>,这本书是关于设计方面的,提到了服务框架,消息中间件,数据访问层,以及如何解决应用之间的调用,解耦,以及应用和存储之间 ...
- 出现 OSError: symbolic link privilege not held的解决方案
jupyter notebook 出现 OSError: symbolic link privilege not held问题时 以管理员方式重新打开prompt.
- C# EnumHelper Enum的值,Description,ToString()的相互转换
首先定义枚举类型,如下: /// <summary> /// 板块 /// </summary> public enum Plate { [Descriptio ...
- innobackupex一些常用备份选项
指定数据库备份[root@node1]# innobackupex --defaults-file=/data/3306/my.cnf --user=root --password=password ...