日期:2014-05-19  浏览次数:20804 次

Apache 的zipOutputStream write error错误
Java code
public static InputStream writeExcel(ArchiveVO archiveVO, List<ArchiveDatatypeVO> archiveDatatypeVOList, String filePath , DataTypeMgtService dataTypeMgtService, DataArchiveMgtService dataArchiveMgtService) throws Exception {
        InputStream inputStream = null;
        //创建输出文件
        File file = new File(filePath , archiveVO.getName()+".zip");
        if(!file.exists()){
            file.createNewFile();
        }else{
            file.delete();
        }
        //定义压缩输出流,用来输出到压缩文件中
        ZipOutputStream zos = new ZipOutputStream(file);
        ZipEntry entry = null;
        for (ArchiveDatatypeVO advo : archiveDatatypeVOList) {
            //查到要写入到当前工作簿的数据和数据类型的指标项。
            List<DatatypeAttributeVO> davos = dataTypeMgtService.getDatatypeAttributeVOByDatatypeIdVO(advo.getDatatypeIdVO().getId());
            List<Map<String,String>> datas = dataArchiveMgtService.getArchiveDataByArchiveDatatypeId(advo,davos);
            //根据数据量来判断需要多少个sheet来存储数据
            int sheetNum = (datas.size() + StatusUtil.EXCELMAXROW - 1) / StatusUtil.EXCELMAXROW;
            //创建工作薄对象
            XSSFWorkbook wb = new XSSFWorkbook();
            //开始迭代sheet
            for(int s = 0; s < sheetNum; s++){
                int rowNum = 0;
                if(s == sheetNum - 1){
                    rowNum = datas.size() % StatusUtil.EXCELMAXROW;
                }
                XSSFSheet sheet = wb.createSheet("sheet" + s );
                //将指标项列表的显示名称写入到sheet中的首行
                XSSFRow firstRow = sheet.createRow(0);
                for (int d = 0; d < davos.size(); d ++) {
                    XSSFCell cell = firstRow.createCell(d);
                    cell.setCellValue(davos.get(d).getDisplayName());
                }
                //迭代数据,List中的每条数据做为一行,而Map中的数据放到一个Cell里
                for(int i = 0; i < datas.size(); i++){
                    XSSFRow row = sheet.createRow(i + 1);
                    Map<String, String> map = datas.get(i);
                    for(int d = 0; d < davos.size(); d ++){
                        DatatypeAttributeVO davo = davos.get(d);
                        XSSFCell cell = row.createCell(d);
                        cell.setCellValue(map.get(davo.getName()));
                    }
                }
                
            }
            //将excel压缩到压缩文件中
            entry = new ZipEntry(advo.getDatatypeIdVO().getName()+".xlsx");
            zos.putNextEntry(entry);
            zos.setEncoding("gbk");
            //将excel直接写入到压缩文件中
            wb.write(zos);
            zos.closeEntry();
        }
        zos.close();
        inputStream = new FileInputStream(file);
        
        return inputStream;
    }

需求:将数据库中的数据导出到excel里,由于会导成多个excel,所以我就放在了压缩包里,
问题:当执行到zos.putNextEntry(entry);这句,第一次执行的时候还没异常,第二次执行就出错,看了下api说这个方法会关闭之前打开的ZipEntry,并开始新的,所以我试着注释掉了 zos.closeEntry();。但还是抛异常。


求高手解答

------解决方案--------------------
应该是文件没有正确结束吧