使用xls或xlsx模板导出Excel

POI导出excel适合不太复杂的excel;如果是复杂的excel的话,那么推荐使用模板进行导出。

jxls介绍:

      jxls是一个简单的、轻量级的excel导出库,使用特定的标记在excel模板文件中来定义输出格式和布局。

      注:jxls类似于jsp标准标签库jstl。

模板导出excel步骤分析:

      先读取加载模板xls或xlsx文件,然后根据模板里面的jxls来将数据定向写入jxls中指定的对应位置。

 

这里先给出几种jxls的简单运用(示例)

基本循环:
<jx:forEach items="${list1}" var="hero">
      ${hero.name}
</jx:forEach>


基本循环(有下标的循环):
<jx:forEach items="${list1}" var="hero" varStatus="status">
     ${status.index}
</jx:forEach>


隔行变色(for循环+if判断):
<jx:forEach items="${list1}" var="hero" varStatus="status">

	<jx:if test="${status.index%2==0}">
      		 ${hero.name}
	</jx:if>

	<jx:if test="${status.index%2==1}">
     		 ${hero.name}
	</jx:if>
	
</jx:forEach>

 

SpringBoot使用模板excel文件,导出excel文件示例

本次示例软硬件环境:

     JDK1.8、Eclipse、Windows7、SpringBoot2.0.3.RELEASE、poi.jar3.17、poi-ooxml.jar3.17、jxls-core.jar1.0.6

准备工作

在pom.xml中引入相关依赖

扫描二维码关注公众号,回复: 2927880 查看本文章
<!-- poi -->
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi</artifactId>
	<version>3.17</version>
</dependency>

<!-- poi-ooxml -->
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi-ooxml</artifactId>
	<version>3.17</version>
</dependency>

<!-- jxls-core -->
<dependency>
	<groupId>net.sf.jxls</groupId>
	<artifactId>jxls-core</artifactId>
	<version>1.0.6</version>
</dependency>

 

使用jxls创建模板xls或xlsx文件(即:excel文件)模板

 

根据自己的实际情况,编写工具类

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<String, Object> beanParams = new HashMap<String, Object>();
		// 将要用到的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测试

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<User> list = new ArrayList<User>();

		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<Map<String, Object>> list = new ArrayList<Map<String, Object>>();

		Map<String, Object> map1 = new HashMap<String, Object>();
		map1.put("name", "u1");
		map1.put("age", 11);
		map1.put("gender", "男");
		map1.put("motto", "我是u1~");

		Map<String, Object> map2 = new HashMap<String, Object>();
		map2.put("name", "u2");
		map2.put("age", 12);
		map2.put("gender", "男");
		map2.put("motto", "我是u2~");

		Map<String, Object> map3 = new HashMap<String, Object>();
		map3.put("name", "u3");
		map3.put("age", 13);
		map3.put("gender", "男");
		map3.put("motto", "我是u3~");

		Map<String, Object> map4 = new HashMap<String, Object>();
		map4.put("name", "u4");
		map4.put("age", 14);
		map4.put("gender", "男");
		map4.put("motto", "我是u4~");

		list.add(map1);
		list.add(map2);
		list.add(map3);
		list.add(map4);
		// 调用工具
		new ExcelExportUtil().createExcel(templateFileName, list, list, destFileName);
	}

注:本次测试时,模板文件路径写的是绝对路径;在实际使用时,可根据项目所在位置,使用相对路径(获取项目classes文件路径的方式,见工具类中的相应注释)。

注:为快速测试,模板中涉及到的list1和list2,在测试时,本人都是传的同一个list。

生成的excel打开为:

注:生成的excel的数据样式与模板中对应的格式一致。

 

微笑提示:如果想使用模板导出更多样式的excel,那么可以先去熟悉一下jxls。

微笑参考https://blog.csdn.net/csdnbenbenchong/article/details/7085124

微笑代码托管链接https://github.com/JustryDeng/PublicRepository

微笑如有不当之处,欢迎指正

微笑本文已经被收录进《程序员成长笔记(二)》,作者JustryDeng

猜你喜欢

转载自blog.csdn.net/justry_deng/article/details/81190244
今日推荐