很多时候需要将数据利用浏览器进行导出,这个时候我们就可以采用Apache的POI进行实现通过web页面实现Excel导出后台数据,并且以.xlsx的形式下载到本地,也就是excel表格形式。
首先先下载POI的jar包,
链接:https://pan.baidu.com/s/1qynuHSmu15rGzbv2fey7PA
提取码:2pin
复制这段内容后打开百度网盘手机App,操作更方便哦
下载完成后在web项目里面加入到lib目录下,添加到项目环境中。
我们先分析一下excel表格,从而理解POI的操作流程。
根据excel的特性,我们通过POI生成表格时也是采用这一流程。先建立excel--建立sheet--根据需求建立行row--根据需求建立列cell。
所对应的关键字分别是HSSFWorkbook--HSSFSheet--HSSFRow--HSSFCell。
了解了以后后台代码就十分简单了。直接上干货。
public void exportExcel(String[] titles, ServletOutputStream out) throws IOException, SQLException { //创建一个excel文件 HSSFWorkbook hssfWorkbook = new HSSFWorkbook(); //HSSFWorkbook中添加sheet HSSFSheet hssfSheet = hssfWorkbook.createSheet("sheet_01"); //在sheet中添加表头 HSSFRow hssfRow_00 = hssfSheet.createRow(0); //设置单元格样式 居中 HSSFCellStyle hssfCellStyle = hssfWorkbook.createCellStyle(); hssfCellStyle.setAlignment(HorizontalAlignment.CENTER); //创建单元格 HSSFCell hssfCell = null; for (int i = 0; i < titles.length; i++) { hssfCell = hssfRow_00.createCell(i); hssfCell.setCellValue(titles[i]); hssfCell.setCellStyle(hssfCellStyle); } Student student = new Student(); List<Student> list = Student.findAll(); for (int i = 0; i < list.size(); i++) { //从第二行进行数据添加 hssfRow_00 = hssfSheet.createRow(i + 1); Student student = list.get(i); Integer id = 0; if (student .getId() != 0) { id = student .getId(); } //给第一列添加数据 hssfRow_00.createCell(0).setCellValue(id); String name=""; if (student .getName() != null) { name = student .getName(); } //给第二列添加数据 hssfRow_00.createCell(1).setCellValue(name); //可以根据自己的需求适当添加列 } //将文件写出 System.out.println("开始写出"); hssfWorkbook.write(out); out.flush(); out.close(); }
以下是调用方法
@WebServlet("/downExcel") public class DownExcelServlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //创建一个流 将生成的excel发回给浏览器 让浏览器下载 ServletOutputStream servletOut=response.getOutputStream(); //设置头文件 让浏览器下载 //Content-Type的作用:该实体头的作用是让服务器告诉浏览器它发送的数据属于什么文件类型。 //Content-Disposition 的作用:当Content-Type 的类型为要下载的类型时 , 这个信息头会告诉浏览器这个文件的名字和类型 response.setHeader("Content-Disposition","attachment;fileName=StudentList.xls"); //预先设置表头 String [] titles={"编号","学生姓名"}; //利用POI生成Excel 调用ExcelPOI(自定义方法) ExcelPOI excelPOI=new ExcelPOI(); try { excelPOI.exportExcel(titles,servletOut); } catch (SQLException e) { e.printStackTrace(); } } }
前端代码如下:
<div style="float: right">
<form action="${pageContext.request.contextPath}/downExcel">
<input type="submit" value="报表导出">
</form>
</div>
关于为什么使用的时form表单请求,而不是ajax,因为我们返回的是一个文件让浏览器进行下载,Ajax并不支持这种返回类型。
结果如下: