zoukankan      html  css  js  c++  java
  • POI实现Excel导出

      POI是专门针对微软的文字办公软件Office进行读写支持的框架,这里只说下如何简单的实现数据导出到Excel。这次先看后台:

      先在pom.xml里引入POI的jar包,我之前引入了commons-logging这个jar包了,所以这里排除一下:

            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>3.6</version>
                <exclusions>
                    <exclusion>
                        <artifactId>commons-logging</artifactId>
                        <groupId>commons-logging</groupId>
                    </exclusion>
                </exclusions>
            </dependency>

      接着在Controller实现Excel的创建:

        @ResponseBody
        @RequestMapping(value = "exportExcel", method = RequestMethod.GET)
        public void exportExcel(@RequestParam(value = "currentOperator", required = false) String currentOperator,
                                @RequestParam(value = "status", required = false) String status,
                                @RequestParam(value = "createTimeStart", required = false) String createTimeStart,
                                @RequestParam(value = "createTimeEnd", required = false) String createTimeEnd,
                                HttpServletResponse response) {
            List<FlowView> result = null;
            Date createDateStart = null;
            Date createDateEnd = null;
    
    
            // 校验输入起始时间格式
            if (createTimeStart != null && !"".equals(createTimeStart.trim())) {
                try {
                    createDateStart = sf.parse(createTimeStart);
                } catch (Exception e) {
                    LOGGER.error("--queryFlow-- error: ", e);
                    try {
                        Utils.printfErrorOutput(response, "The createTimeStart format wrong.");
                    } catch (IOException e1) {
                        LOGGER.error("--printfErrorOutput-- error: ", e1);
                    }
                }
    
                // 若结束时间格式不对或不输入,默认为当前时间
                if (createTimeEnd != null && !"".equals(createTimeEnd.trim())) {
                    try {
                        createDateEnd = sf.parse(createTimeEnd);
                    } catch (ParseException e) {
                        LOGGER.error("--queryFlow-- error: ", e);
                        createDateEnd = new Date();
                    }
                } else {
                    createDateEnd = new Date();
                }
    
                // 若结束时间大于起始时间则报错
                if (createDateStart.after(createDateEnd)) {
                    try {
                        Utils.printfErrorOutput(response, "The createTimeStart can not after createTimeEnd.");
                    } catch (IOException e) {
                        LOGGER.error("--printfErrorOutput-- error: ", e);
                    }
                }
            }
    
            // 取值
            if (currentOperator == null || currentOperator.trim().length() == 0 || "All".equals(currentOperator)) {
                currentOperator = null;
            }
    
            if (status == null || status.trim().length() == 0 || "All".equals(status)) {
                status = null;
            }
    
            result = flowService.queryFlows(0, 0, status, currentOperator, createDateStart, createDateEnd);
    
            if (result == null || result.size() == 0) {
                try {
                    Utils.printfErrorOutput(response, "There is no result to export.");
                } catch (IOException e) {
                    LOGGER.error("--printfErrorOutput-- error: ", e);
                }
            }
    
            // 执行导出逻辑
            HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
    
            // 创建sheet页
            HSSFSheet sheet = hssfWorkbook.createSheet("统计表");
    
            // 创建表头
            createTitle(sheet);
    
            // 设置日期格式
            HSSFCellStyle dateStyle = hssfWorkbook.createCellStyle();
            dateStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));
    
            // 创建各行数据
            for (int i = 0; i < result.size(); i++) {
                FlowView flow = result.get(i);
                if (flow == null) {
                    continue;
                }
                HSSFRow row = sheet.createRow(i + 1);
                row.createCell(0).setCellValue(flow.getOrderId());
                row.createCell(1).setCellValue(flow.getTestType());
                row.createCell(2).setCellValue(flow.getTestName());
                row.createCell(3).setCellValue(flow.getReviewUrl());
                row.createCell(4).setCellValue(flow.getPayFlow());
                row.createCell(5).setCellValue(flow.getPhotoUrl());
                if (flow.getPurchaseDate() != null) {
                    HSSFCell cell6 = row.createCell(6);
                    cell6.setCellValue(flow.getPurchaseDate());
                    cell6.setCellStyle(dateStyle);
                }
            }
            String fileName = Utils.createFileName("xls");
            if (null == fileName) {
                fileName = "流程表.xls";
            }
    
            //生成浏览器页,下载文件
            response.setContentType("application/octet-stream");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName);
            try {
                OutputStream outputStream = response.getOutputStream();
                response.flushBuffer();
                hssfWorkbook.write(outputStream);
                outputStream.flush();
                outputStream.close();
            } catch (Exception e) {
                LOGGER.error("--queryFlow-- error : ", e);
                try {
                    Utils.printfErrorOutput(response, "Export excel failed.");
                } catch (IOException e1) {
                    LOGGER.error("--printfErrorOutput-- error: ", e1);
                }
            }
        }
    
        /**
         * 创建表头
         *
         * @param sheet
         */
        private void createTitle(HSSFSheet sheet) {
            String[] headers = {"订单号", "评测类型", "评测人名称", "支付流水", "支付截图, "下单时间"};
            HSSFRow row = sheet.createRow(0);
            for (int i = 0; i < headers.length; i++) {
                HSSFCell cell = row.createCell(i);
                HSSFRichTextString text = new HSSFRichTextString(headers[i]);
                cell.setCellValue(text);
            }
        }

      最后看下js,我们在页面有一个导出按钮,点击触发doExport方法:

            function doExport() {
                var status = $('#status').val();
                var currentOperator = $('#currentOperator').val();
                var createTimeStart = $('#createTimeStart').val();
                var createTimeEnd = $('#createTimeEnd').val();
                if (createTimeEnd != "" && createTimeStart == "") {
                    $.messager.show({
                        title: '错误',
                        msg: '输入结束时间则必须输入起始时间.'
                    });
                    return;
                }
                var url = "exportExcel?status=" + status + "&currentOperator=" + currentOperator + "&createTimeStart="
                    + createTimeStart + "&createTimeEnd=" + createTimeEnd;
                window.location.href = url;
            }

      打完收工,简单是简单,但只能导出数据到扩展名为.xls的Excel文件里,如果你想导出的Excel后缀是xlsx,那么得另外引入jar包,不能通过HSSFWorkbook对象来处理,而是XSSFWorkbook或者SXSSFWorkbook了。

  • 相关阅读:
    关于同余最短路
    【水】关于 __attribute__
    题解【AtCoder
    一些简单图论问题
    浅谈简单动态规划
    关于博客园主题(美化博客园)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第47章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第46章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第45章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第44章 读书笔记(待更新)
  • 原文地址:https://www.cnblogs.com/wuxun1997/p/10909148.html
Copyright © 2011-2022 走看看