POI--使用输出流向前端返回excel文件 (方法一)

poi向前端返回excel,有两种方法,先介绍简单粗暴的,就是最常用的直接用流向浏览器返回文件,比较简单粗暴,前端直接使用get方法即可,主要是后台的操作。

前端页面:

window.location.href="这里写路径,有参数的话也可以带上";

后台java代码,注意一下火狐浏览器的文件名的特殊处理:

/**
	 * 下载材料excel方法1,该方法暂时没启用 2020年3月12日 14:33:26
	 * excel 
	 * @param req
	 * @param res
	 */ 
	@RequestMapping(method={RequestMethod.GET, RequestMethod.POST,RequestMethod.HEAD},value="getMaterialsExcel",produces="application/json")
	public void getMaterialsExcel(HttpServletRequest req,HttpServletResponse res){
		ServletOutputStream sos = null;
		try{
			logger.debug("************************开始下载材料excel*******************");
			// 不用分页了,注意要带上过滤条件
			Map<String, Object> param = new HashMap<String,Object>(); // 查询的过滤条件     
			param.put("productName", req.getParameter("productName"));
			param.put("model", req.getParameter("model"));
			param.put("productStatus", req.getParameter("productStatus"));
			
			res.setContentType("application/json");
	        res.setCharacterEncoding("utf-8");
	        // service中得到具体业务相关的HSSFWorkbook
	        HSSFWorkbook wb = downloadExcelService.getMaterialsExcel(param);
	        
			String fileName = "测试测试.xls";
			
			String agent = req.getHeader("USER-AGENT").toLowerCase();
			String uncodeFileNameString = "";
			if(agent.contains("firefox")){
				// 火狐
				uncodeFileNameString = "=?UTF-8?B?" + (new String(Base64Utils.encodeToString(fileName.getBytes("UTF-8")))) + "?=";
				logger.debug("火狐浏览器");
			}else{
				// 其他
				uncodeFileNameString = URLEncoder.encode(fileName, "UTF-8");
				uncodeFileNameString = uncodeFileNameString.replace("+", "%20"); // 空格被转为了 "+" ,要转成utf-8的空格符号 "%20"
				logger.debug("不是火狐浏览器");
			}
			res.setContentType("application/octet-stream;charset=UTF-8");
			res.setHeader("Content-disposition", "attachment; filename=" + uncodeFileNameString);	
			sos = res.getOutputStream();
			wb.write(sos);
		}catch(Exception e){
			e.printStackTrace();
			logger.error("下载材料excel时异常:  ", e);
		}finally{
			if(sos != null){
				try {
					// sos是字节流,不用flush了,直接close
					sos.close();
				} catch (IOException e) {
					e.printStackTrace();
					logger.error("未正确关闭sos");
				}
			}
		}
	}

以上方法比较简单,缺点也是有的,最大的缺点是前端不能监控下载进度,无法显示loading进度条,用户容易多次点击下载按钮,很难做控制,就算在后台做并发处理,但是还是对服务器有一定的压力,因此再介绍第二种方法,写在下一篇文章吧

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
poi-tl是一个基于POI的模板引擎,可以用于动态生成Excel文档。下面是使用poi-tl动态导出Excel的步骤: 1. 导入poi-tl的依赖包。 2. 创建Excel模板文件,可以使用Microsoft Excel软件创建一个模板文件,然后在模板中使用poi-tl的标签进行动态生成。 3. 在Java代码中,使用poi-tl的API读取模板文件,并进行数据填充。 4. 将填充好数据的Excel文件保存到指定路径。 下面是一个使用poi-tl动态导出Excel的示例代码: ```java import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.util.IOUtils; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.XWPFRun; import org.apache.poi.xwpf.usermodel.XWPFTable; import org.apache.poi.xwpf.usermodel.XWPFTableRow; import org.apache.poi.xwpf.usermodel.XWPFTableCell; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.XWPFRun; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.util.HashMap; import java.util.List; import java.util.Map; public class ExcelExportUtil { public static void main(String[] args) { try { // 读取模板文件 InputStream is = new FileInputStream("template.xlsx"); Workbook workbook = new XSSFWorkbook(is); // 获取模板中的Sheet Sheet sheet = workbook.getSheetAt(0); // 定义数据 List<Map<String, Object>> dataList = getDataList(); // 填充数据 int rowIndex = 1; // 从第二行开始填充数据 for (Map<String, Object> data : dataList) { Row row = sheet.createRow(rowIndex++); int cellIndex = 0; for (String key : data.keySet()) { Cell cell = row.createCell(cellIndex++); cell.setCellValue(data.get(key).toString()); } } // 保存文件 OutputStream os = new FileOutputStream("output.xlsx"); workbook.write(os); os.close(); System.out.println("Excel导出成功!"); } catch (Exception e) { e.printStackTrace(); } } private static List<Map<String, Object>> getDataList() { // 模拟数据 List<Map<String, Object>> dataList = new ArrayList<>(); Map<String, Object> data1 = new HashMap<>(); data1.put("name", "张三"); data1.put("age", 20); data1.put("gender", "男"); dataList.add(data1); Map<String, Object> data2 = new HashMap<>(); data2.put("name", "李四"); data2.put("age", 25); data2.put("gender", "女"); dataList.add(data2); return dataList; } } ``` 请注意,上述代码中的"template.xlsx"是模板文件的路径,"output.xlsx"是导出的Excel文件的路径。你需要根据实际情况修改这两个路径。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值