导出excel,弹出下载框! (不适用于ajax方式提交表单!!!)

package com.cxlm.card_god.cardgod_web.utils;

import com.cxlm.card_god.cardgod_web.constants.CardGodConstant;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.util.CellRangeAddress;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.UUID;

/**
 * Created by Admin on 2018/6/26.
 */
public final class ExportExcelUtil {

    /***
     * 构造方法
     */
    private ExportExcelUtil() {

    }

    /***
     * 工作簿
     */
    private static HSSFWorkbook workbook;

    /***
     * sheet
     */
    private static HSSFSheet sheet;
    /***
     * 标题行开始位置
     */
    private static final int TITLE_START_POSITION = 0;

    /***
     * 时间行开始位置
     */
    private static final int DATEHEAD_START_POSITION = 1;

    /***
     * 表头行开始位置
     */
    private static final int HEAD_START_POSITION = 2;

    /***
     * 文本行开始位置
     */
    private static final int CONTENT_START_POSITION = 3;


    /**
     *
     * @param dataList
     *        对象集合
     * @param titleMap
     *        表头信息(对象属性名称->要显示的标题值)[按顺序添加]
     * @param sheetName
     *        sheet名称和表头值
     */
    public static void excelExport(List<?> dataList, Map<String, String> titleMap, String sheetName, HttpServletResponse response) {
        // 初始化workbook
        initHSSFWorkbook(sheetName);
        // 标题行
        createTitleRow(titleMap, sheetName);
        // 时间行
        createDateHeadRow(titleMap);
        // 表头行
        createHeadRow(titleMap);
        // 文本行
        createContentRow(dataList, titleMap);
        //设置自动伸缩
        //autoSizeColumn(titleMap.size());
        // 写入处理结果
        try {
            //生成UUID文件名称
            //UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。
            UUID uuid = UUID.randomUUID();
            String filedisplay =CardGodConstant.DETAIL_OF_COMMISSION_REPORT+uuid+ CardGodConstant.XLS;
            //如果web项目,1、设置下载框的弹出(设置response相关参数);2、通过httpservletresponse.getOutputStream()获取
            response.reset();
            response.setContentType("application/vnd.ms-excel;charset=utf-8");
            response.setHeader("Content-Disposition", "attachment;filename="+ new String((filedisplay).getBytes(), "iso-8859-1"));
            ServletOutputStream out = response.getOutputStream();
            workbook.write(out);
            out.close();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

        /***
         *
         * @param sheetName
         *        sheetName
         */
    private static void initHSSFWorkbook(String sheetName) {
        workbook = new HSSFWorkbook();
        sheet = workbook.createSheet(sheetName);
    }

    /**
     * 生成标题(第零行创建)
     * @param titleMap 对象属性名称->表头显示名称
     * @param sheetName sheet名称
     */
    private static void createTitleRow(Map<String, String> titleMap, String sheetName) {
        CellRangeAddress titleRange = new CellRangeAddress(0, 0, 0, titleMap.size() - 1);
        sheet.addMergedRegion(titleRange);
        HSSFRow titleRow = sheet.createRow(TITLE_START_POSITION);
        HSSFCell titleCell = titleRow.createCell(0);
        titleCell.setCellValue(sheetName);
    }


    /**
     * 创建时间行(第一行创建)
     * @param titleMap 对象属性名称->表头显示名称
     */
    private static void createDateHeadRow(Map<String, String> titleMap) {
        CellRangeAddress dateRange = new CellRangeAddress(1, 1, 0, titleMap.size() - 1);
        sheet.addMergedRegion(dateRange);
        HSSFRow dateRow = sheet.createRow(DATEHEAD_START_POSITION);
        HSSFCell dateCell = dateRow.createCell(0);
        dateCell.setCellValue(new SimpleDateFormat("yyyy年MM月dd日").format(new Date()));
    }


    /**
     * 创建表头行(第二行创建)
     * @param titleMap 对象属性名称->表头显示名称
     */
    private static void createHeadRow(Map<String, String> titleMap) {
        // 第1行创建
        HSSFRow headRow = sheet.createRow(HEAD_START_POSITION);
        int i = 0;
        for (String entry : titleMap.keySet()) {
            HSSFCell headCell = headRow.createCell(i);
            headCell.setCellValue(titleMap.get(entry));
            i++;
        }
    }

    /**
     *
     * @param dataList 对象数据集合
     * @param titleMap 表头信息
     */
    private static void createContentRow(List<?> dataList, Map<String, String> titleMap) {
        try {
            int i=0;
            for (Object obj : dataList) {
                HSSFRow textRow = sheet.createRow(CONTENT_START_POSITION + i);
                int j = 0;
                for (String entry : titleMap.keySet()) {
                    String method = "get" + entry.substring(0, 1).toUpperCase() + entry.substring(1);
                    Method m = obj.getClass().getMethod(method, null);
                        String value =   m.invoke(obj, null).toString();
                        HSSFCell textcell = textRow.createCell(j);
                        textcell.setCellValue(value);
                        j++;
                }
                i++;
            }

        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 自动伸缩列(如非必要,请勿打开此方法,耗内存)
     * @param size 列数
     */
    private static void autoSizeColumn(Integer size) {
        for (int j = 0; j < size; j++) {
            sheet.autoSizeColumn(j);
        }
    }
}

List<Commission> staffs = new ArrayList<Commission>();
            List<Commission> commissions = commissionService.listCommission(commission, null);
            Map<String, String> titleMap = new LinkedHashMap<String, String>();
            titleMap.put("id", "列表ID");
            titleMap.put("createDate", "创建时间");
            titleMap.put("updateDate", "更新时间");
            titleMap.put("dateMoney", "佣金时间");
            titleMap.put("userId", "用户ID");
            titleMap.put("userName", "名字");
            titleMap.put("userPhone", "联系方式");
            titleMap.put("userCardNum", "银行卡号");
            titleMap.put("money", "佣金金额");
            titleMap.put("cardType", "银行卡类型");
            titleMap.put("userPayTreasure", "支付宝账号");
            titleMap.put("transferDate", "转账时间");
            titleMap.put("withdrawalDate", "申请结算时间");
            String sheetName = "佣金列表详细";  这里要遍历查询到的集合数据,然后在 staffs.add(集合数据)
ExportExcelUtil.excelExport(staffs, titleMap, sheetName,response);


//导出Excel
function OutputExcel(excel) {
    $('#commission_list_term_form').form('submit', {
        url: 'xxxx/xxx.do',
        onSubmit: function () {
            return $("#commission_list_term_form").form('validate')
        },
        success:function (data) {
            if(data.code == '1'){
                $.messager.alert('提示消息','导出失败','show');
            }else{
                $('#dg').datagrid('reload');
                $.messager.alert('提示消息','导出成功','show');
            }
        }
    });
}

提交按钮  

<a class="easyui-linkbutton" onclick="OutputExcel('excel');">一键导出Excel</a>

猜你喜欢

转载自blog.csdn.net/qq_40727252/article/details/80853943