java excel导出工具类(大量数据)

本文详细介绍了一种使用Java进行大规模数据批量导出至Excel的方法,通过创建自定义的ObjectExcelView类,实现数据的高效处理与导出,特别关注了如何避免Excel文件大小限制,确保大量数据的完整导出。

java excel导出工具类(大量数据)

主要代码:

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

/**
 * 导入到EXCEL
 * 类名称:ObjectExcelView.java
 *
 * @author LYY
 * @version 1.0
 */
public class ObjectExcelView extends AbstractExcelView {

    @Override
    protected void buildExcelDocument(Map<String, Object> model,
                                      HSSFWorkbook workbook, HttpServletRequest request,
                                      HttpServletResponse response) throws Exception {
        // TODO Auto-generated method stub
        Date date = new Date();
        String filename = DateUtil.dateToStr(date, "yyyyMMddHHmmss");
        HSSFSheet sheet;
        HSSFCell cell;
        response.setContentType("application/octet-stream");
        response.setHeader("Content-Disposition", "attachment;filename=" + filename + ".xls");
        List<String> titles = (List<String>) model.get("titles");
        int len = titles.size();
        HSSFCellStyle headerStyle = workbook.createCellStyle(); //标题样式
        headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        headerStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        HSSFFont headerFont = workbook.createFont();    //标题字体
        headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        headerFont.setFontHeightInPoints((short) 11);
        headerStyle.setFont(headerFont);
        List<Map<String, Object>> varList = (List<Map<String, Object>>) model.get("varList");
        int varCount = varList.size();
        Integer lineIndex = (varCount + 9999) / 10000;
        List<HSSFSheet> sheetList = new ArrayList<>();
        for (Integer i = 0; i < lineIndex; i++) {
            sheet = workbook.createSheet((i + 1) + "页");
            sheetTtile(titles, sheet, headerStyle);
            sheetList.add(sheet);
        }

        HSSFCellStyle contentStyle = workbook.createCellStyle(); //内容样式
        contentStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        int num = -1;
        HSSFSheet hssfSheet = null;
        /**
         * 设置excel数据写入开始行数
         */
        int row = 1;
        try {
            for (int i = 0; i < varCount; i++) {
                Map<String, Object> vpd = varList.get(i);
                /**
                 * 当数据到达10000行时写入新sheet页,并将写入数据开始行数设置为1
                 */
                if (i % 10000 == 0) {
                    hssfSheet = sheetList.get(++num);
                    row = 1;
                }
                for (int j = 0; j < len; j++) {
                    String varstr = vpd.get("var" + (j + 1)) != null ? vpd.get("var" + (j + 1)) + "" : "";
                    cell = getCell(hssfSheet, row, j);
                    cell.setCellStyle(contentStyle);
                    setText(cell, varstr);
                }
                /**
                 * 每写入一行数据,写入行加1
                 */
                row++;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void sheetTtile(List<String> titles, HSSFSheet sheet, HSSFCellStyle headerStyle) {
        short width = 20, height = 25 * 20;
        HSSFCell cell;
        sheet.setDefaultColumnWidth(width);
        int len = titles.size();
        for (int i = 0; i < len; i++) { //设置标题
            String title = titles.get(i);
            cell = getCell(sheet, 0, i);
            cell.setCellStyle(headerStyle);
            setText(cell, title);
        }
        sheet.getRow(0).setHeight(height);
    }
}

调用方式:

@RequestMapping("/xxx")
    public ModelAndView getLotterySchemeListInfoExcel(LotterySchemeDTO dto) {
        ModelAndView mv = null;
        try {
            Map<String, Object> dataMap = new HashMap<>(16);
            if (null == dto.getIds() || !(dto.getIds().length > 0)) {
                dto.setIds(null);
            }
            if (dto.getOrder() == null || StringUtils.isEmpty(dto.getOrder().trim())) {
                dto.setOrder("createTime desc");
            } else {
                if (dto.getOrder().trim().length() > 15 || (!dto.getOrder().toLowerCase().contains("desc")) && !dto.getOrder().toLowerCase().contains("asc")) {
                    log.error("!");
                    return null;
                }
            }
            List<LotterySchemeVO> list = financeMapper.getLotterySchemeListInfo(dto);
            for (LotterySchemeVO statement : list) {
                if (statement.getLotteryType() != null) {
                    statement.setLotteryTypeName(statement.getLotteryType().getName());
                }
                if (statement.getSchemePrintState() != null) {
                    statement.setSchemePrintStateName(statement.getSchemePrintState().getStateName());
                }
            }
            Map<String, Object> map = financeMapper.getLotterySchemeCount(dto);
            if (map == null) {
                map = new HashMap<>(3);
                map.put("SuccessMoney", 0);
                map.put("FailedMoney", 0);
            }
            //标题
            List<String> titles = new ArrayList<>();
            titles.add("xx");
            titles.add("xxx");
            dataMap.put("titles", titles);
            //内容
            List<Map<String, Object>> varList = new ArrayList<>();
            for (LotterySchemeVO vo : list) {
                Map<String, Object> vpd = new HashMap<>(9);
                vpd.put("var1", vo.getId());
                vpd.put("var2", vo.getUserName());
                varList.add(vpd);
            }
            Map<String, Object> vpd = new HashMap<>(0);
            Map<String, Object> vpd1 = new HashMap<>(3);
            vpd1.put("var1", "汇总:");
            vpd1.put("var2", "xx:");
            vpd1.put("var3", map.get("SuccessMoney"));
            Map<String, Object> vpd2 = new HashMap<>(3);
            vpd2.put("var1", "");
            vpd2.put("var2", "xx:");
            vpd2.put("var3", map.get("FailedMoney"));
            varList.add(vpd);
            varList.add(vpd1);
            varList.add(vpd2);
            varList.add(vpd3);
            dataMap.put("varList", varList);
            ObjectExcelView erv = new ObjectExcelView();
            mv = new ModelAndView(erv, dataMap);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return mv;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值