zoukankan      html  css  js  c++  java
  • 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 未试验。

  • 相关阅读:
    window.location.href问题,点击,跳转到首页
    JS indexOf() lastIndexOf()与substring()截取字符串的区别
    原来的方法增加参数时,必须为新增的参数加个默认值
    Chrome不支持本地Ajax请求解决?
    Smarty中{literal}的使用详解
    windows不能在本地计算机启动apache
    Apache虚拟主机配置
    wamp环境网站根目录更改
    Java 读书笔记 (十三) for each 循环
    Java 读书笔记 (十二) Java Character 类
  • 原文地址:https://www.cnblogs.com/xingtangxiaoga/p/9724146.html
Copyright © 2011-2022 走看看