1、首先准备好数据。这里的数据不是直接从数据库中查到的数据而是将查到的数据复制一份,两者的数据互不影响,这样有利于复制之后的数据可以修改。
① 定义一个从数据库中查到的数据的方法(service层的实现类方法),这里省略mapper映射文件和dao层接口的方法
/**
* 参数是实体类,根据参数条件获取所有的数据。forEach方法只是循环遍历获取的元素,可以根据业务需求修改元素的属性值
* /
public List<User> export(User user) {
List<User> userList = userDao.selectAll(user);
userList.stream().forEach(e->{
// 密码回显字符表示
e.setPassword(e.getPassword().replaceAll(e.getPassword(), "******"));
});
return userList;
}
② 定义一个复制数据的方法,方法中可以使用Spring框架提供的BeanUtils包的copyProperties方法来复制对象的属性
/**
* 复制属性的方法
*/
public List<User> queueExcel(User user) {
List<User> userList = export(user);
List<User> exportList = new ArrayList<>();
userList.stream().forEach(e->{
// 定义一个user对象,以供接受对象的属性
User user = new User();
//对象属性复制
BeanUtils.copyProperties(e, user);
exportList.add(user);
});
return exportList;
}
2、准备好了数据,就需要定义好一个方法,方法的内容是:与数据对应的表头;文件Excel导出到response中。
@RequestMapping(value = "/queueExcel",method = RequestMethod.POST)
@ResponseBody
public void queueExcel(@RequestBody User user, HttpServletResponse response){
try{
List<User> exportList = userService.queueExcel(user);
LinkedHashMap<String, String> columnMap = new LinkedHashMap<>();
columnMap.put("userId", "工号");
columnMap.put("username", "用户名");
columnMap.put("realName", "真实姓名");
columnMap.put("password", "用户密码");
columnMap.put("gender", "性别");
//设置导出文件名称
String fileName = "测试.xlsx";
//导出Excel到HttpServletResponse
utils.excel.ExcelUtil.exportExcelToHttpServletResponse(exportList, columnMap, fileName, response);
response.getOutputStream().flush();
} catch (Exception me) {
me.printStackTrace();
}
}
3、上述缺少一个导出Excel文件到HttpServletResponse对象中,这时需要在定义好的包下创建类和方法。
/**
* 导出Excel到HttpServletResponse
*
* @param dataList 数据列表
* @param columnMap 输出列及其中文列名,按顺序输出
* @param fileName 文件名
* @param <T>
*/
public static <T> void exportExcelToHttpServletResponse(List<T> dataList, LinkedHashMap<String, String> columnMap, String fileName, HttpServletResponse response) {
if (null == dataList) {
return;
}
try {
//写到字节输出流
ByteArrayOutputStream byteArrayOutputStream = exportExcelOutputStream(dataList, columnMap);
if (null == byteArrayOutputStream) {
return;
}
//导出文件流到HttpServletResponse
//防止乱码,设置HttpServletResponse编码
response.setCharacterEncoding("utf-8");
response.setContentType("multipart/form-data");
//设置页面禁止缓存
response.setDateHeader("Expires", 0);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
//设置下载文件名
response.setHeader("Content-Disposition", "attachment;filename=" +
new String(fileName.getBytes("gb2312"), "ISO8859-1"));
//文件输出流写入HttpServletResponse
byteArrayOutputStream.writeTo(response.getOutputStream());
} catch (Exception e) {
e.printStackTrace();
}
}
4、好像又缺少了一个写到字节流的方法
/**
* 导出为Excel输出流
*
* @param dataList 数据列表
* @param columnMap 输出列及其中文列名,按顺序输出
* @param <T>
* @return oss文件url
*/
public static <T> ByteArrayOutputStream exportExcelOutputStream(List<T> dataList, LinkedHashMap<String, String> columnMap) {
ByteArrayOutputStream byteArrayOutputStream = null;
if (null == dataList) {
return null;
}
try {
// 通过工具类创建writer,创建xlsx格式
ExcelWriter writer = cn.hutool.poi.excel.ExcelUtil.getWriter(true);
//
if (null != columnMap) {
//设置列标题
for (Map.Entry<String, String> entry : columnMap.entrySet()) {
writer.addHeaderAlias(entry.getKey(), entry.getValue());
}
//根据列标题,筛选过滤数据列
ArrayList<Map<String, Object>> rows = new ArrayList<>();
Map<String, Object> tempMap1 = null;
Map<String, Object> tempMap2 = null;
String column;
for (T data : dataList) {
tempMap1 = BeanUtil.beanToMap(data);
tempMap2 = new LinkedHashMap<>();
for (Map.Entry<String, String> entry : columnMap.entrySet()) {
column = entry.getKey();
tempMap2.put(column, tempMap1.get(column));
}
rows.add(tempMap2);
}
//输出筛选过滤后的数据
writer.write(rows);
} else {
//不过滤列,直接输出数据
writer.write(dataList);
}
//写到字节输出流
byteArrayOutputStream = new ByteArrayOutputStream();
writer.flush(byteArrayOutputStream);
//关闭writer,释放内存
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
//
return byteArrayOutputStream;
}
来源:oschina
链接:https://my.oschina.net/u/4406698/blog/4276799