最近接到這樣的需求:原先excel導出只需要導出一個excel,需求變更爲,需要一次導出多個excel文檔。但是一個請求只能輸出一次,所以無法通過輸出流循環將excel導出。轉而改爲將excel文檔全部打包,輸出zip文檔。
代碼如下:
@RequestMapping(params = "exportXlsT")
public void exportXlsT(SeatEntity rowSeat, HttpServletRequest request, HttpServletResponse response,DataGrid dataGrid, ModelMap map) {
String rowSeatId = request.getParameter("id");
String hql = "from SeatResultEntity where 1 = 1 AND ROW_SEAT_ID = ? ";
List<SeatResultEntity> seatResultList = this.systemService.findHql(hql, rowSeatId);
String codedFileName = "模板";
String meetingName = "模板";
try {
File template = new File(this.context.getRealPath("/template"), "template.xls");
List<HSSFWorkbook> hssfWorkbookList = new ArrayList<>();
List<String> xlsNameList = new ArrayList<>();
for (int index = 0; index < seatResultList.size(); index++) {
ServletOutputStream out = response.getOutputStream();
HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(template));
if (null != seatResultList.get(index).getRowSeat()
&& null != seatResultList.get(index).getRowSeat().getMeeting()) {
meetingName = seatResultList.get(index).getRowSeat().getMeeting().getName();
}
SeatResultPage page = new SeatResultPage();
String hql0 = "from SeatPersonEntity where 1 = 1 AND SEAT_RESULT_ID = ? ";
List<SeatPersonEntity> seatPersonEntityList = systemService.findHql(hql0,
seatResultList.get(index).getId());
page.setSeatPersonList(seatPersonEntityList);
HSSFSheet sheet = workbook.getSheet("Sheet" + 1);
int j = 1;
for (int i = 0; i < seatPersonEntityList.size(); i++) {
if (seatPersonEntityList.get(i) != null) {
String depart = seatPersonEntityList.get(i).getPersonnel() == null ? ""
: seatPersonEntityList.get(i).getPersonnel().getDepart().getShortName();
if (StringUtil.isNotEmpty(seatPersonEntityList.get(i).getLeaderName())
|| StringUtil.isNotEmpty(depart)) {
if ("leaderSeat".equals(seatPersonEntityList.get(i).getSeatBase().getSeatType())) {
this.getCell(sheet, j, 0)
.setCellValue(seatPersonEntityList.get(i).getLeaderName() == null ? ""
: seatPersonEntityList.get(i).getLeaderName());
} else {
this.getCell(sheet, j, 0).setCellValue(depart);
}
if(null != seatPersonEntityList.get(i).getPersonnel()){
this.getCell(sheet, j, 1).setCellValue(seatPersonEntityList.get(i).getPersonnel().getDepart().getDepartname());
}
this.getCell(sheet, j, 2).setCellValue(seatPersonEntityList.get(i).getLeader() == null
? "" : seatPersonEntityList.get(i).getLeader().getJob());
this.getCell(sheet, j, 3)
.setCellValue(seatPersonEntityList.get(i).getSeatBase().getCode());
this.getCell(sheet, j, 4)
.setCellValue(seatPersonEntityList.get(i).getSeatBase().getSeatIp());
this.getCell(sheet, j, 5)
.setCellValue(seatPersonEntityList.get(i).getSeatBase().getCode());
/* this.getCell(sheet, j, 5)
.setCellValue(seatPersonEntityList.get(i).getSeatBase().getLabel());
*/ j++;
}
}
}
rowSeat = this.systemService.get(SeatEntity.class, rowSeat.getId());
Integer issueSort = seatResultList.get(index).getMeetingIssue().getIssueSort();
String sort = "";
if (null != issueSort) {
NumberChangeToChinese ncc = new NumberChangeToChinese();
sort = ncc.numberToChinese(issueSort);
}
workbook.setSheetName(0, "議題" + sort);
if (null != rowSeat) {
codedFileName = rowSeat.getMeeting().getName() + "標題" + sort + "模板";
meetingName = rowSeat.getMeeting().getName() + "模板";
}
xlsNameList.add(codedFileName);
if (BrowserUtils.isIE(request) || BrowserUtils.checkBrowse(request).equals("Chrome")) {
meetingName = URLEncoder.encode(meetingName, "UTF-8");
} else {
meetingName = new String(meetingName.getBytes("UTF-8"), "ISO-8859-1");
}
hssfWorkbookList.add(workbook);
}
// 2019.10.11需求變更:zip下載,一個標題導出一張excel
try {
response.setHeader("content-disposition", "attachment;filename=" + meetingName + ".zip");
response.setContentType("application/x-zip-compressed");
OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
ZipOutputStream zipOut = new ZipOutputStream(toClient);
for (int i = 0; i < hssfWorkbookList.size(); i++) {
ZipEntry entry = new ZipEntry(xlsNameList.get(i) + ".xls");
zipOut.putNextEntry(entry);
hssfWorkbookList.get(i).write(zipOut);
}
zipOut.flush();
zipOut.close();
} catch (Exception e) {
LogUtil.error(e.toString());
}
} catch (Exception e) {
e.printStackTrace();
}
}