• 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");
    })
    }

  • 相关阅读:
    python字符串格式化笔记
    看球时的随笔——“如何掌握新的知识”
    str()和repre()的区别
    关于抛出异常和捕获异常
    python关键字详解
    博客的第一天
    PEP8 Python 编码规范
    SQL Server 自动循环归档分区数据脚本
    反射应用--取得类的结构
    回调函数callback使用例子
  • 原文地址:https://www.cnblogs.com/huyanlon/p/6972665.html
Copyright © 2020-2023  润新知