SpringBoot优雅的导出excel文件
一,准备 一个刚构建好的springboot项目,pom.xml导入poi依赖
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.0.0</version>
</dependency>
二,写好一个h5页面,在其中插入form表单
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>welcome</title>
</head>
<body>
<form th:action="@{/download}" method="post">
<h3>数据表</h3>
<table border="1">
<tr>
<th>编号</th>
<th>名称</th>
</tr>
<tr th:each="user:${users}">
<td th:text="${user.id}"></td>
<td th:text="${user.name}"></td>
</tr>
</table>
<input type="submit" value="提交">
</form>
</body>
</html>
三,要实现的excel结构
四,编写controller实现(这里分三个部分实现)
1:根据excel的数据结构,编写文件名,数据column对应的数据
List<User> users = userRepository.findAll();
String filename = "数据表1";
String sheetName = "数据表sheet";
String titleName = "数据表sheet";//第一行
String[] columnName = {"编号","名称"};//第二行
String[][] dataList = new String[users.size()][2];//数据行
for (int i=0;i<users.size();i++){
dataList[i][0]=users.get(i).getId();
dataList[i][1]=users.get(i).getName();
}
2:用HSSFWorkbook生成excel表,给对应结构赋值
//存成一个excel表
HSSFWorkbook wb = new HSSFWorkbook();
//创建excel中的sheet
HSSFSheet sheet = wb.createSheet(sheetName);
//创建第一行
HSSFRow row1 = sheet.createRow(0);
//创建第一行第一个单元格
HSSFCell cell = row1.createCell(0);
//合并第一行的两个单元格,CellRangeAddress(四个参数)
sheet.addMergedRegion(new CellRangeAddress(0,0,0,1));
cell.setCellValue(titleName);
//创建第二行
HSSFRow row = sheet.createRow(1);
for (int i=0;i<2;i++){
row.createCell(i).setCellValue(columnName[i]);
}
//第三行,数据行
for (int i=0;i<dataList.length;i++){
row = sheet.createRow(i+2);
//循环列
for (int j=0;j<2;j++){
row.createCell(j).setCellValue(dataList[i][j]);
}
}
3 :OutputStream响应回页面
//响应回去
String fileName = filename + ".xls";
response.setContentType("application/ms-excel;charset=UTF-8");
response.setHeader("content-Disposition","attachment;filename="+processFilename(request,fileName));
OutputStream out = response.getOutputStream();
wb.write(out);//wb写到输出流里面
五,中文乱码问题需要采用字节回退重新编码,网上有一大堆,这里不在说明
//调用此函数 对fileName针对不同浏览器采用字节回退重新编码后 将fileName返回
public String processFilename(HttpServletRequest request, String fileName) throws UnsupportedEncodingException {
//采用字节回退,解决文件名中文乱码问题
String userAgent = request.getHeader("User-Agent");
if (userAgent.contains("MSIE") || userAgent.contains("Trident")) { //IE浏览器处理
fileName = java.net.URLEncoder.encode(fileName, "UTF-8");
} else { // 非IE浏览器的处理:
fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");
}
return fileName;
}
success
end 欢迎大家指正交流!