Excel解析easyexcel工具类

easyexcel解决POI解析Excel出现OOM

        <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>1.1.1</version>
</dependency>

1、ExcelModel——Java模型映射

package com.xinyartech.erp.system.model;

import java.io.Serializable;

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.metadata.BaseRowModel; import lombok.Data; /**
*
*
* @author Lynch
*/
@SuppressWarnings("serial")
@Data
public class ExcelModel extends BaseRowModel implements Serializable{
@ExcelProperty(value = "姓名" ,index = 0)
private String name; @ExcelProperty(value = "年龄",index = 1)
private String age; @ExcelProperty(value = "邮箱",index = 2)
private String email; @ExcelProperty(value = "地址",index = 3)
private String address; @ExcelProperty(value = "性别",index = 4)
private String sax; @ExcelProperty(value = "高度",index = 5)
private String heigh; @ExcelProperty(value = "备注",index = 6)
private String last; }

2、EasyExcelUtil——easyexcel工具类 -- Excel解析

package com.xinyartech.erp.core.util;

import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List; import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.metadata.BaseRowModel;
import com.alibaba.excel.metadata.Sheet;
import com.alibaba.excel.metadata.Table;
import com.alibaba.excel.support.ExcelTypeEnum; /**
* easyexcel工具类 -- Excel解析
*
* @author Lynch
*/
public class EasyExcelUtil {
/**
* StringList 解析监听器
*/
private static class StringExcelListener extends AnalysisEventListener {
/**
* 自定义用于暂时存储data
* 可以通过实例获取该值
*/
private List<List<String>> datas = new ArrayList<>(); /**
* 每解析一行都会回调invoke()方法
*
* @param object
* @param context
*/
@Override
public void invoke(Object object, AnalysisContext context) {
List<String> stringList= (List<String>) object;
//数据存储到list,供批量处理,或后续自己业务逻辑处理。
datas.add(stringList);
//根据自己业务做处理
} @Override
public void doAfterAllAnalysed(AnalysisContext context) {
//解析结束销毁不用的资源
//注意不要调用datas.clear(),否则getDatas为null
} public List<List<String>> getDatas() {
return datas;
}
public void setDatas(List<List<String>> datas) {
this.datas = datas;
}
} /**
* 使用 StringList 来读取Excel
* @param inputStream Excel的输入流
* @param excelTypeEnum Excel的格式(XLS或XLSX)
* @return 返回 StringList 的列表
*/
public static List<List<String>> readExcelWithStringList(InputStream inputStream,ExcelTypeEnum excelTypeEnum) {
StringExcelListener listener = new StringExcelListener();
ExcelReader excelReader = new ExcelReader(inputStream, excelTypeEnum, null, listener);
excelReader.read();
return listener.getDatas();
} /**
* 使用 StringList 来写入Excel
* @param outputStream Excel的输出流
* @param data 要写入的以StringList为单位的数据
* @param table 配置Excel的表的属性
* @param excelTypeEnum Excel的格式(XLS或XLSX)
*/
public static void writeExcelWithStringList(OutputStream outputStream, List<List<String>> data, Table table,ExcelTypeEnum excelTypeEnum) {
//这里指定不需要表头,因为String通常表头已被包含在data里
ExcelWriter writer = new ExcelWriter(outputStream, excelTypeEnum,false);
//写第一个sheet, sheet1 数据全是List<String> 无模型映射关系,无表头
Sheet sheet1 = new Sheet(0, 0);
writer.write0(data, sheet1,table);
writer.finish();
} /**
* 模型解析监听器 -- 每解析一行会回调invoke()方法,整个excel解析结束会执行doAfterAllAnalysed()方法
*/
private static class ModelExcelListener<E> extends AnalysisEventListener<E> {
private List<E> dataList = new ArrayList<E>(); @Override
public void invoke(E object, AnalysisContext context) {
dataList.add(object);
} @Override
public void doAfterAllAnalysed(AnalysisContext context) {
} public List<E> getDataList() {
return dataList;
} @SuppressWarnings("unused")
public void setDataList(List<E> dataList) {
this.dataList = dataList;
}
} /**
* 使用 模型 来读取Excel
*
* @param inputStream Excel的输入流
* @param clazz 模型的类
* @param excelTypeEnum Excel的格式(XLS或XLSX)
*
* @return 返回 模型 的列表
*/
public static <E> List<E> readExcelWithModel(InputStream inputStream, Class<? extends BaseRowModel> clazz, ExcelTypeEnum excelTypeEnum) {
// 解析每行结果在listener中处理
ModelExcelListener<E> listener = new ModelExcelListener<E>();
ExcelReader excelReader = new ExcelReader(inputStream, excelTypeEnum, null, listener);
//默认只有一列表头
excelReader.read(new Sheet(1, 1, clazz)); return listener.getDataList();
} /**
* 使用 模型 来写入Excel
*
* @param outputStream Excel的输出流
* @param data 要写入的以 模型 为单位的数据
* @param table 配置Excel的表的属性
* @param clazz 模型的类
* @param excelTypeEnum Excel的格式(XLS或XLSX)
*/
public static void writeExcelWithModel(OutputStream outputStream, List<? extends BaseRowModel> data,
Class<? extends BaseRowModel> clazz, ExcelTypeEnum excelTypeEnum) {
//这里指定需要表头,因为model通常包含表头信息
ExcelWriter writer = new ExcelWriter(outputStream, excelTypeEnum,true);
//写第一个sheet, sheet1 数据全是List<String> 无模型映射关系
Sheet sheet1 = new Sheet(1, 0, clazz);
writer.write(data, sheet1);
writer.finish();
} }

3、EasyExcelTest测试类

package com.xinyartech.erp.system.service;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List; import com.alibaba.excel.support.ExcelTypeEnum;
import com.xinyartech.erp.core.util.EasyExcelUtil;
import com.xinyartech.erp.system.model.ExcelModel; /**
* 单元测试
*
* @author Lynch
*/
public class EasyExcelTest {
public static void main(String[] args) throws Exception {
writeExcel();
readExcel();
} /**
* 写入Excel
*
* @throws FileNotFoundException
* @author Lynch
*/
private static void writeExcel() throws FileNotFoundException {
List<ExcelModel> excelModelList = new ArrayList<>();
for (int i = 0; i < 1000000; i++) {
ExcelModel excelModel = new ExcelModel();
excelModel.setAddress("address" + i);
excelModel.setAge(i + "");
excelModel.setEmail("email" + i);
excelModel.setHeigh("heigh" + i);
excelModel.setLast("last" + i);
excelModel.setName("name" + i);
excelModel.setSax("sax" + i);
excelModelList.add(excelModel);
} long beginTime = System.currentTimeMillis();
OutputStream out = new FileOutputStream("D:/aaa.xlsx");
EasyExcelUtil.writeExcelWithModel(out, excelModelList, ExcelModel.class, ExcelTypeEnum.XLSX);
long endTime = System.currentTimeMillis();
System.out.println(String.format("总共耗时 %s 毫秒", (endTime - beginTime))); excelModelList = null;
} /**
* 读取Excel
*
* @throws FileNotFoundException
* @author Lynch
*/
private static void readExcel() throws FileNotFoundException {
try {
InputStream inputStream=new FileInputStream("D:/aaa.xlsx");
//读入文件,每一行对应一个 Model,获取 Model 列表
List<ExcelModel> objectList = EasyExcelUtil.readExcelWithModel(inputStream, ExcelModel.class, ExcelTypeEnum.XLSX);
for(ExcelModel excelModel: objectList) {
System.out.println(excelModel);
}
} catch (IOException e) {
e.printStackTrace();
}
} }

4、springMVC+easypoi做excel的导入导出

package com.xinyartech.erp.system.web;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List; import javax.servlet.http.HttpServletResponse; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile; import com.alibaba.excel.support.ExcelTypeEnum;
import com.xinyartech.erp.core.base.BaseUserController;
import com.xinyartech.erp.core.base.ResponseWrapper;
import com.xinyartech.erp.core.util.EasyExcelUtil;
import com.xinyartech.erp.system.model.ExcelModel;
import com.xinyartech.erp.system.model.SysUser;
import com.xinyartech.erp.system.service.UserService; @Controller
@RequestMapping("/api/hello")
public class HelloWorldController extends BaseUserController<UserService, SysUser> {
private static final Logger log = LogManager.getLogger(HelloWorldController.class); @Autowired
protected HttpServletResponse response;
/**
* 导入Excel
*
* @param file
* @author Lynch
*/
@RequestMapping(value = "/importExcel", method = RequestMethod.POST)
@ResponseBody
public ResponseWrapper<?> importExcel(@RequestParam(value = "uploadFile", required = false) MultipartFile file) {
try {
List<ExcelModel> excelModelList = EasyExcelUtil.readExcelWithModel(file.getInputStream(), ExcelModel.class, ExcelTypeEnum.XLSX);
return ResponseWrapper.ok(excelModelList);
} catch (IOException e) {
log.error("Excel导入失败", e);
} return ResponseWrapper.ok();
} /**
* 导出Excel
*
* @param response
* @author Lynch
*/
@RequestMapping(value="/writeExcel")
  @ResponseBody
public ResponseWrapper<String>writeExcel(HttpServletResponse response){
//初始化模拟数据
List<ExcelModel> excelModelList = new ArrayList<>();
for (int i = 0; i < 700; i++) {
ExcelModel excelModel = new ExcelModel();
excelModel.setAddress("address" + i);
excelModel.setAge(i + "");
excelModel.setEmail("email" + i);
excelModel.setHeigh("heigh" + i);
excelModel.setLast("last" + i);
excelModel.setName("name" + i);
excelModel.setSax("sax" + i);
excelModelList.add(excelModel);
} return writeExcel("abc", excelModelList);
} /**
* 导出Excel工具类
*
* @param fileName 导出文件名,不填默认"abbot.xlsx"
* @param data 导出数据
* @author Lynch
*/
protected ResponseWrapper<String> writeExcel(String fileName, List<? extends BaseRowModel> data) {
try {
if(CollectionUtils.isEmpty(data)) {
log.warn("Excel导出数据为空");
return ResponseWrapper.ok(SystemEnum.ERROR_COLLECTION_EMPTY, "Excel导出数据为空");
} if(StringUtils.isEmpty(fileName)) {
fileName = "abbot.xlsx";
} String filename = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);
response.setHeader("Content-disposition", String.format("attachment; filename=%s.xlsx", filename)); // 将文件输出
EasyExcelUtil.writeExcelWithModel(response.getOutputStream(), data, data.get(0).getClass(), ExcelTypeEnum.XLSX);
data = null;
} catch (Exception e) {
log.error("Excel导出失败", e);
return ResponseWrapper.error("Excel导出失败");
} return ResponseWrapper.ok();
} }

Excel解析easyexcel工具类的更多相关文章

  1. ExcelParser ,Excel解析的工具类(正对解析xlsx)

    package cn.com.css.common.util; import java.io.File; import java.io.FileInputStream; import java.io. ...

  2. 一个基于POI的通用excel导入导出工具类的简单实现及使用方法

    前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...

  3. Workbook导出excel封装的工具类

    在实际中导出excel非常常见,于是自己封装了一个导出数据到excel的工具类,先附上代码,最后会写出实例和解释.支持03和07两个版本的 excel. HSSF导出的是xls的excel,XSSF导 ...

  4. Java基础学习总结(49)——Excel导入导出工具类

    在项目的pom文件中引入 <dependency> <groupId>net.sourceforge.jexcelapi</groupId> <artifac ...

  5. flink---实时项目--day02-----1. 解析参数工具类 2. Flink工具类封装 3. 日志采集架构图 4. 测流输出 5. 将kafka中数据写入HDFS 6 KafkaProducer的使用 7 练习

    1. 解析参数工具类(ParameterTool) 该类提供了从不同数据源读取和解析程序参数的简单实用方法,其解析args时,只能支持单只参数. 用来解析main方法传入参数的工具类 public c ...

  6. 【原创】POI操作Excel导入导出工具类ExcelUtil

    关于本类线程安全性的解释: 多数工具方法不涉及共享变量问题,至于添加合并单元格方法addMergeArea,使用ThreadLocal变量存储合并数据,ThreadLocal内部借用Thread.Th ...

  7. android 解析XML 工具类

    /** * Created by John on 2016/3/29. */ public class XmlParser { private static final String ns = nul ...

  8. 导入导出Excel的Java工具类ExcelUtil

    在编写ExcelUtil之前,在网上查了一些资料.java中用来处理Excel的第三方开源项目主要就是POI和JXL.poi功能强大,但是比较耗资源,对于大数据量的导入导出性能不是太好:jxl功能简单 ...

  9. java 写一个JSON解析的工具类

    上面是一个标准的json的响应内容截图,第一个红圈”per_page”是一个json对象,我们可以根据”per_page”来找到对应值是3,而第二个红圈“data”是一个JSON数组,而不是对象,不能 ...

随机推荐

  1. TP实例化模型的两种方式 M() D()

    TP框架中实例化模型的两种方式 #如果使用自己自定义的函数,那么就用D $mode=D('model'); #如果使用是系统自带的函数,那么就是用M $model=M('model');

  2. JavaWeb学习总结第二篇--第一个JavaWeb程序

    JavaWeb学习总结第二篇—第一个JavaWeb程序 最近我在学院工作室学习并加入到研究生的项目中,在学长学姐的带领下,进入项目实践中,为该项目实现一个框架(用已有框架进行改写).于是我在这里记录下 ...

  3. memcached 搭建

     linux 下memcached 的搭建 memcached 下载地址:http://www.danga.com/memcached/dist/ libevent 下载地址:http://libev ...

  4. JS基础知识再整理..........不断更新中

    1.JS的五种基本数据类型:字符串.数值.布尔.null.underfined. 2.在JS中,字符串.数值.布尔三种数据类型,有其属性和方法: 3.字符串的三种常用方法[.indexof()..su ...

  5. Project Structure 讲解(转)

    项目的左侧面板 项目设置->Project Project Settings -> Modules Sources面板 Paths面板 dependencies面板 Project Set ...

  6. 怎么利用Aspose.Cells 获取excel 数据表中sheet的名称

    说明:开发环境 vs2012 asp.net mvc4 c# 利用Aspose.Cells 获取Excel数据表的sheet的名称,并把获取的名称赋值给easyUI 的combobox 1.运行效果 ...

  7. svn服务的安装和使用

    更新linux软件库 cat /etc/redhat-release wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.c ...

  8. Cocos2d-X开发中国象棋《九》走棋规则

    在上一节中实现了走棋,这篇博客将介绍中国象棋中的走棋规则 在写博客前先可能一下象棋的走棋规则: 1)将 将的坐标关系:横坐标相等,纵坐标相减绝对值等于1,或者纵坐标相等,横坐标相减绝对值等于1 将的特 ...

  9. LeetCode:跳跃游戏【55】

    LeetCode:跳跃游戏[55] 题目描述 给定一个非负整数数组,你最初位于数组的第一个位置.数组中的每个元素代表你在该位置可以跳跃的最大长度.判断你是否能够到达最后一个位置. 示例 1: 输入: ...

  10. Google IO 2019 Android 太长不看版

    Google I/O 2019, 这里有个playlist是所有Android开发相关的session视频合集: Android & Play at Google I/O 2019 当然啦每个 ...