easypoi官方文档http://easypoi.mydoc.io/

什么是EasyPoi?

easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员
就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板
语言(熟悉的表达式语法),完成以前复杂的写法

Easypoi的目标是什么

Easypoi的目标不是替代poi,而是让一个不懂导入导出的快速使用poi完成Excel和word的各种操作,而不是看很多api才可以完成这样工作

为什么会写Easypoi

以前的以前(岁月真TMD的快)我虽然写了不少代码但还是很少写poi,然后跳到一家公司之后就和业务人员聊上了,来这个需要个报表,这个报表样式是这样的,这个表头是这样的,就这样我写了大量的poi代码,每次都是大量的篇幅,copy to copy,无聊的一逼,然后加入了jeecg,jeecg中有一个小的工具类,虽然我也不知道是谁写的,然是可以用注解搞定最简单的导出,突然豁然开朗,我可以完善,让我从报表的苦海当中脱离出来,这样我花了一周的时间做了第一个版本支持导入导出放到了jeecg,发现还是不错的,慢慢的用的人越来越多,我就把这块独立出来了,再然后有人提出了模板,然后就加入了模板功能,提出了word的需求,加入了word的功能,后来工作忙了虽然没再参与jeecg,但还是一直维持这easypoi的更新,根据见识的增长也不断的重构这代码,直到现在

EasyPoi官网说的很66666666666666666666666666666

事实上,的确6666666666666666666666666666666666

三步完成一个报表的导入导出,你说6不6,费话不多少,直接开怼!

这是一道华丽的分割线-------------------------------------------------------------------------------------------------

第一步:引入依赖

<!--excel操作-->
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-spring-boot-starter</artifactId>
    <version>3.3.0</version>
</dependency>

或者这样子

<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-base</artifactId>
    <version>3.0.3</version>
</dependency>
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-web</artifactId>
    <version>3.0.3</version>
</dependency>
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-annotation</artifactId>
    <version>3.0.3</version>
</dependency>

第二步:编写实体类

@ExcelTarget("20")
@ApiModel
@Data
@TableName(value = "t_assets_info")
public class ExcelAssetsInfoEntity implements Serializable {
	private static final long serialVersionUID = 1L;

    /**
     * 主键
     */
	@ApiModelProperty(value = "主键")
	@Excel(name = "id", width=15)
	private Integer id;
    /**
     * 资产信息名称
     */
	@ApiModelProperty(value = "资产信息名称")
	@Excel(name = "资产信息名称", orderNum = "0", width=30)
	private String assetsName;
    /**
     * 资产型号
     */
	@ApiModelProperty(value = "资产型号")
	@Excel(name = "资产型号", orderNum = "1", width=30)
	private String assetsNumber;
    /**
     * 放置区域
     */
	@ApiModelProperty(value = "放置区域")
	@Excel(name = "放置区域", orderNum = "2", width=30)
	private String assetsSpace;
    /**

这里的orderNum就是表格从左边到右边表格的内容

第三步:编写工具类

import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.web.multipart.MultipartFile;
 
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
 
//Excel导入导出工具类
public class ExcelUtils {
	public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName,
			boolean isCreateHeader, HttpServletResponse response) {
		ExportParams exportParams = new ExportParams(title, sheetName);
		exportParams.setCreateHeadRows(isCreateHeader);
		defaultExport(list, pojoClass, fileName, response, exportParams);
	}
 
	public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName,
			HttpServletResponse response) {
		defaultExport(list, pojoClass, fileName, response, new ExportParams(title, sheetName));
	}
 
	public static void exportExcel(List<Map<String, Object>> list, String fileName, HttpServletResponse response) {
		defaultExport(list, fileName, response);
	}
 
	private static void defaultExport(List<?> list, Class<?> pojoClass, String fileName, HttpServletResponse response,
			ExportParams exportParams) {
		Workbook workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list);
		if (workbook != null)
			;
		downLoadExcel(fileName, response, workbook);
	}
 
	private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) {
		try {
			response.setCharacterEncoding("UTF-8");
			response.setHeader("content-Type", "application/vnd.ms-excel");
			response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
			workbook.write(response.getOutputStream());
		} catch (IOException e) {
			// throw new NormalException(e.getMessage());
		}
	}
 
	private static void defaultExport(List<Map<String, Object>> list, String fileName, HttpServletResponse response) {
		Workbook workbook = ExcelExportUtil.exportExcel(list, ExcelType.HSSF);
		if (workbook != null)
			;
		downLoadExcel(fileName, response, workbook);
	}
 
	public static <T> List<T> importExcel(String filePath, Integer titleRows, Integer headerRows, Class<T> pojoClass) {
		if (StringUtils.isBlank(filePath)) {
			return null;
		}
		ImportParams params = new ImportParams();
		params.setTitleRows(titleRows);
		params.setHeadRows(headerRows);
		List<T> list = null;
		try {
			list = ExcelImportUtil.importExcel(new File(filePath), pojoClass, params);
		} catch (NoSuchElementException e) {
			// throw new NormalException("模板不能为空");
		} catch (Exception e) {
			e.printStackTrace();
			// throw new NormalException(e.getMessage());
		}
		return list;
	}
 
	public static <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows,
			Class<T> pojoClass) {
		if (file == null) {
			return null;
		}
		ImportParams params = new ImportParams();
		params.setTitleRows(titleRows);
		params.setHeadRows(headerRows);
		List<T> list = null;
		try {
			list = ExcelImportUtil.importExcel(file.getInputStream(), pojoClass, params);
		} catch (NoSuchElementException e) {
			// throw new NormalException("excel文件不能为空");
		} catch (Exception e) {
			// throw new NormalException(e.getMessage());
			System.out.println(e.getMessage());
		}
		return list;
	}
 
}

到这里基本就算结束了,写Controller调用就好咯

-----------------------------------华丽的分割线----------------------------------------------

第四步:编写Controller

导出操作

@RestController
@RequestMapping("/excel/export")
@Api(tags = { "资产信息列表导出" })
public class ExcelExportController {

	@Autowired
	private AssetsInfoService assetsInfoService;
 
	@GetMapping("/exportExcel")
	public void export(HttpServletResponse response) {
		System.out.println(1);
		// 模拟从数据库获取需要导出的数据
		List<AssetsInfoEntity> personList = assetsInfoService.findAll();
		// 导出操作
		ExcelUtils.exportExcel(personList, "资产清单", "sheet1", AssetsInfoEntity.class, "资产信息.xls", response);
 
	}
}

导入操作

/**
 * 导入
 *
 * @param file
 */
@RequestMapping(value = "/import", method = RequestMethod.POST)
public ResultView importExcel(@RequestParam("file") MultipartFile file) {
    long start = System.currentTimeMillis();
    List<MonitorPersonImportVo> personVoList = ExcelUtils.importExcel(file, MonitorPersonImportVo.class);
    log.debug(personVoList.toString());
    log.debug("导入excel所花时间:" + (System.currentTimeMillis() - start));
    return getResponse(true, "导入成功");
}

导入导出都是工具类直接调用就好了EasyPoi封装的很完美,适合小白的我

第五步:使用丝袜哥进行测试

spring boot 引入本地jar springboot引入poi_List


出来的是表格,所以用丝袜哥貌似看不到效果,只能看到200

那就放浏览器上访问接口,来看看结果

spring boot 引入本地jar springboot引入poi_导入导出_02


直接蹦出来下载文件,下载完成后打开,看看 结果

spring boot 引入本地jar springboot引入poi_List_03


貌似很完美的导出了表格,这里如果导出几十万条数据,肯定需要考虑压力,这里先不说了,看下后台控制台打印

spring boot 引入本地jar springboot引入poi_java_04

打印了数字1,也很完美,这里的导出就测试完了,至于导入的话,有兴趣的可以自己测试下玩玩