Java导出excel


控制层Controller

 1 /**
 2      * 导出状态
 3      */
 4     private boolean excelFlag = true;
 5 
 6     /**
 7      * 导出excel
 8      *
 9      * @param response
10      * @param keyword 关键字
11      * @param type 类型
12      * @param state 状态
13      * @param startTime 开始时间
14      * @param endTime 结束时间
15      */
16     @RequestMapping(value = "/exportExcel")
17     public void exportOrder(HttpServletResponse response,
18                             String keyword, String type, String state,
19                             String startTime, String endTime) {
20         SearchVO vo = new SearchVO ();
21         // 查询参数
22         vo.setKeyword(keyword);
23         vo.setState(state);
24         vo.setType(type);
25         vo.setStartTime(startTime);
26         vo.setEndTime(endTime);
27         excelFlag = true;
28         String[] header = {"姓名", "地址", "联系电话", "订单金额", "商品名", "购买日期", "订单状态", "订单类型", "创建时间"};
29         String[] columsNames = {"customer_name", "address","phone", "order_money", "product_name", "buy_date","order_state", "order_type", "create_time"};
30         List<Map<String, Object>> dataList = service.search(vo);
31         ExcelUtils.exportExcel("订单列表.xlsx", "sheet", header, columsNames, dataList, response);
32         excelFlag = false;
33     }
34 
35     /**
36      * 获取导出状态
37      *
38      * @return
39      */
40     @RequestMapping("/getExcelFlag")
41     @ResponseBody
42     public String getExportFlag() {
43         return String.valueOf(excelFlag);
44     }

 

excel工具类

/**
 * excel工具类
 */
public class ExcelUtils {
    private static final Logger log = LoggerFactory.getLogger(ExcelUtils.class);
    /**
     * 导出excel
     * @param fileName 文件名(*.xsl)
     * @param sheetName sheet名
     * @param headers   头部
     * @param columsNames 实体属性名
     * @param dataList   数据列表
     * @param response
     */
    public static void exportExcel(String fileName, String sheetName, String[] headers, String[] columsNames, List<Map<String, Object>> dataList, HttpServletResponse response) {
        XSSFWorkbook wb = new XSSFWorkbook();
        // 创建头部样式
        XSSFCellStyle headerStyle = wb.createCellStyle();
        // 创建字体样式
        XSSFFont headerFont = wb.createFont();
        // 字体加粗:0x2bc
        headerFont.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);
        // 设置字体类型:宋体
        headerFont.setFontName("宋体");
        // 设置字体大小:12
        headerFont.setFontHeightInPoints((short) 12);
        // 为头部样式设置字体样式
        headerStyle.setFont(headerFont);
        // 设置头部居中
        headerStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
        
        // 创建body样式
        XSSFCellStyle bodyStyle = wb.createCellStyle();
        // 设置body居左
        bodyStyle.setAlignment(XSSFCellStyle.ALIGN_LEFT);
        // 创建字体样式
        XSSFFont bodyFont = wb.createFont();
        // 设置字体类型
        bodyFont.setFontName("宋体");
        // 设置字体大小
        bodyFont.setFontHeightInPoints((short) 10);
        // 为body样式设置字体样式
        bodyStyle.setFont(bodyFont); 
        
        // 在workbook中添加一个sheet,对应Excel文件中的sheet
        XSSFSheet sheet = wb.createSheet(sheetName);
        // 在sheet中添加表头第0行
        XSSFRow row = sheet.createRow(0);
        // 声明列对象
        XSSFCell cell = null;
        // 创建标题行
        for (int i = 0; i < headers.length; i++) {
            cell = row.createCell(i);
            cell.setCellStyle(headerStyle);
            cell.setCellValue(headers[i]);
        }
        // 创建excel内容
        for (int i = 0; i < dataList.size(); i++) {
            //
            row = sheet.createRow(i + 1);
            // 数据填入列
            for (int j = 0; j < columsNames.length; j++) {
                Map<String, Object> map = dataList.get(i);
                Object obj = map.get(columsNames[j]);
                String columsValue = StringUtils.EMPTY;
                columsValue = obj == null ? "" : obj.toString();
                //
                cell = row.createCell(j);
                cell.setCellStyle(bodyStyle);
                cell.setCellValue(columsValue);
            }
        }
        // 必须在单元格设值以后进行
        // 设置为根据内容自动调整列宽
        for (int k = 0; k < dataList.size(); k++) {
            sheet.autoSizeColumn(k);
        }
        // 处理中文不能自动调整列宽的问题
        setSizeColumn(sheet, dataList.size());
        setResponseHeader(response, fileName);
        OutputStream out = null;
        try {
            out = response.getOutputStream();
            wb.write(out);
            out.close();
            out = null;
            String str = "导出" + fileName + "成功!";
            log.info(str);
        } catch (IOException e) {
            String str = "导出" + fileName + "失败!";
            log.error(str);
            e.printStackTrace();
        } finally {
            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

jsp

<button type="button" class="export-excel" id="export"
                                    onclick="exportExcelAll();">导出Excel</button>

js

//导出excel
function exportExcelAll() {
    let startTime = $("#start").val();
    let endTime = $("#end").val();
    $(document).an_dialog({
        massage: {
            type: '提示',
            content: "导出订单日期:" + startTime + "至" + endTime,
        },
        buttons: [{
            text: '确认',
            cls: "success",
            handler: function (e) {
                var myloading = andy.loading('top', '请稍等,正在导出数据...', function () {
                });
                submitForm();
                //location.href = contextPath + 'order/export/exportExcel?startTime=' + startTime + '&endTime='
                var excelTimer = setInterval(function () {
                    $.get(contextPath + "/order/export/getExcelFlag", function (r) {
                        if (r == 'false') {
                            myloading.close();
                            clearInterval(excelTimer);
                        }
                    });
                }, 1000);
                e.data.an_dialog("close");
            }
        }, {
            text: '取消',
            handler: function (e) {
                e.data.an_dialog("close");
            }
        }]
    });
}

// form表单提交
function submitForm(){
    var orderState = $("#orderState ").val();
    var orderType = $("#orderType ").val();
    var keySearch = encodeURI(encodeURI(encodeURI($("#keySearch ").val().trim())));
    var startTime= $("#start").val();
    var endTime= $("#end").val();

    // 构建form表单
    var form = $("<form>");
    form.attr('style', 'display:none');
    form.attr('target', '');
    form.attr('method', 'post');
    form.attr('action', contextPath + '/order/export/exportExcel');

    var input1 = $('<input>');
    input1.attr('type', 'hidden');
    input1.attr('name', 'keyword');
    input1.attr('value', keySearch);      /* JSON.stringify($.serializeObject($('#searchForm'))) */

    var input2 = $('<input>');
    input2.attr('type', 'hidden');
    input2.attr('name', 'state');
    input2.attr('value', orderState);

    var input3 = $('<input>');
    input3.attr('type', 'hidden');
    input3.attr('name', 'type');
    input3.attr('value', orderType);

    var input4 = $('<input>');
    input4.attr('type', 'hidden');
    input4.attr('name', 'startTime');
    input4.attr('value', startTime);

    var input5 = $('<input>');
    input5.attr('type', 'hidden');
    input5.attr('name', 'endTime');
    input5.attr('value', endTime);

    $('body').append(form);
    form.append(input1);
    form.append(input2);
    form.append(input3);
    form.append(input4);
    form.append(input5);

    form.submit();
    form.remove();
}

这里出现一个小问题,location.href这里get请求,报400错误。参数类型和参数名都能对上,去掉几个参数之后也能进请求。单独用url请求时,发现后面的参数被截取掉了。所以这里改用form表单提交方式实现。

posted on 2021-05-18 17:34  猫的树kireCat  阅读(83)  评论(0编辑  收藏  举报