以下所有方法本人都亲测有效,如需转载,请标明出处。
文档学习 EasyPoi教程
因为文档已经写的非常详细,基本上不需要我过多的解释,就放一个简单的demo,演示一下超好用的easypoi工具的入门使用。
本人基于Spring boot + Maven实现demo,所以直接上pom文件,需要jar包的同学可自行去maven仓库下载
pom依赖
<dependency>
<groupId>cn.afterturngroupId>
<artifactId>easypoi-baseartifactId>
<version>3.1.0version>
dependency>
<dependency>
<groupId>cn.afterturngroupId>
<artifactId>easypoi-webartifactId>
<version>3.1.0version>
dependency>
<dependency>
<groupId>cn.afterturngroupId>
<artifactId>easypoi-annotationartifactId>
<version>3.1.0version>
dependency>。
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>1.16.20version>
<scope>providedscope>
dependency>
导入对象
package zero.excel.domain;
import cn.afterturn.easypoi.excel.annotation.Excel;
import lombok.Data;
import java.util.Date;
/**
* @author Zero
* @date 2018/11/8
*/
@Data
public class ExcelImport {
@Excel(name = "测试标题")
private String title;
//可以自动替换excel中内容
@Excel(name = "中英文类型", replace = {"中文_CN", "英文_EN"})
private String type;
@Excel(name = "日期")
private Date date;
}
导出对象
package zero.excel.domain;
import cn.afterturn.easypoi.excel.annotation.Excel;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.Date;
/**
* @author Zero
* @date 2018/11/9
*/
@Data
@AllArgsConstructor
public class ExcelExport {
@Excel(name = "测试标题")
private String title;
//可以自动替换excel中内容
@Excel(name = "中英文类型", replace = {"中文_CN", "英文_EN"})
private String type;
@Excel(name = "日期", format = "yyyy-MM-dd HH:mm:ss")
private Date date;
}
Controller
package zero.excel.controller;
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.poi.ss.usermodel.Workbook;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import zero.excel.domain.ExcelExport;
import zero.excel.domain.ExcelImport;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
/**
* @author Zero
* @date 2018/11/8
*/
@RestController
@RequestMapping("/excelReader")
public class ExcelDemoController {
/**
* excel导入
*
* @param file 导入文件
* @return excel对象数组
*/
@PostMapping(value = "/excelImport")
public Object importExcel(@RequestParam("file") MultipartFile file) {
//接收导入数组
List<ExcelImport> excelImportList = null;
try {
excelImportList = ExcelImportUtil.importExcel(file.getInputStream(), ExcelImport.class, new ImportParams());
} catch (Exception e) {
e.printStackTrace();
}
return excelImportList;
}
/**
* excel 下载
*
* @param response response只能使用一次
*/
@RequestMapping(value = "/excelExport")
public void exportExcel(HttpServletResponse response) {
//mock 下载导出测试数据
ExcelExport export1 = new ExcelExport("测试1", "CN", new Date());
ExcelExport export2 = new ExcelExport("测试2", "EN", new Date());
List<ExcelExport> list = new ArrayList<>();
list.add(export1);
list.add(export2);
//参数配置
ExportParams params = new ExportParams();
//此处设置ExcelType HSSF为excel2003版本,XSSF为excel2007版本
params.setType(ExcelType.XSSF);
Workbook workbook = ExcelExportUtil.exportExcel(params, ExcelExport.class, list);
ExcelUtil.downloadExcel(response, workbook, "excel-export");
}
工具类
package zero.excel.util;
import org.apache.poi.ss.usermodel.Workbook;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.util.UUID;
/**
* @author Zero
* @date 2018/11/9
*/
public class ExcelUtil {
/**
* 下载通用配置
*
* @param response HttpServletResponse
* @param workbook Workbook
* @param excelName excelName
*/
public static void downloadExcel(HttpServletResponse response, Workbook workbook, String excelName) {
try (OutputStream os = response.getOutputStream()) {
response.reset();
if (excelName == null) {
excelName = UUID.randomUUID().toString();
}
response.setHeader("Content-Type", "application/vnd.ms-excel");
response.setHeader("Content-Disposition", "inline; filename=" + new String(excelName.getBytes("gb18030"), "ISO8859-1") + ".xlsx");
workbook.write(os);
os.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
[
{
"title": "测试1",
"type": "CN",
"date": "2018-11-9"
},
{
"title": "测试2",
"type": "EN",
"date": "Fri Nov 09 00:00:00 CST 2018"
}
]
以上内容就是easypoi的简单使用
--------------------------------------------------华丽的分割线--------------------------------------------------------------
简单补充easypoi工具的注解变种:
基于List 的导出,ExcelExportEntity是注解经过处理翻译成的实体类,两者几乎是一对的,所以如果我们要动态自定义导出列,我们只要动态拼装ExcelExportEntity就可以了
再整合上反射的方式,动态获取前端传入的对象 ExcelExportJudgementConditionQO 里面存放布尔类型属性,作为导出依据。
List<ExcelExportEntity> entityList = new ArrayList<>();
Class judgementClass = ExcelExportJudgementConditionQO.class;
Field[] judgementFields = PoiPublicUtil.getClassFields(judgementClass);
for (Field f:judgementFields){
try {
f.setAccessible(true);
//在此判断,是否需要导出
boolean flag = Boolean.parseBoolean(f.get(excelExportJudgementConditionQO).toString());
if (flag) {
//将需要导出的列放入导出实体对象中
Excel excel = f.getAnnotation(Excel.class);
if (excel != null) {
entityList.add(ExcelExportEntityUtil.createEntity(goodsDetailsInfoClass, excel.name(), f.getName()));
}
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
ExportParams params = new ExportParams();
params.setType(ExcelType.XSSF);
//goodsInfoList为具体导出的对象数组,将需要导出的全量属性(对应excel列名)都加@Excel注解,通过ExcelExportJudgementConditionQO控制具体需要导出哪些列。
Workbook workbook = ExcelExportUtil.exportExcel(params, entityList, goodsInfoList);
ExcelFileUtil.downloadExcel(response, workbook);
因为按时间顺序写的文章,就没放在 方法一 的分类中。方法一 中介绍的方法是提前写好注解,明确知道导出具体的列。而20190110补充的是,假设导出列全量已知,但用户可以选择自己想要的列进行导出的情景。由于注解是在服务启动时就加载的,无法在启动后动态去增加或删除注解(反射可以改变注解的值,但是无法新增和删除一个注解),所以如果不确定需要导出哪些列的话,是无法动态去增减注解的。而用了List
--------------------------------------------------华丽的分割线--------------------------------------------------------------
文笔不好,望见谅! ^ _ ^
如有任何问题或者意见,欢迎留言交流。
下一篇:java对excel导入和导出处理的几种方法(二)使用自己封装的工具类