这两天在实现一个将数据导出到Excel功能的时候,在网上搜索了很多案例,方式有多种,有一种使用POI的,用到继承AbstractExcelView这个类来进行实现,但是随着Spring版本的更新,这个逐渐被弃用。在网上查阅诸多案例之后,做了如下总结:
1. 构建Java Web项目(Maven构建)
2. 导入支持jar:
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi Excel处理支持 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.15-beta2</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml-schemas --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> <version>3.17</version> </dependency>
3.主要类:
模拟数据实体类(Student.java):
package com.ed.util; public class Student { private String id; private String name; private String sex; private String birth; public Student() { } public Student(String id, String name, String sex, String birth) { this.id = id; this.name = name; this.sex = sex; this.birth = birth; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getBirth() { return birth; } public void setBirth(String birth) { this.birth = birth; } }
控制类(ExcelDemo.java):
package com.ed.util; import java.io.IOException; import java.io.OutputStream; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Font; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFFont; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ExcelDemo extends HttpServlet{ private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd"); OutputStream os = null; XSSFWorkbook xWorkbook = null; try { //定义表格导出时默认文件名 时间戳 String fileName = df.format(new Date()) + ".xlsx"; os = response.getOutputStream(); response.reset(); //作用:在前端作用显示为调用浏览器下载弹窗 response.setHeader("Content-disposition", "attachment; filename = " + URLEncoder.encode(fileName, "UTF-8")); /*response.setHeader("Content-disposition", "attachment; filename = " + new String(fileName.getBytes(fileName), "ISO8859-1"));*/ response.setContentType("application/octet-streem"); //创建表格工作空间 xWorkbook = new XSSFWorkbook(); //创建一个新表格 XSSFSheet xSheet = xWorkbook.createSheet("学生信息表"); //set Sheet页头部 setSheetHeader(xWorkbook, xSheet); //set Sheet页内容 setSheetContent(xWorkbook, xSheet); xWorkbook.write(os); } catch (Exception e) { e.printStackTrace(); } finally { if (null != os) { try { os.close(); } catch (Exception e) { e.printStackTrace(); } } if (null != xWorkbook) { try { xWorkbook.close(); } catch (Exception e) { e.printStackTrace(); } } } response.sendRedirect("index.jsp"); } /** * 配置Excel表格的顶部信息,如:学号 姓名 年龄 出生年月 * @param xWorkbook * @param xSheet */ private void setSheetContent(XSSFWorkbook xWorkbook, XSSFSheet xSheet) { //设置表格的宽度 xSheet.setColumnWidth(0, 20 * 256); 中的数字 20 自行设置为自己适用的 xSheet.setColumnWidth(0, 20 * 256); xSheet.setColumnWidth(1, 15 * 256); xSheet.setColumnWidth(2, 15 * 256); xSheet.setColumnWidth(3, 20 * 256); //创建表格的样式 CellStyle cs = xWorkbook.createCellStyle(); //设置水平、垂直居中 cs.setAlignment(CellStyle.ALIGN_CENTER); cs.setVerticalAlignment(CellStyle.VERTICAL_CENTER); //设置字体 Font headerFont = xWorkbook.createFont(); headerFont.setFontHeightInPoints((short) 12); /*headerFont.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);*/ headerFont.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD); headerFont.setFontName("宋体"); cs.setFont(headerFont); cs.setWrapText(true);//是否自动换行 //创建一行 XSSFRow xRow0 = xSheet.createRow(0); //设置每一列 XSSFCell xCell0 = xRow0.createCell(0); xCell0.setCellStyle(cs); xCell0.setCellValue("学号"); XSSFCell xCell1 = xRow0.createCell(1); xCell1.setCellStyle(cs); xCell1.setCellValue("姓名"); XSSFCell xCell2 = xRow0.createCell(2); xCell2.setCellStyle(cs); xCell2.setCellValue("性别"); XSSFCell xCell3 = xRow0.createCell(3); xCell3.setCellStyle(cs); xCell3.setCellValue("出生年月"); } /** * 配置(赋值)表格内容部分 * @param xWorkbook * @param xSheet * @throws Exception */ private void setSheetHeader(XSSFWorkbook xWorkbook, XSSFSheet xSheet) throws Exception { //由于太过匆忙,前端页面显示的数据都是静态数据,此处定义了一个List传入了静态写死的数据来模拟 List<Student> listStu = getStudent(); //创建内容样式(头部以下的样式) CellStyle cs = xWorkbook.createCellStyle(); cs.setWrapText(true); //设置水平垂直居中 cs.setAlignment(CellStyle.ALIGN_CENTER); cs.setVerticalAlignment(CellStyle.VERTICAL_CENTER); if (null != listStu && listStu.size() > 0) { for (int i = 0; i < listStu.size(); i++) { XSSFRow xRow = xSheet.createRow(i + 1); //设置第一列学号的值 XSSFCell xCell0 = xRow.createCell(0); xCell0.setCellStyle(cs); xCell0.setCellValue(listStu.get(i).getId()); //设置第二列姓名的值 XSSFCell xCell1 = xRow.createCell(1); xCell1.setCellStyle(cs); xCell1.setCellValue(listStu.get(i).getName()); //设置第三列性别的值 XSSFCell xCell2 = xRow.createCell(2); xCell2.setCellStyle(cs); xCell2.setCellValue(listStu.get(i).getSex()); //设置第四列性别的值 XSSFCell xCell3 = xRow.createCell(3); xCell3.setCellStyle(cs); xCell3.setCellValue(listStu.get(i).getBirth()); } } } /** * @功能:提供模拟数据导入到Excel表格 */ private static List<Student> getStudent() throws Exception { List<Student> list = new ArrayList<Student>(); Student user1 = new Student("1001", "张三", "男", "1997-03-12"); Student user2 = new Student("1002", "李四", "女", "1996-08-12"); Student user3 = new Student("1003", "王五", "女", "1985-11-12"); list.add(user1); list.add(user2); list.add(user3); return list; } }
4. jsp页面
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <style> table{ border:1px solid #000; } table td{ border:1px solid #000; } </style> </head> <body> <h3>学生信息表</h3> <table> <thead> <tr> <td>学 号</td> <td>姓 名</td> <td>性 别</td> <td>出生年月</td> </tr> </thead> <tbody> <tr> <td>1001</td> <td>张三</td> <td>男</td> <td>1997-03-12</td> </tr> <tr> <td>1002</td> <td>李四</td> <td>女</td> <td>1996-08-12</td> </tr> <tr> <td>1003</td> <td>王五</td> <td>女</td> <td>1985-11-12</td> </tr> </tbody> </table> <br> <!-- 此处重要,需为Http请求 --> <a style="color:red;" href="http://localhost:8080/ExcelDemo/excelStudent">导出到Excel</a> <br> <br> <br> <p style="color:red;">(由于太过匆忙,前端页面显示的数据都是静态数据,后台定义了一个List传入了静态写死的数据来模拟)</p> </body> </html>
5. web.xml配置
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <servlet> <servlet-name>ExcelDemo</servlet-name> <servlet-class>com.ed.util.ExcelDemo</servlet-class> </servlet> <servlet-mapping> <servlet-name>ExcelDemo</servlet-name> <url-pattern>/excelStudent</url-pattern> </servlet-mapping> </web-app>
注:此案例在前端展示的数据为静态模拟数据,导入Excel中的数据由控制类ExcelDemo.java的getStudent()方法中定义。
仅供大家参考,不足之处望大家多多指点。(转载请注明出处)