EasyExcel模板填充 导出Excel

本文档详细介绍了如何使用EasyExcel进行模板填充并导出Excel,包括简单对象填充和复杂、多条数据填充的示例代码。示例中展示了如何根据ID查询数据并填充到模板中,最后通过HttpServletResponse导出到浏览器或指定目录。同时,提到了模板中变量的表示方式以及处理中文乱码的方法,并给出了处理大数据量时的注意事项。
摘要由CSDN通过智能技术生成

EasyExcel模板填充 导出Excel

参考官网easyExcel例 :https://www.yuque.com/easyexcel/doc/fill

1.简单对象填充:

/**
	 * 根据id导出Excel模板
	 * @param id
	 * @param response
	 */
    @Override
    public void exportExcelTemplateById(String id, HttpServletResponse response) throws IOException {
		// 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替
		String path = this.getClass().getClassLoader().getResource("template/lswttjXtxz.xls").getPath();
		System.out.println("path========================"+path+"======================");
		File fileTemp = new File(path);

		//查询需要导出的数据
		PageData pd = new PageData();
		pd.put("id",StringUtil2.subStrForInQuery(id));
		List<TLswttjXtxz> lswttjXtxz = tLswttjXtxzMapper.getTLswttjXtxzByMonth(pd);

		//导出直接浏览器下载
		response.reset();
		response.setContentType("application/vnd.ms-excel");
		response.setCharacterEncoding("utf-8");
		//设置要导出的文件的名字、这里URLEncoder.encode可以防止中文乱码
		String fileName = "问题统计表" + System.currentTimeMillis()+".xls";
		fileName = URLEncoder.encode(fileName, "UTF-8");
		response.setHeader("Content-Disposition", "attachment;filename=" +fileName);
		OutputStream outputStream = response.getOutputStream();

		EasyExcel.write(outputStream).withTemplate(fileTemp).sheet().doFill(lswttjXtxz.get(0));
    }

excel模板:
在这里插入图片描述
2.复杂、多条数据填充

/**
	 * 根据id导出Excel模板
	 * @param id
	 * @param response
	 */
    @Override
    public void exportExcelTemplateById(String id, HttpServletResponse response) throws IOException {
		// 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替 {} 代表普通变量 {.} 代表是list的变量
		//1.创建excel模板
		String path = this.getClass().getClassLoader().getResource("template/lswttjXtxz.xls").getPath();
		System.out.println("path========================"+path+"======================");

		//2.导出直接浏览器下载
		response.reset();
		response.setContentType("application/vnd.ms-excel");
		response.setCharacterEncoding("utf-8");
		//设置要导出的文件的名字、这里URLEncoder.encode可以防止中文乱码
		String fileName = "问题统计表" + System.currentTimeMillis()+".xls";
		fileName = URLEncoder.encode(fileName, "UTF-8");
		response.setHeader("Content-Disposition", "attachment;filename=" +fileName);
		OutputStream outputStream = response.getOutputStream();

		ExcelWriter excelWriter = EasyExcel.write(outputStream).withTemplate(path).build();

		//3.填充赋值、查询需要导出的数据
		PageData pd = new PageData();
		pd.put("id",StringUtil2.subStrForInQuery(id));
		List<TLswttjXtxz> lswttjXtxzList = tLswttjXtxzMapper.getTLswttjXtxzByMonth(pd);

		// 这里注意 入参用了forceNewRow 代表在写入list的时候不管list下面有没有空行 都会创建一行,然后下面的数据往后移动。默认 是false,会直接使用下一行,如果没有则创建。
		// forceNewRow 如果设置了true,有个缺点 就是他会把所有的数据都放到内存了,所以慎用
		// 简单的说 如果你的模板有list,且list不是最后一行,下面还有数据需要填充 就必须设置 forceNewRow=true 但是这个就会把所有数据放到内存 会很耗内存
		// 如果数据量大 list不是最后一行 参照下一个
		FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
		WriteSheet writeSheet = EasyExcel.writerSheet().build();
		excelWriter.fill(lswttjXtxzList, fillConfig, writeSheet);

		Map<String, Object> map = new HashMap<String, Object>();
		map.put("tbdw", "2019年10月9日13:28:28");
		map.put("tbsj", 1000);
		map.put("tbr", 1000);
		map.put("lxfs", 1000);
		excelWriter.fill(map, writeSheet);
		excelWriter.finish();
     }

在这里插入图片描述!
如果想要保存到指定目录,更改outputStream;以上测试没问题,可以进一步自己封装一下,封装到工具类。遇到的问题:1.pom.xml文件里面加以下内容,否则编译后classes里面模板乱码

<build>
       
		<resources>
			<resource>
				<directory>src/main/resources</directory>
				<filtering>true</filtering>
				<excludes>
					<exclude>**/*.docx</exclude>
					<exclude>**/*.xls</exclude>
				</excludes>
			</resource>
			<resource>
				<directory>src/main/resources</directory>
				<filtering>false</filtering>
				<includes>
					<include>**/*.docx</include>
					<include>**/*.xls</include>
				</includes>
			</resource>
		</resources>
    </build>

2.我用自己本地创建excel当做模板报错,可能和版本有关,粘贴到官方的excel模板例子里就可以了;

//region 数据源 List resultList = new ArrayList(); Model model = new Model(); model.setCode("01"); model.setName("测试1"); resultList.add(model); model = new Model(); model.setCode("02"); model.setName("测试2"); resultList.add(model); //endregion //获得模版 File directory = new File("src/main/resources/templates"); String templatePath = directory.getCanonicalPath(); String templateFile = templatePath + "\\template.xls"; //导出文件名 SimpleDateFormat simpl = new SimpleDateFormat("yyyyMMddHHmmss"); String currntTime = simpl.format(new Date()); String fileName = currntTime + "报表.xls"; //将结果放入 Map beans = new HashMap(); List values = new ArrayList(); values.add(resultList); beans.put("values", values); beans.put("title", "测试title"); //文件名称统一编码格式 fileName = URLEncoder.encode(fileName, "utf-8"); //生成的导出文件 File destFile = File.createTempFile(fileName, ".xls"); //transformer转到Excel XLSTransformer transformer = new XLSTransformer(); BufferedInputStream bis = null; BufferedOutputStream bos = null; try { //将数据添加到模版中生成新的文件 transformer.transformXLS(templateFile, beans, destFile.getAbsolutePath()); //将文件输入 InputStream inputStream = new FileInputStream(destFile); //设置response参数,可以打开下载页面 response.reset(); //设置响应文本格式 response.setContentType("application/vnd.ms-excel;charset=utf-8"); response.setHeader("Content-Disposition", "attachment;filename=" + new String((fileName + ".xls").getBytes(), "iso-8859-1")); //将文件输出到页面 ServletOutputStream out = response.getOutputStream(); bis = new BufferedInputStream(inputStream); bos = new BufferedOutputStream(out)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值