POI导出excel适合不太复杂的excel;如果是复杂的excel的话,那么推荐使用模板进行导出。
jxls是一个简单的、轻量级的excel导出库,使用特定的标记在excel模板文件中来定义输出格式和布局。
注:jxls类似于jsp标准标签库jstl。
模板导出excel步骤分析:
先读取加载模板xls或xlsx文件,然后根据模板里面的jxls来将数据定向写入jxls中指定的对应位置。
这里先给出几种jxls的简单运用(示例):
基本循环:
${hero.name}
基本循环(有下标的循环):
${status.index}
隔行变色(for循环+if判断):
${hero.name}
${hero.name}
本次示例软硬件环境:
JDK1.8、Eclipse、Windows7、SpringBoot2.0.3.RELEASE、jxls-core.jar1.0.6
net.sf.jxls
jxls-core
1.0.6
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.springframework.stereotype.Component;
import net.sf.jxls.exception.ParsePropertyException;
import net.sf.jxls.transformer.XLSTransformer;
/**
* 导出excel的工具类
*
* @author JustryDeng
* @date 2018年7月24日 下午5:49:17
*/
@Component
public class ExcelExportUtil {
/**
* excel导出实现方法
*
* @param srcFilePath
* 模板xls或xlsx文件路径
* @param list1
* 模板xls中对应要用到的集合;
* @param list2
* 模板xls中对应要用到的集合;
* @param destFilePath
* 生成的xls或xlsx文件路径;
* @date 2018年7月24日 下午6:29:14
*/
public void createExcel(String srcFilePath, List> list1, List> list2, String destFilePath) {
/* ********我们也可以使用相对路径来定位 读取模板文件,或放置生成的文件******** */
// 根据类加载器,获取URL
// URL url = this.getClass().getClassLoader().getResource("");
// 获取到项目的classes目录(如:'D:/java/Abc_ExportExcelByTemplate/target/classes/')
// String srcPath = url.getPath();
/* ********************************************************* */
// 创建XLSTransformer对象
XLSTransformer transformer = new XLSTransformer();
Map beanParams = new HashMap();
// 将要用到的list集合,按对应模板中的名字,放入map中
beanParams.put("list1", list1);
beanParams.put("list2", list2);
try {
// 生成Excel文件
transformer.transformXLS(srcFilePath, beanParams, destFilePath);
} catch (ParsePropertyException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InvalidFormatException e) {
e.printStackTrace();
}
}
}
excel导出测试一(以对象模型来容纳数据):
先给出需要用到的对象:
/**
* 用户实体类模型
*
* @author JustryDeng
* @date 2018年7月24日 下午1:55:59
*/
public class User {
/** 姓名 */
private String name;
/** 年龄 */
private Integer age;
/** 性别 */
private String gender;
/** 座右铭 */
private String motto;
public User() {
}
public User(String name, Integer age, String gender, String motto) {
super();
this.name = name;
this.age = age;
this.gender = gender;
this.motto = motto;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getMotto() {
return motto;
}
public void setMotto(String motto) {
this.motto = motto;
}
}
测试代码为:
public static void main(String[] args) {
// xls模板全限定名
String templateFileName = "C:\\Users\\dengshuai.ASPIRE\\Desktop\\template.xls";
// 生成的xls全限定名
String destFileName = "C:\\Users\\dengshuai.ASPIRE\\Desktop\\屌丝基本信息Object.xls";
List list = new ArrayList();
User u1 = new User("u1", 11, "男", "我是u1~");
User u2 = new User("u2", 12, "男", "我是u2~");
User u3 = new User("u3", 13, "男", "我是u3~");
User u4 = new User("u4", 14, "男", "我是u4~");
list.add(u1);
list.add(u2);
list.add(u3);
list.add(u4);
// 调用excel工具,生成excel
new ExcelExportUtil().createExcel(templateFileName, list, list, destFileName);
}
注:本次测试时,模板文件路径写的是绝对路径;在实际使用时,可根据项目所在位置,使用相对路
径(获取项目classes文件路径的方式,见工具类中的相应注释)。
注:为快速测试,模板中涉及到的list1和list2,在测试时,本人都是传的同一个list。
生成的excel为:
注:生成的excel的数据样式与模板中对应的格式一致。
excel导出测试二(以Map来容纳数据):
public static void main(String[] args) {
// xls模板全限定名
String templateFileName = "C:\\Users\\dengshuai.ASPIRE\\Desktop\\template.xls";
// 生成的xls全限定名
String destFileName = "C:\\Users\\dengshuai.ASPIRE\\Desktop\\屌丝基本信息Map.xls";
List
注:本次测试时,模板文件路径写的是绝对路径;在实际使用时,可根据项目所在位置,使用相对路径
(获取项目classes文件路径的方式,见工具类中的相应注释)。
注:为快速测试,模板中涉及到的list1和list2,在测试时,本人都是传的同一个list。
生成的excel打开为:
注:生成的excel的数据样式与模板中对应的格式一致。
提示:如果想使用模板导出更多样式的excel,那么可以先去熟悉一下jxls。