1、導包
在pom.xml中加入依賴如下:
<dependency> <groupId>org.jxls</groupId> <artifactId>jxls</artifactId> <version>2.4.7</version> </dependency> <dependency> <groupId>org.jxls</groupId> <artifactId>jxls-poi</artifactId> <version>1.0.16</version> </dependency>
2、創建導出Excel的模板,實例如下:圖1中的表達式(jx:each(items="object",var="order",lastCell="E4")),此處的object要與JxlsExporter.java中返回的集合的“鍵”保持一,下面給出可處理父子級關系的批注展示,類似於jstl中的each
圖1 父級數據
圖2 子級數據
圖3 頭部批注
說明:通過批注的形式,指定“作用域”范圍,上圖中lastCell表示在該坐標內輸入表達式有效。
3、獲取列表數據,並導出Excel,JxlsExporter.java 代碼如下
package com.inmansoft.base.util; //template模板路徑 import com.inmansoft.base.model.plan.LsBaseOrder; import com.inmansoft.base.model.plan.LsDeptOrder; import lombok.extern.slf4j.Slf4j; import org.jxls.common.Context; import org.jxls.transform.poi.PoiContext; import org.jxls.util.JxlsHelper; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import java.util.Random; /** * <p>title:</p> * <p>description:</p> * * @author: zsj * @date Created in 2019-01-06 * @modified By zsj */ @Slf4j public class JxlsExporter { private static String template = "leadshow.xls"; private static String output = "target/export_leadshow.xls"; public static void main(String[] args) throws IOException { log.info("導出數據"); execute(); } public static void execute() throws IOException { List<LsBaseOrder> lsBaseOrders = createLsBaseOrders(6); log.info("Opening input stream"); //template 為模板路徑:eg:leadshow.xls, // JxlsExporter.class.getResourceAsStream(template)—> leadshow.xls模板路徑需放置在該類包路徑下 try (InputStream is = JxlsExporter.class.getResourceAsStream(template)) { //output 為導出的Excel路徑,有一個坑需要注意的是,在springboot項目打包成jar包之后, //導出文件路徑可這樣表示: System.getProperty("user.dir") + "/export_leadshow.xls",這種"static/export_leadshow.xls"路徑會失效 try (OutputStream os = new FileOutputStream(output)) { Context context = new PoiContext(); context.putVar("object", lsBaseOrders); JxlsHelper.getInstance().processTemplate(is, os, context); } } } public static List<LsBaseOrder> createLsBaseOrders(int num) { List<LsBaseOrder> lsBaseOrders = new ArrayList<>(); Random random = new Random(); for (int i = 1; i <= num; i++) { LsBaseOrder item = new LsBaseOrder(); item.setItemName("2835 LED硬燈條" + i); item.setItemSpec("60珠 8500K"); item.setSimpleCode("簡碼-" + i); item.setCompanyName("華為公司"); List<LsDeptOrder> lsDeptOrders = new ArrayList<>(); item.setChildren(lsDeptOrders); for (int j = 1; j <= random.nextInt(10); j++) { LsDeptOrder deptOrder1 = new LsDeptOrder(); deptOrder1.setItemName("變壓器" + j); deptOrder1.setFullNum(12); lsDeptOrders.add(deptOrder1); } lsBaseOrders.add(item); } return lsBaseOrders; } }
模板路徑如下:(與上面Java類包路徑一致)