大家好,欢迎来到IT知识分享网。
现阶段业务需求有一个导出功能,使用EasyExcel实现导出操作,因为以前的接口中返回的内容很多都不是用实体类封装的,自己开发一个工具类使用,整篇文章先将整个工具类及其需要的实体类放出,结尾有相应的使用方法
参考内容:https://alibaba-easyexcel.github.io/index.html EasyExcel官方示例
https://www.yuque.com/easyexcel/doc/easyexcel 新版官方示例
〇:工具类内容
1、定义两个实体类
自行自动生成get,set方法,这里就不放出来了
public class NoModelWriteData implements Serializable {
private String fileName;//文件名
private String[] headMap;//表头数组
private String[] dataStrMap;//对应数据字段数组
private List<Map<String, Object>> dataList;//数据集合
}
public class SimpleWriteData implements Serializable {
private String fileName;//文件名
private List<?> dataList;//数据列表
}
2、添加工具类内容
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.fastjson.JSON;
import com.google.common.net.HttpHeaders;
import com.roc.common.model.NoModelWriteData;
import com.roc.common.model.SimpleWriteData;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.web.bind.annotation.RequestBody;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.*;
public class EasyExcelUtils {
//不创建对象的导出
public void noModleWrite(@RequestBody NoModelWriteData data, HttpServletResponse response) throws IOException {
// 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
try {
// response.setContentType("application/vnd.ms-excel");
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
String fileName = URLEncoder.encode(data.getFileName(), "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
// 这里需要设置不关闭流
EasyExcel.write(response.getOutputStream()).head(head(data.getHeadMap())).sheet(data.getFileName()).doWrite(dataList(data.getDataList(), data.getDataStrMap()));
} catch (Exception e) {
// 重置response
response.reset();
response.setContentType("application/json");
response.setCharacterEncoding("utf-8");
Map<String, String> map = new HashMap<String, String>();
map.put("status", "failure");
map.put("message", "下载文件失败" + e.getMessage());
response.getWriter().println(JSON.toJSONString(map));
}
}
//创建对象的导出
public <T> void simpleWrite(@RequestBody SimpleWriteData data,Class<T> clazz, HttpServletResponse response) throws IOException {
// 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
// response.setContentType("application/vnd.ms-excel");
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
String fileName = URLEncoder.encode(data.getFileName(), "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
EasyExcel.write(response.getOutputStream(), clazz).sheet(data.getFileName()).doWrite(data.getDataList());
}
//设置表头
private List<List<String>> head(String[] headMap) {
List<List<String>> list = new ArrayList<List<String>>();
for (String head : headMap) {
List<String> headList = new ArrayList<String>();
headList.add(head);
list.add(headList);
}
return list;
}
//设置导出的数据内容
private List<List<Object>> dataList(List<Map<String, Object>> dataList, String[] dataStrMap) {
List<List<Object>> list = new ArrayList<List<Object>>();
for (Map<String, Object> map : dataList) {
List<Object> data = new ArrayList<Object>();
for (int i = 0; i < dataStrMap.length; i++) {
data.add(map.get(dataStrMap[i]));
}
list.add(data);
}
return list;
}
}
一:不使用实体类导出
这里只针对接口返回的List<Map<String,Object>>类型数据做后续操作,跟随文章的步骤操作即可
1、查询数据
如图获取了List<Map<String, Object>>类型的数据
2、定义数组
headMap数组定义的是导出文件表头标题的内容,要按顺序定义
dataStrMap数据定义的是标题对应的字段名(一定要按顺序对应)
String[] headMap = {
"类型", "房号", "账单单号", "账单生成时间", "计算金额", "优惠金额", "违约金", "应收金额", "录入人", "账单状态"};
String[] dataStrMap = {
"orderClassStr", "houseAddress", "payNo", "createDate", "sumCalAmount", "sumPValue", "sumBreachValue", "sumActualAmount", "creatorName", "payStateStr"};
3、将数据放入工具类方法的实体类中
NoModelWriteData d = new NoModelWriteData();
d.setFileName("账单流水");
d.setHeadMap(headMap);
d.setDataStrMap(dataStrMap);
d.setDataList(list);
EasyExcelUtils easyExcelUtils = new EasyExcelUtils();
easyExcelUtils.noModleWrite(d, response);
二:使用实体类导出
1、定义数据实体类
自行自动生成get,set方法,这里就不放出来了
实体类中的注解可以根据自己的需求使用,更多注解可查看文章开头的官方示例文档
@Data
public class PayInfoBillListExportDto implements Serializable {
@ExcelProperty("类型")
private String orderClassStr;
@ExcelProperty("房号")
private String houseAddress;
@ExcelProperty("账单单号")
private String payNo;
@ExcelProperty("账单生辰时间")
private String createDate;
@ExcelProperty("计算金额")
private BigDecimal sumCalAmount;
@ExcelProperty("优惠金额")
private BigDecimal sumPValue;
@ExcelProperty("违约金")
private BigDecimal sumBreachValue;
@ExcelProperty("应收金额")
private BigDecimal sumActualAmount;
@ExcelProperty("录入人")
private String creatorName;
@ExcelProperty("账单状态")
private String payStateStr;
// @ExcelIgnore 此注解表示忽略这个字段
// @DateTimeFormat("yyyy年MM月dd日HH时mm分ss秒") 时间格式化注解
// @NumberFormat("#.##%") 百分比表示
// @ColumnWidth(50) 设置单元格宽度为50
// @ExcelProperty(value = "标题", index = 0) 第0列为标题列
}
1、查询数据
2、将数据放入工具类方法的实体类中
SimpleWriteData d = new SimpleWriteData();
d.setFileName("账单流水");
d.setDataList(list);
EasyExcelUtils easyExcelUtils = new EasyExcelUtils();
easyExcelUtils.simpleWrite(d,PayInfoBillListExportDto.class,response);
结尾
此工具类只针对这两种数据进行封装,如有bug或修改建议欢迎留言讨论
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/21974.html