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封装的很完美,适合小白的我
第五步:使用丝袜哥进行测试
出来的是表格,所以用丝袜哥貌似看不到效果,只能看到200
那就放浏览器上访问接口,来看看结果
直接蹦出来下载文件,下载完成后打开,看看 结果
貌似很完美的导出了表格,这里如果导出几十万条数据,肯定需要考虑压力,这里先不说了,看下后台控制台打印
打印了数字1,也很完美,这里的导出就测试完了,至于导入的话,有兴趣的可以自己测试下玩玩