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();。但还是抛异常。
求高手解答