【本案例基于spring boot架构】
一、需求介绍
给定一个Excel模板,在指定位置插入数据,然后将生成的excel导出。
二、实现方法介绍
1、准备Excel模板
模板中要插入数据的地方用“${...}"代替(其实就是占位符,与mybatis的sql语法占位符一样),
2、代码实现(可移植)
本案例用到的jar包依赖如下:
<dependency>
<groupId>net.sf.jxls</groupId>
<artifactId>jxls-core</artifactId>
<version>1.0.3</version>
</dependency>
/**
* 根据Excel模板导出Excel
*
* @param data:要放入Excel模板中的数据
* @param response
* @Param fileName:下载 的文件名(不带后缀)
* @Param templete:模板名(带后缀)
*/
public static void exportExcelFromTemplete(String templeteName, String fileName, Map<String, Object> data, HttpServletResponse response) {
String dir = System.getProperty("user.dir");
String excelTempletePath = dir + File.separator + "src" + File.separator + "main" + File.separator + "resources" + File.separator + "templates";
response.reset();
//设置下载文档格式
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
response.setHeader("Content-disposition", "attachment; filename=" + fileName + ".xlsx");
try {
//创建临时导出文件
File tempFile = File.createTempFile(fileName, ".xlsx");
/**
* 利用XLSTransform转到Excel
*/
XLSTransformer transformer = new XLSTransformer();
/**
* templete:模板文件
* tempFile.getAbsolutePath():临时文件的绝对地址
*/
String templete = excelTempletePath + File.separator + templeteName;
//开始转换到Excel,并写入数据(写入数据的核心代码)
transformer.transformXLS(templete, data, tempFile.getAbsolutePath());
BufferedOutputStream outputStream = null;
BufferedInputStream inputStream = null;
inputStream = new BufferedInputStream(new FileInputStream(tempFile));
outputStream = new BufferedOutputStream(response.getOutputStream());
byte[] buffer = new byte[inputStream.available() + 1024];
int len = 0;
while ((len = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, len);
}
outputStream.close();
inputStream.close();
/**
* 下载完成删除临时文件
*/
tempFile.delete();
} catch (IOException e) {
e.printStackTrace();
} catch (InvalidFormatException e) {
e.printStackTrace();
}
}
说明:Map中的数据,其键(key)要和Excel表中要插入的数据${*}中的*一一对应。
如: 当像map中插入这条数据后,调用上面的方法,就可以生成自己需要的Excel。
本案例生成的Excel如下图所示:
ps:以上代码可以直接拷贝使用,只是要注意依赖包的导入不要忘记,如有报错,欢迎交流。