EasyPoi 使用html模板導出Excel
總體思路如下
1、編寫freemarker(.ftl)頁面模版
2、將數據渲染到模板中生成html
3、將html轉換成Excel表格
依賴
使用springboot集成的包
<!--easy poi-->
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-spring-boot-starter</artifactId>
<version>4.1.2</version>
</dependency>
<!--freemarker 模板-->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
<!--html轉Excel是 easypoi添加了的依賴,不加這個會出現 ClassNotFoundException-->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.12.1</version>
</dependency>
如果不使用springboot,請替換成如下依賴(具體版本可自己上maven倉庫查尋)
<!--easypoi依賴-->
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-web</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-annotation</artifactId>
<version>4.1.0</version>
</dependency>
編寫freemarker(.ftl)頁面模版
freemarker語法可自行百度(於JSP有點類似)、這裏提供簡單的取值、循環模版
<html>
<head>
<title>excelpoi 測試</title>
</head>
<body>
<!-- 這裏有個坑、要設置sheetName屬性 否則會出錯 提示屬性未設置 -->
<!-- 所有的樣式要寫行內css纔會顯示到Excel表格中去 -->
<!-- 可以多個table 多個table就是相當於多個sheet -->
<!-- 單元格合併之類的操作都會被搬到Excel中去 -->
<table sheetName="sheetName">
<tbody>
<tr>
<td style="width: 20px;">姓名</td>
<td style="width: 15px;">性別</td>
<td style="width: 30px;">生日</td>
</tr>
<#list students as stu>
<tr>
<td>${stu.name}</td>
<td>${stu.gender}</td>
<td>${stu.birthday?string["yyyy-MM-dd HH:mm:ss"]}</td>
</tr>
</#list>
</tbody>
</table>
</body>
</html>
文件保存未 .ftl 後綴
將數據渲染到模板中生成html並轉換成Excel
將所有模版丟到一個文件夾裏
// 第一步:創建一個Freemarker的配置類對象(可以用單例)(全路徑爲:freemarker.template.Configuration;注意名字可能會和spring的有點衝突)
Configuration configuration = new Configuration(Configuration.getVersion());
// 第二步:設置模板文件所在的路徑(相對路徑,絕對路徑都可以,自己把握)。
configuration.setDirectoryForTemplateLoading(new File("/xxx/xxx/templates"));
// 第三步:設置模板文件使用的字符集。一般就是utf-8.
configuration.setDefaultEncoding("utf-8");
// 第四步:加載一個模板,創建一個模板對象(上面定義的模版文件名)。
Template template = configuration.getTemplate("test.ftl");
// 創建輸出流
Writer out = new FileWriter(new File("/xxx/test.html"));
// 渲染數據並輸出
template.process(result, out);
// 關閉流
out.close();
// 到這一步html已經渲染完畢、讀取html將其轉換成Excel
StringBuilder html = new StringBuilder();
Scanner s = new Scanner(new File("/xxx/xxx/test.html"), "utf-8");
while (s.hasNext()) {
html.append(s.nextLine());
}
s.close();
// ExcelType.XSSF 表示 .xlsx格式;ExcelType.HSSF 表示 .xls格式
Workbook workbook = ExcelXorHtmlUtil.htmlToExcel(html.toString(), ExcelType.XSSF);
for (int i = 0,len = workbook.getNumberOfSheets();i < len;i++){
// 這個操作是設置凍結首行
// 可填4個參數 前兩個參數是你要用來拆分的列數和行數。後兩個參數是下面窗口的可見象限,其中第三個參數是右邊區域可見的左邊列數,第四個參數是下面區域可見的首行
workbook.getSheetAt(i).createFreezePane(0,1);
}
//存放位置輸出流
FileOutputStream fos = new FileOutputStream("/xxx/xxx/"+System.currentTimeMillis()+".xlsx");
workbook.write(fos);
fos.close();
// Excel文件生成結束、會有兩個文件、一個html文件一個Excel文件,可根據自己的業務進行操作
更多easypoi的操作可以百度官方文檔查閱(有提供Excel裝html的,適用於產品丟個模版過來,我們生成一個ftl的模板;MVC之類的)
文檔中提到有個Excel模板導出的做法,試了一遍很多坑,比如遍歷的操作
語法如下:{{$fe: mapList t t.id}}
它的鍵名t改了沒有效果 然後多行遍歷也跑不起來、可能是我寫法有問題,感覺很多坑,用html模板來的熟練點
效果圖就不貼了、沒啥內容,就一行標題,幾行數據