SSM框架下的POI与ajax异步导出Excel文件功能
一、pom.xml导入poi的jar包
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
二、jsp代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>文件下载</title>
<script src="/jQuery-1.11/jquery-1.11.3.js"></script>
</head>
<body>
<button type="button" onclick="download()">导出</button>
</body>
<script type="text/javascript">
function download() {
var url = '/exportExcel';
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true); // 也可以使用POST方式,根据接口
xhr.responseType = "blob"; // 返回类型blob
// 定义请求完成的处理函数,请求前也可以增加加载框/禁用下载按钮逻辑
xhr.onload = function () {
// 请求完成
if (this.status === 200) {
// 返回200
var blob = this.response;
var reader = new FileReader();
reader.readAsDataURL(blob); // 转换为base64,可以直接放入a表情href
reader.onload = function (e) {
// 转换完成,创建一个a标签用于下载
var a = document.createElement('a');
a.download = 'data.xlsx';
a.href = e.target.result;
$("body").append(a); // 修复firefox中无法触发click
a.click();
$(a).remove();
}
}
};
// 发送ajax请求
xhr.send()
}
</script>
</html>
三、Controller层
@Controller
public class StudentController {
@Autowired
private IStudentService studentService;
@RequestMapping("/exportExcel")
@ResponseBody
public void exportExcel(HttpServletResponse response){
response.setHeader("Content-Disposition", "attachment;filename=employee.xls");
Workbook wb = studentService.exportExcel();
try {
wb.write(response.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
}
四、Service层接口
public interface IStudentService {
public Workbook exportExcel();
}
五、Service层实现类
@Service
public class StudentServiceImpl implements IStudentService {
@Autowired
private StudentMapper studentMapper;
@Override
public Workbook exportExcel() {
//创建工作空间
Workbook wb = new HSSFWorkbook();
//创建sheet
Sheet sheet = wb.createSheet();
//获取当前sheet的第一行,设置标题头
Row row = sheet.createRow(0);
row.createCell(0).setCellValue("编号");
row.createCell(1).setCellValue("姓名");
row.createCell(2).setCellValue("年龄");
//获取所有的students
List<Student> students = studentMapper.selectAll();
for (int i = 0; i < students.size(); i++) {
row = sheet.createRow(i + 1);
row.createCell(0).setCellValue(students.get(i).getId());
row.createCell(1).setCellValue(students.get(i).getName());
row.createCell(2).setCellValue(students.get(i).getAge());
}
return wb;
}
}
图示:
