SXSSFworkbook导出excel

1.需要的依赖,项目基于ssm框架,利用的是mybatis分页插件

<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>3.11</version>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>3.11</version>
			<scope>compile</scope>
		</dependency>
		#分页插件
			<dependency>
			<groupId>com.github.pagehelper</groupId>
			<artifactId>pagehelper</artifactId>
			<version>4.1.6</version>
		</dependency>

2.controller层的编写

String fileName = DateFormatUtils.format(new Date(), "yyyyMMdd") + ApplyConstant.EXCEL_FILE_SUFFIX;
            String userAgent = request.getHeader("User-Agent");
            // 针对IE或者以IE为内核的浏览器:
            if (userAgent.contains("MSIE") || userAgent.contains("Trident")) {
                fileName = java.net.URLEncoder.encode(fileName, "UTF-8");
            } else {
                fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");
            }
            wb = apiService.exportExcelList(blackoutUserRequestVo);
            response.setContentType("application/octet-stream;charset=utf-8");
            response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
            wb.write(response.getOutputStream());

3.service层编写

  logger.info("导出excel文件接口,请求参数:【{}】", JSONObject.toJSONString(blackoutUserRequestVo));
        long starts = System.currentTimeMillis();
        Map<String,Object> map = new HashMap<>(8);
        Workbook wb = new SXSSFWorkbook(7000); // 创建工作簿,1000代表只在内存中保存1000条。
        String[] titles = {"编号","名称","地址","数据","用户分类","分类"};
        String[] fileId = {"connums","conname","conaddr","voltages","conCus","consTagType"};

        blackoutUserRequestVo.setRows(30000);//三万行一个sheet页 写多个sheet页
        PageHelper.startPage(blackoutUserRequestVo.getPageNum(), blackoutUserRequestVo.getPageSize());// 这里是只在第一页开始,每次查询2000条,插入到excel中
        //这一步直接查表
        int sheets = 1;
        List<Map<String, Object>> list = apiMapper.getResult();
        while (list != null && list.size() > 0) { // 当查询数据不为空的时候继续设置数据入excel
            Sheet sh = wb.createSheet("第"+sheets+"页"); // 创建第一页
            Row titleRow = sh.createRow(0); // 创建第一行
            for (int i = 0; i < titles.length; i++) { // excel表头
                titleRow.createCell(i).setCellValue(titles[i]);
            }
            sheets++;
            BlackoutUserRequestVo blk = new BlackoutUserRequestVo();
            blk.setRows(30000);
            for (int i = 0; i < list.size(); i++) {
                Row row = sh.createRow(blk.getStart() + i + 1);
                for (int k = 0; k < fileId.length; k++) {
                    row.createCell(k).setCellValue(StringUtil.format(list.get(i).get(fileId[k])));
                }
            }
            blackoutUserRequestVo.setPage(blackoutUserRequestVo.getPageNum() + 1);
//false 是不进行统计行数的
            PageHelper.startPage(blackoutUserRequestVo.getPageNum(), blackoutUserRequestVo.getPageSize(), false);
        list = apiMapper.getResult();
        }
        logger.error("导出excel耗时"+(System.currentTimeMillis() - starts));
        return wb;

3.实体类和maper层就忽略

oracle sql优化,若查询表多,索引等情况无法进行明确的优化可使用 /+parallel(t2,8) parallel(a2,8) use_hash(t2,a2)/
在select 后加入这句,oracle 并行查询

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值