本功能主要是实现文件的导出,但是有些导出文件格式可能比较复杂,用代码编写比较繁琐,所以,可以事先做好模板,直接读取模板,将数据填充进去即可。
注意点:
项目是直接读取的jar包,没有解压出来,所以,获取文件的时候,不能用file来获取,只能用文件流的形式。
项目是直接读取的jar包,没有解压出来,所以,获取文件的时候,不能用file来获取,只能用文件流的形式。
项目是直接读取的jar包,没有解压出来,所以,获取文件的时候,不能用file来获取,只能用文件流的形式。
整体代码如下:
Controller层:主要是获取workBook,其他是为了兼容浏览器;
/**
* 导出
*/
@GetMapping("/export")
public String export(EquipmentCloudEyeInfo entity, HttpServletRequest request, HttpServletResponse response) {
String userAgent = "";
OutputStream outputStream = null;
try {
String fileName = "模板名称.xlsx";
try {
//客户端浏览器标识
userAgent = request.getHeader("USER-AGENT");
} catch (Exception e) {
log.error(e.getMessage());
}
// 兼容火狐下载
if (StringUtils.isNotEmpty(userAgent) && StringUtils.contains(userAgent, "Firefox")) {
fileName = "=?UTF-8?B?" + (new String(Base64.encodeBase64(fileName.getBytes("UTF-8")))) + "?=";
} else {
fileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString());
}
response.setHeader("Content-disposition", "attachment; filename=" + fileName);
outputStream = response.getOutputStream();
response.setContentType("application/octet-stream");
Workbook workbook = service.export(entity);
workbook.write(outputStream);
outputStream.flush();
return TableUtil.tojson(CodeEnumType.SUCCESS);
} catch (IOException e) {
e.printStackTrace();
return TableUtil.tojson(CodeEnumType.FAILURE);
} finally {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Service层:核心代码;
@Override
public Workbook export(EquipmentCloudEyeInfo entity) throws IOException {
//获取模板路径;我的文件是直接放在classes下,根据自己的情况适当修改;
URL filePath = this.getClass().getClassLoader().getResource("模板名称.xlsx");
LOGGER.info("模板地址为:"+filePath);
//这种写法更通用,可以直接读取jar包里的文件流;
XSSFWorkbook workbook = new XSSFWorkbook(filePath.openStream());
XSSFSheet sheet = workbook.getSheetAt(0);
//获取导出列表;
List<EquipmentCloudEyeInfo> list = this.list(entity);
//
for (int i = 0; i < list.size(); i++) {
EquipmentCloudEyeInfo info = list.get(i);
XSSFRow row = sheet.createRow(i + 1);
String equipmentId = info.getEquipmentId();
XSSFCell cell = row.createCell(0);
cell.setCellValue(equipmentId);
String serialNumber = info.getEquipmentSerialNumber();
XSSFCell cell1 = row.createCell(1);
cell1.setCellValue(serialNumber);
String equipmentBrand = info.getEquipmentBrand();
XSSFCell cell2 = row.createCell(2);
cell2.setCellValue(equipmentBrand);
}
return workbook;
}
核心代码如下图: