java实现下载excel文件并以压缩包的形式返回

核心代码:

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();
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值