EasyPoi 使用html模板導出Excel

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模板來的熟練點

效果圖就不貼了、沒啥內容,就一行標題,幾行數據

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章