1、在实现导出excel的过程中,使用easypoi时发现网上大多都是实体类的属性上加注解的方式去导出(简单是简单,我之前的博客也有介绍这种实现),但是问题来了,如果没有实体对应的数据库数据该如何导出呢?
2、首先导入easypoi的jar包
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-web</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-annotation</artifactId>
<version>3.2.0</version>
</dependency>
3、核心代码如下:
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet(widget.getEchartsTitle());
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String fileName = "你要设置的文件名 + "_" + sdf.format(new Date()) + ".xls";
HSSFRow row = sheet.createRow(0);
sheet.setDefaultRowHeight((short) (3 * 256));
sheet.setDefaultColumnWidth(25);
for (int i = 0; i < fieldList.size(); i++) {
HSSFCell cell = row.createCell(i);
cell.setCellStyle(excelUtil.getRow1CellStyle(workbook));
HSSFRichTextString text = new HSSFRichTextString(String.valueOf(fieldList.get(i).getFieldName()));
cell.setCellValue(text);
}
int rowNum = 1;
for (Map<String, Object> map : resultSetResp.getList()) {
HSSFRow row1 = sheet.createRow(rowNum);
row1.setHeightInPoints(20);
for (int i = 0; i < fieldList.size(); i++) {
row1.createCell(i).setCellValue(String.valueOf(map.get(fieldList.get(i).getFieldName())));
}
rowNum++;
}
excelUtil.downLoadExcel(fileName, response, request, workbook);
4、excelUtil工具类
(1)导出时设置浏览器的相应格式,请注意,经过我的多次尝试,发现这种写法通过postman测试会出现文件名缺失或者乱码的问题,但是前端人员可以通过代码调通;还有一种写法是我自己postman测试没问题,前段人员调的时候乱码,大家可以自行尝试,代码一并放下面。
public void downLoadExcel(String fileName, HttpServletResponse response, HttpServletRequest request, Workbook workbook) throws IOException {
ServletOutputStream outputStream = null;
try {
try {
fileName = new String(fileName.getBytes(), "ISO8859-1");
} catch (UnsupportedEncodingException e) {
log.info("导出失败 --0");
}
response.setContentType("application/octet-stream;charset=ISO8859-1");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
response.addHeader("Pargam", "no-cache");
response.addHeader("Cache-Control", "no-cache");
response.addHeader("fileName",fileName);
outputStream = response.getOutputStream();
workbook.write(outputStream);
outputStream.flush();
} catch (IOException e) {
log.error("导出excel时出错:{}", e);
} finally {
workbook.close();
if (outputStream != null) {
outputStream.flush();
outputStream.close();
}
}
}
(2)设置单元格的样式
public CellStyle getRow1CellStyle(Workbook workbook) {
CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setAlignment(HorizontalAlignment.CENTER);
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
cellStyle.setBorderBottom(BorderStyle.THIN);
cellStyle.setBorderTop(BorderStyle.THIN);
cellStyle.setBorderLeft(BorderStyle.THIN);
cellStyle.setBorderRight(BorderStyle.THIN);
Font font = workbook.createFont();
font.setFontHeightInPoints((short) 14);
font.setItalic(false);
font.setBold(false);
font.setColor(IndexedColors.BLACK.index);
cellStyle.setFont(font);
cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
cellStyle.setFillForegroundColor(IndexedColors.YELLOW.index);
return cellStyle;
}
5、效果(数据居中我没实现成功,大家有实现的可以留言哦)

6、溜了溜了
