Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
com.thomas.alib.excel.importer.ExcelImportSimple Maven / Gradle / Ivy
package com.thomas.alib.excel.importer;
import com.thomas.alib.excel.interfaces.EFunction;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.function.BiConsumer;
/**
* Excel导入工具类
*/
public class ExcelImportSimple {
private static Logger logger = LoggerFactory.getLogger(ExcelImportSimple.class);
/**
* 读取excel文件总行数
*
* @param inputStreamGetFunc 获取excel文件流的方法
* @param inputStreamSource 获取excel文件流的源对象
* @param 获取excel文件流的源对象的泛型
* @return 总行数
*/
public static long getTotalLineCount(EFunction inputStreamGetFunc, S inputStreamSource) {
Workbook wb;
try {
wb = WorkbookFactory.create(inputStreamGetFunc.apply(inputStreamSource));
} catch (Exception e) {
throw new RuntimeException("文件读取失败", e);
}
return getTotalLineCount(wb);
}
/**
* 读取excel文件总行数
*
* @param inputStream excel的文件流
* @return 总行数
*/
public static long getTotalLineCount(InputStream inputStream) {
Workbook wb;
try {
wb = WorkbookFactory.create(inputStream);
} catch (Exception e) {
throw new RuntimeException("文件读取失败", e);
}
return getTotalLineCount(wb);
}
/**
* 读取excel文件总行数
*
* @param file excel文件
* @return 总行数
*/
public static long getTotalLineCount(File file) {
Workbook wb;
try {
wb = WorkbookFactory.create(file);
} catch (Exception e) {
throw new RuntimeException("文件读取失败", e);
}
return getTotalLineCount(wb);
}
/**
* 读取excel文件总行数
*
* @param wb excel文件
* @return 总行数
*/
private static long getTotalLineCount(Workbook wb) {
long totalLine = 0L;
for (int i = 0; i < wb.getNumberOfSheets(); ++i) {//遍历sheet
Sheet sheet = wb.getSheetAt(i);
int first_row = sheet.getFirstRowNum(), last_row = sheet.getLastRowNum();
totalLine = totalLine + last_row - first_row;
}
try {
wb.close();
} catch (Throwable e) {
logger.error("表格关闭Workbook时发生错误:", e);
}
return totalLine;
}
/**
* 读取excel文件为指定类型的数据列表
*
* @param inputStreamGetFunc 获取excel文件流的方法
* @param inputStreamSource 获取excel文件流的源对象
* @param clazz 指定类型
* @param 获取excel文件流的源对象的泛型
* @param 指定类型泛型
* @return 数据列表
*/
public static List readList(EFunction inputStreamGetFunc, S inputStreamSource, Class clazz) {
Workbook wb;
try {
wb = WorkbookFactory.create(inputStreamGetFunc.apply(inputStreamSource));
} catch (Exception e) {
throw new RuntimeException("文件读取失败", e);
}
return readList(wb, clazz);
}
/**
* 读取excel文件为指定类型的数据列表
*
* @param inputStream excel的文件流
* @param clazz 指定类型
* @param 指定类型泛型
* @return 数据列表
*/
public static List readList(InputStream inputStream, Class clazz) {
Workbook wb;
try {
wb = WorkbookFactory.create(inputStream);
} catch (Exception e) {
throw new RuntimeException("文件读取失败", e);
}
return readList(wb, clazz);
}
/**
* 读取excel文件为指定类型的数据列表
*
* @param file excel文件
* @param clazz 指定类型
* @param 指定类型泛型
* @return 数据列表
*/
public static List readList(File file, Class clazz) {
Workbook wb;
try {
wb = WorkbookFactory.create(file);
} catch (Exception e) {
throw new RuntimeException("文件读取失败", e);
}
return readList(wb, clazz);
}
/**
* 读取excel文件为指定类型的数据列表
*
* @param wb excel工作簿对象
* @param clazz 指定类型
* @param 指定类型泛型
* @return 数据列表
*/
private static List readList(Workbook wb, Class clazz) {
List result = new ArrayList<>();
for (int i = 0; i < wb.getNumberOfSheets(); ++i) {//遍历sheet
ExcelImportSheetItem sheet = new ExcelImportSheetItem<>(wb, wb.getSheetAt(i), clazz);
result.addAll(sheet.readList());
sheet.close();
}
try {
wb.close();
} catch (Throwable e) {
logger.error("表格关闭Workbook时发生错误:", e);
}
return result;
}
/**
* 读取excel文件为指定类型的数据列表,安全模式,会把整个文件读完,并把错误信息返回而不是抛出异常
*
* @param inputStreamGetFunc 获取excel文件流的方法
* @param inputStreamSource 获取excel文件流的源对象
* @param clazz 指定类型
* @param 获取excel文件流的源对象的泛型
* @param 指定类型泛型
* @return 数据列表
*/
public static SafetyResult>> readListSafety(EFunction inputStreamGetFunc, S inputStreamSource, Class clazz) {
return readListSafety(inputStreamGetFunc, inputStreamSource, clazz, null);
}
/**
* 读取excel文件为指定类型的数据列表,安全模式,会把整个文件读完,并把错误信息返回而不是抛出异常
*
* @param inputStream excel的文件流
* @param clazz 指定类型
* @param 指定类型泛型
* @return 数据列表
*/
public static SafetyResult>> readListSafety(InputStream inputStream, Class clazz) {
return readListSafety(inputStream, clazz, null);
}
/**
* 读取excel文件为指定类型的数据列表,安全模式,会把整个文件读完,并把错误信息返回而不是抛出异常
*
* @param file excel文件
* @param clazz 指定类型
* @param 指定类型泛型
* @return 数据列表
*/
public static SafetyResult>> readListSafety(File file, Class clazz) {
return readListSafety(file, clazz, null);
}
/**
* 读取excel文件为指定类型的数据列表,安全模式,会把整个文件读完,并把错误信息返回而不是抛出异常
*
* @param inputStreamGetFunc 获取excel文件流的方法
* @param inputStreamSource 获取excel文件流的源对象
* @param clazz 指定类型
* @param consumer 读取到每一行数据事件的消费者
* @param 获取excel文件流的源对象的泛型
* @param 指定类型泛型
* @return 数据列表
*/
public static SafetyResult>> readListSafety(EFunction inputStreamGetFunc, S inputStreamSource, Class clazz, BiConsumer> consumer) {
SafetyResult>> result = new SafetyResult<>();
result.setData(new ArrayList<>());
Workbook wb;
try {
wb = WorkbookFactory.create(inputStreamGetFunc.apply(inputStreamSource));
} catch (Exception e) {
logger.error("表格安全模式下,根据输入信息读取Workbook对象时发生错误:", e);
result.appendMsg("文件读取失败;" + e.getLocalizedMessage());
result.setReadSuccess(false);
return result;
}
return readListSafety(wb, clazz, consumer, result);
}
/**
* 读取excel文件为指定类型的数据列表,安全模式,会把整个文件读完,并把错误信息返回而不是抛出异常
*
* @param inputStream excel的文件流
* @param clazz 指定类型
* @param consumer 读取到每一行数据事件的消费者
* @param 指定类型泛型
* @return 数据列表
*/
public static SafetyResult>> readListSafety(InputStream inputStream, Class clazz, BiConsumer> consumer) {
SafetyResult>> result = new SafetyResult<>();
result.setData(new ArrayList<>());
Workbook wb;
try {
wb = WorkbookFactory.create(inputStream);
} catch (Exception e) {
logger.error("表格安全模式下,根据输入流读取Workbook对象时发生错误:", e);
result.appendMsg("文件读取失败;" + e.getLocalizedMessage());
result.setReadSuccess(false);
return result;
}
return readListSafety(wb, clazz, consumer, result);
}
/**
* 读取excel文件为指定类型的数据列表,安全模式,会把整个文件读完,并把错误信息返回而不是抛出异常
*
* @param file excel文件
* @param clazz 指定类型
* @param consumer 读取到每一行数据事件的消费者
* @param 指定类型泛型
* @return 数据列表
*/
public static SafetyResult>> readListSafety(File file, Class clazz, BiConsumer> consumer) {
SafetyResult>> result = new SafetyResult<>();
result.setData(new ArrayList<>());
Workbook wb;
try {
wb = WorkbookFactory.create(file);
} catch (Exception e) {
logger.error("表格安全模式下,根据输入文件读取Workbook对象时发生错误:", e);
result.appendMsg("文件读取失败;" + e.getLocalizedMessage());
result.setReadSuccess(false);
return result;
}
return readListSafety(wb, clazz, consumer, result);
}
/**
* 读取excel文件为指定类型的数据列表,安全模式,会把整个文件读完,并把错误信息返回而不是抛出异常
*
* @param wb excel工作簿对象
* @param clazz 指定类型
* @param consumer 读取到每一行数据事件的消费者
* @param 指定类型泛型
* @return 数据列表
*/
private static SafetyResult>> readListSafety(Workbook wb, Class clazz, BiConsumer> consumer, SafetyResult>> result) {
List> sheetItemList = new ArrayList<>();
long totalLine = 0L;
for (int i = 0; i < wb.getNumberOfSheets(); ++i) {//遍历sheet
ExcelImportSheetItem sheet = new ExcelImportSheetItem<>(wb, wb.getSheetAt(i), clazz);
sheetItemList.add(sheet);
totalLine += sheet.lineCount;
}
for (ExcelImportSheetItem sheet : sheetItemList) {
long finalTotalLine = totalLine;
result.getData().addAll(sheet.readListSafety(eSafetyResult -> consumer.accept(finalTotalLine, eSafetyResult)));
sheet.close();
}
try {
wb.close();
} catch (Throwable e) {
logger.error("表格关闭Workbook时发生错误:", e);
}
return result;
}
}