Freemaker生成複雜樣式圖片並無文件損壞的excel

Freemaker生成複雜樣式圖片並無文件損壞的excel

參考Freemarker整合poi導出帶有圖片的Excel教程,優化程式碼實現

功能介紹:
1.支援Freemarker導出Excel的所有功能(完美導出複雜的合併單元格、合併行和列、顏色、字體等)
2.支援導出帶有圖片的Excel
3.支援多Sheet頁導出
4.支援導出單元格注釋
5.支援完美導出.xls、.xlsx格式,生成文件打開無報錯提醒
6.適用於生成複雜樣式的Excel,不適用於大數據量導出
  1. 需求背景

    企業級需求中有較多複雜樣式的excel需求,包括各種單元格合併,插入圖片,而且變更頻繁,案例如下:

     

    單純使用JAVA POI無法滿足此類開發需求。Freemarker導出的Excel為xml格式,此格式所有的富文本資訊都會丟失,只留下文本內容,不能直接導出帶有圖片的Excel。通常使用Freemaker直接將.xml重命名為.xls的方法,對複雜樣式兼容不友好,會有彈框報錯。基於此種需求,開發此工具導出帶有圖片的Excel。

  2. 依賴包
    <dependencies>
    ​
      <!-- 僅僅需要基本的starter,不需要web -->
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter</artifactId>
      </dependency>
    ​
      <!-- 模板引擎 -->
      <dependency>
          <groupId>org.freemarker</groupId>
          <artifactId>freemarker</artifactId>
          <version>2.3.28</version>
      </dependency>
    ​
      <!-- java處理Excel文件,支援excel2003 -->
      <dependency>
          <groupId>org.apache.poi</groupId>
          <artifactId>poi</artifactId>
          <version>3.17</version>
      </dependency>
    ​
      <!--支援excel2007以上,性能特別好-->
      <dependency>
          <groupId>org.apache.poi</groupId>
          <artifactId>poi-ooxml</artifactId>
          <version>3.17</version>
          <exclusions>
              <exclusion>
                  <artifactId>poi</artifactId>
                  <groupId>org.apache.poi</groupId>
              </exclusion>
          </exclusions>
      </dependency>
    ​
      <!-- java解析XML文件 -->
      <dependency>
          <groupId>dom4j</groupId>
          <artifactId>dom4j</artifactId>
          <version>1.6.1</version>
      </dependency>
    ​
      <!-- 使用其中的FileUtils工具類 -->
      <dependency>
          <groupId>commons-io</groupId>
          <artifactId>commons-io</artifactId>
          <version>2.6</version>
      </dependency>
    ​
      <dependency>
          <groupId>org.apache.commons</groupId>
          <artifactId>commons-lang3</artifactId>
          <version>3.9</version>
      </dependency>
  3. 使用步驟
    1. 參考Freemaker語法設置佔位符,將Excel文件另存為XML;

    2. 將模板XML放到項目的模板目錄中

    3. 導出效果

  4. 程式碼邏輯
    1. 使用Freemaker給佔位符賦值,生成XML文件,該XML文件中包含Excel原始樣式和所有數據;

    2. 解析XML中的Excel樣式,轉化為CellStyle;

    3. 遍歷XML的數據格式,按照讀取的CellStyle重新生成Excel;

    4. 將圖片插入到給定的單元格中;

結論:此方法的邏輯是通過Freemaker模板引擎,給預置的Excel模板動態賦值,生成中間態的XML文件,再解析該XML文件生成新的Excel文件。將複雜的樣式和數據的編輯放在模板中,通過兩次IO生成文件,不適合大數據量的導出,適合結構複雜和多樣訂製的Excel生成。

 

Tags: