easyExcel封装,读取和写入数据
easyexcel
快速、简洁、解决大文件内存溢出的java处理Excel工具
项目地址:https://gitcode.com/gh_mirrors/ea/easyexcel
免费下载资源
·
1.先创建要读取Excel的对象类。
①继承BaseRowModel
②每个字段上面添加@ExcelProperty , index是列的索引值,value是列名。
注意:如果只添加index不添加value,可以运行。如果只添加value,不添加index不能运行。
@Data
@ToString
@Slf4j
public class TianMaWarehouseOrderInfo extends BaseRowModel {
@ExcelProperty(value = "订单ID",index = 0)
private String orderId;
@ExcelProperty(value = "配货ID",index = 1)
private String pickId;
@ExcelProperty(value = "配货仓",index = 2)
private String pickWareHouse;
@ExcelProperty(value = "货号",index = 3)
private String articleNo;
}
2.封装 解析监听类 (也可以不封装,直接继承AnalysisEventListener 方法)。
public abstract class BaseExcelListener<T> extends AnalysisEventListener {
private List<T> datas = new ArrayList<T>();
public List<T> getDatas() {
return datas;
}
public void setDatas(List<T> datas) {
this.datas = datas;
}
/**
* 在添加到List集合之前(数据过滤,格式转换等)
* @param object 一行数据
*/
abstract boolean addListBefore(T object);
/**
* 在添加到List集合之后(添加数据库,缓存等)
* @param object 一行数据
*/
abstract void doListAfter(T object);
/**
* 执行类
* @param o 一行数据
* @param analysisContext ~
*/
@Override
public void invoke(Object o, AnalysisContext analysisContext) {
T t = (T)o;
boolean flag= addListBefore(t);
//满足条件的数据, 数据存储到list,供批量处理。
if(flag){
datas.add(t);
doListAfter(t);
}
}
/**
* 最后。做一些资源销毁
* @param analysisContext ~
*/
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {}
}
3.继承封装好的监听类,
@Log
public class LocalWareExcelListener<T> extends BaseExcelListener<T> {
@Override
boolean addListBefore(T object) {
log.info("添加数据之前的操作~如果想过滤某条数据,在满足某个条件下,返回false");
return true;
}
@Override
void doListAfter(T object) {
log.info("添加数据之后的操作~");
}
}
4. Utils工具类
@Slf4j
public class ExcelUtils {
/**
*
* @param is 输入文件的流对象
* @param clazz 每行数据转换成的对象类
* @param sheetNo 第几个sheet
* @param excelListener excel的监听类
* @return 是否成功,如果成功可以再监听类里面取数据
*/
public static Boolean readExcel(InputStream is, Class<? extends BaseRowModel> clazz,int sheetNo,AnalysisEventListener excelListener){
BufferedInputStream bis = null;
try {
bis = new BufferedInputStream(is);
// 解析每行结果在listener中处理
ExcelReader excelReader = EasyExcelFactory.getReader(bis, excelListener);
excelReader.read(new Sheet(sheetNo, 1, clazz));
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return true;
}
/**
*
* @param os 文件输出流
* @param clazz Excel实体映射类
* @param data 导出数据
* @return
*/
public static Boolean writeExcel(OutputStream os, Class<? extends BaseRowModel> clazz, List<? extends BaseRowModel> data,int seetNo){
BufferedOutputStream bos= null;
try {
bos = new BufferedOutputStream(os);
ExcelWriter writer = new ExcelWriter(bos, ExcelTypeEnum.XLSX);
//写第一个sheet, sheet1 数据全是List<String> 无模型映射关系
Sheet sheet1 = new Sheet(seetNo, 0,clazz);
writer.write(data, sheet1);
writer.finish();
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
if (bos != null) {
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return true;
}
}
5.测试
public static void main(String[] args) {
//1.读取Excel
FileInputStream fis = null;
try {
fis = new FileInputStream("D:\\1.xlsx");
LocalWareExcelListener<LocalWareDTO> localWareExcelListener = new LocalWareExcelListener<>();
Boolean flag = ExcelUtils.readExcel(fis, LocalWareDTO.class,2,localWareExcelListener);
List<LocalWareDTO> datas = localWareExcelListener.getDatas();
if(flag){
log.info("解析数据行数为:{}",datas.size());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//2.写入Excel
FileOutputStream fos = null;
try {
fos = new FileOutputStream("D:\\export.xlsx");
//FileOutputStream fos, Class clazz, List<? extends BaseRowModel> data
List<LocalWareDTO> list = new ArrayList<>();
for (int i = 0; i < 5; i++){
LocalWareDTO excelEntity = new LocalWareDTO();
excelEntity.setArticleNo("qqwqq123");
excelEntity.setExpressNo("12321234223");
excelEntity.setInventoryAmount("234234223");
excelEntity.setMyjoId("1232123424233");
list.add(excelEntity);
}
Boolean flag = ExcelUtils.writeExcel(fos,LocalWareDTO.class,list,1);
System.out.println("导出是否成功:"+flag);
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
if (fos != null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
GitHub 加速计划 / ea / easyexcel
31.64 K
7.47 K
下载
快速、简洁、解决大文件内存溢出的java处理Excel工具
最近提交(Master分支:3 个月前 )
c42183df
Bugfix 3 个月前
efa7dff6 * 重新加回 `commons-io`
3 个月前
更多推荐
已为社区贡献3条内容
所有评论(0)