excel 导出百万级别只需一分钟

2 篇文章 0 订阅
1 篇文章 0 订阅

话不多说上代码

可以通过新的SXSSFWorkbook(int ROWACCESSWINDOWSIZE )在工作簿构建时指定窗口大小 


/**
 * Excel工具类
 *
 * @author zhoaxx
 */
public class ExcelUtils {


    public static final String SHEET_NM = "sheet1";
    public static final int ROWACCESSWINDOWSIZE = 1000;

    public static Workbook getWorkBook(String[] titleNms, String[] columMethodNms, List list) {
        try {
            return getWorkBook(SHEET_NM, titleNms, columMethodNms, list, 0);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static Workbook getWorkBook(String sheetNm, String[] titleNms,
                                       String[] columMethodNms, List list, int start) throws Exception {
        Workbook workbook = new SXSSFWorkbook(new XSSFWorkbook(), ROWACCESSWINDOWSIZE);
        //设置格式
        CellStyle titleStyle = titleStyle(workbook);
        CellStyle dataStyle = dataStyle(workbook);
        Sheet sheet = getSheet(sheetNm, titleNms, workbook, titleStyle);
        Class cla = null;
        if (list != null && list.size() > 0) {
            cla = list.get(0).getClass();
        }
        for (int i = 0, size = list.size(); i < size; i++) {
            Object obj = list.get(i);
            Row dataRow = sheet.createRow(i + 1 + start);// 创建行
            for (int j = 0, len = columMethodNms.length; j < len; j++) {
                setCellVal(cla.getMethod(columMethodNms[j]), obj, dataStyle, dataRow, j);
            }
        }
        return workbook;
    }

    private static void setCellVal(Method method, Object obj, CellStyle dataStyle, Row dataRow, int j) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
        Cell cell = dataRow.createCell(j);// 创建单元格
        String returnType = method.getReturnType().getName().toLowerCase();
        Object value = method.invoke(obj);
        cell.setCellStyle(dataStyle);
        if (value == null || value.toString().trim().length() == 0) {
            return;
        }
        if (isNum(returnType)) {
            cell.setCellType(Cell.CELL_TYPE_NUMERIC);
            cell.setCellValue(new Double(value.toString()));
        } else if (returnType.indexOf("date") != -1) {
            cell.setCellType(Cell.CELL_TYPE_STRING);
            cell.setCellValue(value.toString());
        } else {
            cell.setCellType(Cell.CELL_TYPE_STRING);
            cell.setCellValue(value.toString());
        }
    }

    private static boolean isNum(String returnType) {
        return returnType.indexOf("integer") != -1
                || returnType.indexOf("int") != -1
                || returnType.indexOf("bigdecimal") != -1
                || returnType.indexOf("double") != -1
                || returnType.indexOf("long") != -1
                || returnType.indexOf("float") != -1;
    }

    //创建sheet和设置标题
    private static Sheet getSheet(String sheetNm, String[] titleNms, Workbook workbook, CellStyle titleStyle) {
        Cell cell;
        Sheet sheet = workbook.getSheet(StringUtils.isEmpty(sheetNm) ? SHEET_NM : sheetNm);
        if (sheet == null) {
            sheet = workbook.createSheet(StringUtils.isEmpty(sheetNm) ? SHEET_NM : sheetNm);
            // 标题
            Row titleRow = sheet.createRow(0); // 创建标题行(第一行)
            titleRow.setHeight((short) 400);// 设置第一行的行高
            for (int i = 0; i < titleNms.length; i++) {
                sheet.setColumnWidth(i, 3500);// 设置单元格的宽
                cell = titleRow.createCell(i);
                cell.setCellType(Cell.CELL_TYPE_STRING);
                cell.setCellValue(titleNms[i]);
                cell.setCellStyle(titleStyle);
            }
        }
        return sheet;
    }


    public static CellStyle titleStyle(Workbook workbook) {
        CellStyle titleStyle = workbook.createCellStyle();
        titleStyle.setFillForegroundColor(IndexedColors.LIGHT_GREEN.getIndex());
        titleStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
        titleStyle.setAlignment(CellStyle.ALIGN_CENTER_SELECTION); // 居中
        titleStyle.setBorderLeft((short) 1);
        titleStyle.setBorderRight((short) 1);
        titleStyle.setBorderBottom((short) 1);
        titleStyle.setBorderTop((short) 1);
        Font font = workbook.createFont();
        font.setFontHeightInPoints((short) 12);// 设置字体大小
        titleStyle.setFont(font);// 选择需要用到的字体格式
        return titleStyle;
    }

    public static CellStyle dataStyle(Workbook workbook) {
        CellStyle dataStyle = workbook.createCellStyle();
        dataStyle.setBorderBottom((short) 1);
        dataStyle.setBorderLeft((short) 1);
        dataStyle.setBorderRight((short) 1);
        dataStyle.setBorderTop((short) 1);
        dataStyle.setBottomBorderColor(HSSFColor.BLACK.index);
        return dataStyle;
    }

}
 

 

 

 

调用方法

@RequestMapping(value = "/export", method = RequestMethod.GET)
public String export(HttpServletRequest request, HttpServletResponse response, Integer status, String keyword)  throws Exception{
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    String date = format.format(new Date());
    List<TradeRecord> dataSet = tradeRecordService.findByUserIdApp(0, null,null,null,0,600000,null);
    String[] EXCEL_TITLE_NAMES = {"提现用户名", "真实姓名", "提现金额", "提现卡号", "银行名称", "支行地址", "提现申请时间", "提现状态"};
    String[] COLUM_METHOD_NAMES = {"getId", "getUserId", "getOtherId", "getTableName", "getType", "getSource", "getTime", "getAmount"};
    try {
        Long begin = System.currentTimeMillis();
        Workbook ex = ExcelUtils.getWorkBook(EXCEL_TITLE_NAMES, COLUM_METHOD_NAMES, dataSet);
        OutputStream out = DownloadUtils.getResponseOutput(date + "提现.xlsx", response);
        ex.write(out);
        ex.close();
        DownloadUtils.closeResponseOutput(response);
        System.out.println(System.currentTimeMillis()-begin);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值