java使用 poi导出Excel 2003异常

java 使用POI导出Excel xxxx.xls 抛出如下异常:

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

此异常是由于使用 HSSFWorkbook  即生成office2003版本的Excel文件,该poi的方法只支持最大行数为:65535,如果要生成的记录数大于65535,则会抛出以上异常

解决方法:

1、使用 XSSFWorkbook 即生成office2007后版本的Excel文件 ,改格式的文件没有限制

2、使用jxl.jar来导出excel

3、根据业务需求,可以拆分为多个sheet来导出数据,仍然使用HSSFWorkbook 导出 xxx.xls 只不过里边是多个sheet  

代码如下:

/**
     * 
    @Title: exportExcelFile
    @Description: TODO(直接导出数据源)
    @param @param request
    @param @param response
    @param @param dataFile 设定文件
    @return void 返回类型
    @throws
     */
    public static void exportExcelFile(HttpServletRequest request, HttpServletResponse response, DataFile dataFile) {
//        String encoding =defaultEncoding;
        if (dataFile == null) {
            return;
        }
        List<LinkedHashMap<String, Object>> exportData = dataFile.getData();
        String fileName = dataFile.getFileName();
        if (exportData == null || exportData.get(0) == null || StringUtils.isEmpty(fileName)) {
            return;
        }
//        if (!StringUtils.isEmpty(dataFile.getEncoding())) {
//            encoding = dataFile.getEncoding();
//        }
        // 头处理
        Set<String> headerKeySet = new LinkedHashSet<>();
        List<Header> headerList = dataFile.getHeaderList();
        if (headerList != null && headerList.size() > 0) {
            for (Header header : headerList) {
                headerKeySet.add(header.getKey());
            }
        } else {
            headerKeySet = exportData.get(0).keySet();
        }
        InputStream in = null;
        OutputStream out = null;

        // 创建workbook
        @SuppressWarnings("resource")
        HSSFWorkbook workbook = new HSSFWorkbook();
        // 添加Worksheet(不添加sheet时生成的xls文件打开时会报错)
        try {
            //.xls exlce 超过 65536 报错处理 ,拆分多个sheet
            int exportPageSize = 20000;
            int size = exportData.size();
            int page = size/exportPageSize +1;
            if (size>exportPageSize) {
                for (int i = 0; i < page; i++) {
                    List<LinkedHashMap<String,Object>> subListDate = null;
                    int pageNo =(i+1);
                    if (pageNo * exportPageSize <= size) {
                        subListDate = exportData.subList(i * exportPageSize, pageNo * exportPageSize);
                    } else {
                        subListDate = exportData.subList(i * exportPageSize, size);
                    }
                    //TODO
                    HSSFSheet sheet = workbook.createSheet(fileName+pageNo);
                    if (headerKeySet != null) {
                        createSheet(subListDate, headerKeySet, sheet);
                    } else {
                        return;
                    }
                }
            }else {
                //TODO
                HSSFSheet sheet = workbook.createSheet(fileName);
                if (headerKeySet != null) {
                    createSheet(exportData, headerKeySet, sheet);
                } else {
                    return;
                }
            }

            // response输出
            String userAgent = request.getHeader("User-Agent");
            if (userAgent.contains("MSIE") || userAgent.contains("Trident")) {
                response.setContentType(CONTENTTYPE_CSV + Constant.CHARSET_UTF_8);
                response.setHeader("Content-Disposition", "attachment;  filename=" + java.net.URLEncoder.encode(fileName + FILE_TYPE_XLS, Constant.CHARSET_UTF_8));
            } else {
                // 非IE浏览器的处理:
                response.setContentType(CONTENTTYPE_CSV + Constant.ISO8859_1);
                response.setHeader("Content-Disposition", "attachment;  filename=" + new String((fileName + FILE_TYPE_XLS).getBytes(), Constant.ISO8859_1));
            }
            out = response.getOutputStream();
            workbook.write(out);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (in != null) {
                    in.close();
                }
                if (out != null) {
                    out.close();
                }
            } catch (IOException e) {
                in = null;
                out = null;
                e.printStackTrace();
            }
        }
    }

本人使用的是方法3,由于需求急1,2 未试验。

猜你喜欢

转载自www.cnblogs.com/xingtangxiaoga/p/9724146.html