Poi高效导出Excel模板

6 篇文章 0 订阅

前言

   项目中做报表,导入导出Excel,是常见也是不可或缺的功能,本文讲解导出Excel的写法,以及导出大数据量(50万起步)的优化方案

Poi高效导出Excel模板

public void exportExcel(){
List<List<Object>> excelDataResult = new CopyOnWriteArrayList<>(new ArrayList<>()); //Excel对应行的数据
		final String EXCEL_NAME ="导出的表名";
		List<Map<String, Object>> tempDataList = getExportData(); //获取导出数据
		List<Object> headExcelKey = new ArrayList<>();   //获取导出表头key容器  目的为了动态获取对应数据
		List<Object> headExcelValue = new ArrayList<>(); //获取Excel表头value容器导出   目的作为表头
		getHeaderKeyAndValue(headExcelValue, headExcelKey); //获取excel的表头key与value
		excelDataResult.add(headExcelValue); //加入导出Excel头信息
		SXSSFWorkbook sxssfWorkbook = getSheetsData(excelDataResult, EXCEL_NAME, tempDataList, headExcelKey);//获取excelData
		exportRelationExcel(EXCEL_NAME, sxssfWorkbook); //导出excel
}

	private void exportRelationExcel(String EXCEL_NAME, SXSSFWorkbook sxssfWorkbook) {
		response.setContentType("application/vnd.ms-excel");
		String fileName = EXCEL_NAME+"-"+df.format((new Date()))+".xlsx";
		String finalFileName ;
		try {
			if (StringUtils.contains(userAgent, "MSIE")) {
				finalFileName = URLEncoder.encode(fileName, "UTF8");
			} else if (StringUtils.contains(userAgent, "Mozilla")) {
				finalFileName = new String(fileName.getBytes("GBk"), "ISO-8859-1");
			} else {
				finalFileName = URLEncoder.encode(fileName, "UTF8");
			}
			response.setHeader("Content-disposition", "attachment;filename=" + finalFileName);
			OutputStream outputStream = response.getOutputStream();
			sxssfWorkbook.write(outputStream);
			outputStream.flush();
			outputStream.close();
		} catch (IOException e) {
			logger.error("导出失败,失败原因:{}");e.printStackTrace();
		}
	}
	
	private SXSSFWorkbook getSheetsData(List<List<Object>> excelDataResult, String EXCEL_NAME, List<Map<String, Object>> tempDataList, List<Object> headExcelKey) {
		SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook();
		Sheet sheet = sxssfWorkbook.createSheet(EXCEL_NAME);
		if(!tempDataList.isEmpty()&&tempDataList.size()>0){
			tempDataList.forEach(tempData->{
				List<Object> headExcelData = new ArrayList<>();
				headExcelKey.forEach(key->{
					headExcelData.add(tempData.get(key));
				});
				excelDataResult.add(headExcelData);
			});
		}
		for (int i = 0; i < excelDataResult.size(); i++) {
			Row row = sheet.createRow(i);
			List<Object> cellValue = excelDataResult.get(i);
			for (int j = 0; j < cellValue.size(); j++) {
				row.createCell(j).setCellValue(String.valueOf(null==cellValue.get(j)?"":cellValue.get(j)));
			}
		}
		return sxssfWorkbook;
	}
	
	
	private void getHeaderKeyAndValue(List<Object> headExcelValue, List<Object> headExcelKey) {
		Map<String,Object> headerMap = new LinkedHashMap<String,Object>();
		headerMap.put("name","姓名");
		headerMap.put("age","年龄");
		headerMap.put("phone","手机号码");
		headerMap.put("city","所在城市");
		headerMap.put("area","地区");
		headerMap.put("status","状态");
		headerMap.put("crateTime","创建日期");
		headerMap.put("createBy","创建人");
		headerMap.put("updateBy","修改人");
		headerMap.put("updateTime","更新日期");
		for(Map.Entry<String,Object> entry: headerMap.entrySet()){
			String key = entry.getKey();
			Object value = entry.getValue();
			headExcelValue.add(value);
			headExcelKey.add(key);
		}
	}


private List<Map<String, Object>> get() {
		String queryExportDataSql = "select name ,age,phone,city,area,status,crate_time as crateTime,create_by as createBy,update_by as updateBy,update_time as updateTime from user_info";
		return jdbcTemplate.queryForList(queryRelationSql);
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值