poi模板导出excel数据超65535条数据报错。

先了解下excel,什么是excel就不用介绍了,这里主要说明不同版本下每个sheet下的行列限制。
版本区间	行数	列数	生成文件后缀Excel 2003及以下	65535	256	xlsExcel 2007及以上	1048576	16384	xlsx
所以就需要导出xlsx文件。如果使用xls则会报错

IllegalArgumentException: Invalid row number (65536) outside allowable range (0..65535)

其实也不是多么高深的处理

SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook();
Sheet sheet = sxssfWorkbook.createSheet("Sheet1");

SXSSFWorkbook专门处理大数据,对于大型excel的创建且不会内存溢出的,就只有SXSSFWorkbook了。说一些官方话可能没啥用,直接上代码。

  void exportExcel(List<Map<String, Object>> list, String[] lables, String[] fields, String fileName);

方法需要的参数:数据集合list,其中mapkeyfilelds一一对应,fileldslables一一对应。
具体看下代码:

List<Map<String,Object>> list = new ArrayList<>();
for(OrderMaterialMultiTemplate orderMaterialMultiTemplate :resultList){
	Map<String,Object> map = new HashMap<>();
	map.put("materialCode",orderMaterialMultiTemplate.getMaterialCode());
	map.put("categoryCode",orderMaterialMultiTemplate.getCategoryCode());
    map.put("materialName",orderMaterialMultiTemplate.getMaterialName());      
    map.put("materialSpecification",orderMaterialMultiTemplate.getMaterialSpecification());
	list.add(map);
}
ExportExcel exportExcel = new ExportExcelImpl();//下面有这个文件的详细带啊吗
String[] lables = new String[]{"物料编码","物料分类编码","物料名称","物料规格"};//表头数组
String[] fields = new String[]{"materialCode", "categoryCode","materialName", "materialSpecification"};//查询数据对应的属性数组
exportExcel.exportExcel(list,lables,fields,"路径+文件名称.xlsx");//下方方法

ExportExcelImpl

public void exportExcel(List<Map<String, Object>> list,String[] lables,String[] fields,String fileName) {
        System.out.println("开始写入"+new Date());
        OutputStream os = null;
        SXSSFWorkbook sxssfWorkbook = null;
        try {
            // 获取SXSSFWorkbook
            sxssfWorkbook = new SXSSFWorkbook();
            Sheet sheet = sxssfWorkbook.createSheet("Sheet1");
            // 冻结第一行,下拉滚动条时,第一行始终在上面
            sheet.createFreezePane(0, 1);
            // 创建第一行,作为header表头
            Row header = sheet.createRow(0);
            // 循环创建header单元格
            for (int cellnum = 0; cellnum < lables.length; cellnum++) {
                Cell cell = header.createCell(cellnum);
                //cell.setCellStyle(getAndSetXSSFCellStyleHeader(sxssfWorkbook));//设置表头单元格样式,根据需要设置
                cell.setCellValue(lables[cellnum]);
                //设置每列固定宽度
                sheet.setColumnWidth(cellnum, 21 * 260);
            }
            // 遍历创建行,导出数据
            for (int rownum = 1; rownum <= list.size(); rownum++) {
                Row row = sheet.createRow(rownum);
                Map<String, Object> map = list.get(rownum-1);
                // 循环创建单元格
                for (int cellnum = 0; cellnum < fields.length; cellnum++) {
                    Cell cell = row.createCell(cellnum);
                    //cell.setCellStyle(getAndSetXSSFCellStyleOne(sxssfWorkbook));//设置数据行单元格样式,根据需要设置
                    //塞值
                    cell.setCellValue(map.get(fields[cellnum]) == null ? "" : map.get(fields[cellnum]).toString());
                }
            }
            //自定义各列宽度
            //setSheet(sheet);
            //声明文件
            File file = new File(fileName);
            File pFile = file.getParentFile();
            if (!pFile.exists()) {
            //生成文件
                pFile.mkdirs();
            }
            if(!file.exists()){
            //清除文件内容
               file.createNewFile();
            }
            os = new FileOutputStream(fileName);
            //写入文件
            sxssfWorkbook.write(os);
            System.out.println("结束写入"+new Date());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if(sxssfWorkbook != null) {
                    //处理SXSSFWorkbook导出excel时,产生的临时文件
                    sxssfWorkbook.dispose();
                }
                if(os != null) {
                //关闭流
                    os.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

这就可以了可以直接复制拿去用,试一试,看到这里也为有缘,相信也看过其他的博客,动手试一试,不动手是没办法成功的
另外方法中注释了两行代码是关于设置样式的,你可以自己设置,常用的我在这里列一下:

//声明样式
CellStyle style = sxssfWorkbook.createCellStyle();
//背景色
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
style.setFillForegroundColor(IndexedColors.YELLOW.getIndex());
 //自动换行
style.setWrapText(true);
//居中
style.setAlignment(HorizontalAlignment.CENTER);
style.setVerticalAlignment(VerticalAlignment.CENTER);
//边框
style.setBorderTop(BorderStyle.THIN);// 上边框
style.setBorderLeft(BorderStyle.THIN);// 左边框
style.setBorderRight(BorderStyle.THIN);// 右边框
//合并单元格
sheet.addMergedRegion(new CellRangeAddress(0,1,0,0));
//给单元格赋样式
cell.setCellStyle(style);
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值