SpringMVC 利用POI的Excel导出

一、实体类

二、控制层Controller

    需要导的包,都是POI里的,我使用的是maven,

pom.xml中的配置

    <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.9</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.9</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>3.9</version>
        </dependency>

控制层Controller需要导的包

    

  /**
     *
     * 导出用户数据
     *
     */
    @RequestMapping(value = "export", method=RequestMethod.GET)
    public String exportFile(HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
        try {
             String fileName="预报名学生数据"+DateUtils.getDate("yyyyMMdd");
                //填充ToSignUpStudent数据
                List<ToSignUpStudent> student=createData();   //调用createData()方法,获得要导出的list对象集合
                List<Map<String,Object>> list=createExcelRecord(student);  //调用createExcelRecord(student);方法,将list对象集合进行转化为Excel中的每行数据
                String columnNames[]={"预报名学生id","编号","姓名","年龄","身高","体重","脚码","备注"};//列名
                String keys[] = {"ts_id","ts_code","ts_name","ts_age","ts_height","ts_weight","ts_feet","remark"};//map中的key
                ByteArrayOutputStream os = new ByteArrayOutputStream();
                try {
                    ExcelUtil.createWorkBook(list,keys,columnNames).write(os);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                byte[] content = os.toByteArray();
                InputStream is = new ByteArrayInputStream(content);
                // 设置response参数,可以打开下载页面
                response.reset();
                response.setContentType("application/vnd.ms-excel;charset=utf-8");
                response.setHeader("Content-Disposition", "attachment;filename="+ new String((fileName + ".xls").getBytes(), "iso-8859-1"));
                ServletOutputStream out = response.getOutputStream();
                BufferedInputStream bis = null;
                BufferedOutputStream bos = null;
                try {
                    bis = new BufferedInputStream(is);
                    bos = new BufferedOutputStream(out);
                    byte[] buff = new byte[2048];
                    int bytesRead;
                    // Simple read/write loop.
                    while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
                        bos.write(buff, 0, bytesRead);
                    }
                } catch (final IOException e) {
                    throw e;
                } finally {
                    if (bis != null)
                        bis.close();
                    if (bos != null)
                        bos.close();
                }
            return null;
        } catch (Exception e) {
            addMessage(redirectAttributes, "导出用户失败!失败信息:"+e.getMessage());
        }
        return null;
    }
    //进行数据库中list对象集合查询
    private List<ToSignUpStudent> createData() {
        ToSignUpStudent student = new ToSignUpStudent();
        return service.list(student);
    }

 //对象集合解析为Excel中的数据
    private List<Map<String, Object>> createExcelRecord(List<ToSignUpStudent> projects) {
        List<Map<String, Object>> listmap = new ArrayList<Map<String, Object>>();
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("sheetName", "sheet1");
        listmap.add(map);
        ToSignUpStudent student=null;
        for (int j = 0; j < projects.size(); j++) {
            student=projects.get(j);
            Map<String, Object> mapValue = new HashMap<String, Object>();
            String height = student.getTs_height() + "m";
            String age = student.getTs_age() + "岁";
            String weight = student.getTs_weight() + "kg";
            String feet = student.getTs_feet() + "码";
            mapValue.put("ts_id", student.getTs_id());
            mapValue.put("ts_code", student.getTs_code());
            mapValue.put("ts_name", student.getTs_name());
            mapValue.put("ts_age", age);
            mapValue.put("ts_height", height);
            mapValue.put("ts_weight", weight);
            mapValue.put("ts_feet", feet);
            mapValue.put("remark", student.getRemark());
            listmap.add(mapValue);
        }
        return listmap;
    }

三、ExcelUtil工具类

需要导的包:

  

工具类:

public class ExcelUtil {
    //Excel的导出
     public static Workbook createWorkBook(List<Map<String, Object>> list,String []keys,String columnNames[]) {
            // 创建excel工作簿
            Workbook wb = new HSSFWorkbook();
            // 创建第一个sheet(页),并命名
            Sheet sheet = wb.createSheet(list.get(0).get("sheetName").toString());
            // 手动设置列宽。第一个参数表示要为第几列设;,第二个参数表示列的宽度,n为列高的像素数。
            for(int i=0;i<keys.length;i++){
                sheet.setColumnWidth((short) i, (short) (35.7 * 150));
            }

            // 创建第一行
            Row row = sheet.createRow((short) 0);

            // 创建两种单元格格式
            CellStyle cs = wb.createCellStyle();
            CellStyle cs2 = wb.createCellStyle();

            // 创建两种字体
            Font f = wb.createFont();
            Font f2 = wb.createFont();

            // 创建第一种字体样式(用于列名)
            f.setFontHeightInPoints((short) 10);
            f.setColor(IndexedColors.BLACK.getIndex());
            f.setBoldweight(Font.BOLDWEIGHT_BOLD);

            // 创建第二种字体样式(用于值)
            f2.setFontHeightInPoints((short) 10);
            f2.setColor(IndexedColors.BLACK.getIndex());

//          Font f3=wb.createFont();
//          f3.setFontHeightInPoints((short) 10);
//          f3.setColor(IndexedColors.RED.getIndex());

            // 设置第一种单元格的样式(用于列名)
            cs.setFont(f);
            cs.setBorderLeft(CellStyle.BORDER_THIN);
            cs.setBorderRight(CellStyle.BORDER_THIN);
            cs.setBorderTop(CellStyle.BORDER_THIN);
            cs.setBorderBottom(CellStyle.BORDER_THIN);
            cs.setAlignment(CellStyle.ALIGN_CENTER);

            // 设置第二种单元格的样式(用于值)
            cs2.setFont(f2);
            cs2.setBorderLeft(CellStyle.BORDER_THIN);
            cs2.setBorderRight(CellStyle.BORDER_THIN);
            cs2.setBorderTop(CellStyle.BORDER_THIN);
            cs2.setBorderBottom(CellStyle.BORDER_THIN);
            cs2.setAlignment(CellStyle.ALIGN_CENTER);
            //设置列名
            for(int i=0;i<columnNames.length;i++){
                Cell cell = row.createCell(i);
                cell.setCellValue(columnNames[i]);
                cell.setCellStyle(cs);
            }
            //设置每行每列的值
            for (short i = 1; i < list.size(); i++) {
                // Row 行,Cell 方格 , Row 和 Cell 都是从0开始计数的
                // 创建一行,在页sheet上
                Row row1 = sheet.createRow((short) i);
                // 在row行上创建一个方格
                for(short j=0;j<keys.length;j++){
                    Cell cell = row1.createCell(j);
                    cell.setCellValue(list.get(i).get(keys[j]) == null?" ": list.get(i).get(keys[j]).toString());
                    cell.setCellStyle(cs2);
                }
            }
            return wb;
        }
}

四、JSP页面:

<input id="btnExport" class="layui-btn layui-btn-normal layui-btn-radius" type="button" onclick="btnExport()" value="导出"/>

五、js:

function btnExport(){
var msg = "确认要导出预报名学生数据吗?";
confirm(msg,function(){
    window.open(ctx+"/tosignup/export","_self");
})
}

原文地址:https://www.cnblogs.com/huyanlon/p/6972665.html