核心代码:
1.创建准备输出的excel文件并填充内容
2.设置输出流
// 准备将Excel的输出流通过response输出到页面下载
// 八进制输出流
response.setContentType("application/octet-stream");
// 设置导出zip的名称
response.setHeader("Content-Disposition","attachment;filename=历史数据表.zip");
3.完成zip流返回
// 压缩文件流
ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream());
// 将生成excel转化为输入流返回
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ByteArrayInputStream swapStream = null;
try {
workbook.write(outputStream);
swapStream = new ByteArrayInputStream(outputStream.toByteArray());
} catch (IOException e) {
e.printStackTrace();
}
byte[] buffer = new byte[5*1024];
int length = 0;
// 将文件夹放入zip中
zipOut.putNextEntry(new ZipEntry("历史数据表.xls"));
while ((length = swapStream.read(buffer)) != -1) {
zipOut.write(buffer,0,length);
}
swapStream.close();
// 关闭zip文件中之前打开的项
zipOut.closeEntry();
zipOut.close();
代码示例:
// 声明一个工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
// 生成一个表格,设置表格名称
HSSFSheet sheet = workbook.createSheet("历史数据表");
// 设置表格列宽度为10个字节
sheet.setDefaultColumnWidth(10);
// 创建标题的显示样式
HSSFCellStyle headerStyle = workbook.createCellStyle();
headerStyle.setFillForegroundColor(IndexedColors.YELLOW.index);
headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
// 创建第一行表头
HSSFRow headrow = sheet.createRow(0);
// 遍历添加表头
for (int i = 0; i < header.length; i++) {
// 创建一个单元格
HSSFCell cell = headrow.createCell(i);
// 创建一个内容对象
HSSFRichTextString text = new HSSFRichTextString(header[i]);
// 将内容对象的文字内容写入到单元格中
cell.setCellValue(text);
cell.setCellStyle(headerStyle);
}
// 每行的数据
for (int j = 0; j < results.size(); j++) {
// 创建一行
HSSFRow row1 = sheet.createRow(j + 1);
// 该行对应的数据
List<FieldInfo> list2 = (List<FieldInfo>) results.get(j).get("FieldInfo");
if (list2 != null && list2.size() > 0) {
row1.createCell(0).setCellValue(results.get(j).get("time") == null ? ""
: new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date((long) results.get(j).get("time"))));
row1.createCell(1).setCellValue(results.get(j).get("recieveTime") == null ? ""
: new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date((long) results.get(j).get("recieveTime"))));
if (((String) results.get(j).get("type")).equals("02")) {
row1.createCell(2).setCellValue("实时数据");
} else if (((String) results.get(j).get("type")).equals("03")) {
row1.createCell(2).setCellValue("补发数据");
}
// 每列的数据
DbcParamdetails dbcParamdetails = null;
boolean flag = true;
for (int k = 3; k < headerId.length; k++) {
for (FieldInfo fieldInfo : list2) {
// 为每一列赋值
if (headerId[k].equals(fieldInfo.getId())) {
row1.createCell(k).setCellValue(fieldInfo.getValue());
if(fieldInfo.getValue() != null) {
flag = false;
}
}
}
if(flag) {
row1.createCell(k).setCellValue("-");
}
flag = true;
}
}
}
// 准备将Excel的输出流通过response输出到页面下载
// 八进制输出流
response.setContentType("application/octet-stream");
// 设置导出Excel的名称
//response.setHeader("Content-disposition", "attachment;filename=历史数据表.xls");
// 设置导出zip的名称
response.setHeader("Content-Disposition","attachment;filename=历史数据表.zip");
// 刷新缓冲
response.flushBuffer();
// workbook将Excel写入到response的输出流中,供页面下载
//workbook.write(response.getOutputStream());
// 压缩文件流
ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream());
// 将生成excel转化为输入流返回
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ByteArrayInputStream swapStream = null;
try {
workbook.write(outputStream);
swapStream = new ByteArrayInputStream(outputStream.toByteArray());
} catch (IOException e) {
e.printStackTrace();
}
byte[] buffer = new byte[5*1024];
int length = 0;
// 将文件夹放入zip中
zipOut.putNextEntry(new ZipEntry("历史数据表.xls"));
while ((length = swapStream.read(buffer)) != -1) {
zipOut.write(buffer,0,length);
}
swapStream.close();
// 关闭zip文件中之前打开的项
zipOut.closeEntry();
zipOut.close();