EasyPOI 教程以及完整工具類的使用


因為項目的原因需要用到POI來操作Excel 文檔,以前都是直接使用POI來操作的,但是最近聽到easypoi的存在,所以自己簡單的嘗試了下! 別說,他還真的挺好用的

Easypoi介紹

Easypoi 為誰而開發

不太熟悉poi的
不想寫太多重復太多的
只是簡單的導入導出的
喜歡使用模板的
都可以使用easypoi

Easypoi的目標是什么 Easypoi的目標不是替代poi,而是讓一個不懂導入導出的快速使用poi完成Excel和word的各種操作,而不是看很多api才可以完成這樣工作

為什么會寫Easypoi

以前的以前(歲月真TMD的快)我雖然寫了不少代碼但還是很少寫poi,然后跳到一家公司之后就和業務人員聊上了,來這個需要個報表,這個報表樣式是這樣的,這個表頭是這樣的,就這樣我寫了大量的poi代碼,每次都是大量的篇幅,copy to copy,無聊的一逼,然后加入了jeecg,jeecg中有一個小的工具類,雖然我也不知道是誰寫的,然是可以用注解搞定最簡單的導出,突然豁然開朗,我可以完善,讓我從報表的苦海當中脫離出來,這樣我花了一周的時間做了第一個版本支持導入導出放到了jeecg,發現還是不錯的,慢慢的用的人越來越多,我就把這塊獨立出來了,再然后有人提出了模板,然后就加入了模板功能,提出了word的需求,加入了word的功能,后來工作忙了雖然沒再參與jeecg,但還是一直維持這easypoi的更新,根據見識的增長也不斷的重構這代碼,直到現在

獨特的功能

基於注解的導入導出,修改注解就可以修改Excel
支持常用的樣式自定義
基於map可以靈活定義的表頭字段
支持一堆多的導出,導入
支持模板的導出,一些常見的標簽,自定義標簽
支持HTML/Excel轉換,如果模板還不能滿足用戶的變態需求,請用這個功能
支持word的導出,支持圖片,Excel
使用

1.easypoi 父包--作用大家都懂得
2.easypoi-annotation 基礎注解包,作用與實體對象上,拆分后方便maven多工程的依賴管理
3.easypoi-base 導入導出的工具包,可以完成Excel導出,導入,Word的導出,Excel的導出功能
4.easypoi-web 耦合了spring-mvc 基於AbstractView,極大的簡化spring-mvc下的導出功能
5.sax 導入使用xercesImpl這個包(這個包可能造成奇怪的問題哈),word導出使用poi-scratchpad,都作為可選包了
如果不使用spring mvc的便捷福利,直接引入easypoi-base 就可以了,easypoi-annotation

如果使用maven,請使用如下坐標

<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-web</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-annotation</artifactId>
<version>3.1.0</version>
</dependency>
注解

注解介紹

easypoi起因就是Excel的導入導出,最初的模板是實體和Excel的對應,model--row,filed--col 這樣利用注解我們可以和容易做到excel到導入導出 經過一段時間發展,現在注解有5個類分別是

@Excel 作用到filed上面,是對Excel一列的一個描述
@ExcelCollection 表示一個集合,主要針對一對多的導出,比如一個老師對應多個科目,科目就可以用集合表示
@ExcelEntity 表示一個繼續深入導出的實體,但他沒有太多的實際意義,只是告訴系統這個對象里面同樣有導出的字段
@ExcelIgnore 和名字一樣表示這個字段被忽略跳過這個導導出
@ExcelTarget 這個是作用於最外層的對象,描述這個對象的id,以便支持一個對象可以針對不同導出做出不同處理
@Excel

這個是必須使用的注解,如果需求簡單只使用這一個注解也是可以的,涵蓋了常用的Excel需求,需要大家熟悉這個功能,主要分為基礎,圖片處理,時間處理,合並處理幾塊,name_id是上面講的id用法,這里就不累言了

屬性 類型 默認值 功能
name

String

null

列名,支持name_id

needMerge

boolean

fasle

是否需要縱向合並單元格(用於含有list中,單個的單元格,合並list創建的多個row)

orderNum

String

"0"

列的排序,支持name_id

replace

String[]

{}

值得替換 導出是{a_id,b_id} 導入反過來

savePath

String

"upload"

導入文件保存路徑,如果是圖片可以填寫,默認是upload/className/ IconEntity這個類對應的就是upload/Icon/

type

int

1

導出類型 1 是文本 2 是圖片,3 是函數,10 是數字 默認是文本

width

double

10

列寬

height

double

10

列高,后期打算統一使用@ExcelTarget的height,這個會被廢棄,注意

isStatistics

boolean

fasle

自動統計數據,在追加一行統計,把所有數據都和輸出 這個處理會吞沒異常,請注意這一點

isHyperlink

boolean

false

超鏈接,如果是需要實現接口返回對象

isImportField

boolean

true

校驗字段,看看這個字段是不是導入的Excel中有,如果沒有說明是錯誤的Excel,讀取失敗,支持name_id

exportFormat

String

""

導出的時間格式,以這個是否為空來判斷是否需要格式化日期

importFormat

String

""

導入的時間格式,以這個是否為空來判斷是否需要格式化日期

format

String

""

時間格式,相當於同時設置了exportFormat 和 importFormat

databaseFormat

String

"yyyyMMddHHmmss"

導出時間設置,如果字段是Date類型則不需要設置 數據庫如果是string 類型,這個需要設置這個數據庫格式,用以轉換時間格式輸出

numFormat

String

""

數字格式化,參數是Pattern,使用的對象是DecimalFormat

imageType

int

1

導出類型 1 從file讀取 2 是從數據庫中讀取 默認是文件 同樣導入也是一樣的

suffix

String

""

文字后綴,如% 90 變成90%

isWrap

boolean

true

是否換行 即支持\n

mergeRely

int[]

{}

合並單元格依賴關系,比如第二列合並是基於第一列 則{0}就可以了

mergeVertical

boolean

fasle

縱向合並內容相同的單元格

fixedIndex

int

-1

對應excel的列,忽略名字

isColumnHidden

boolean

false

導出隱藏列

@ExcelTarget

限定一個到處實體的注解,以及一些通用設置,作用於最外面的實體

屬性 類型 默認值 功能
value

String

null

定義ID

height

double

10

設置行高

fontSize

short

11

設置文字大小

@ExcelEntity

標記是不是導出excel 標記為實體類,一遍是一個內部屬性類,標記是否繼續穿透,可以自定義內部id

屬性 類型 默認值 功能
id

String

null

定義ID

@ExcelCollection

一對多的集合注解,用以標記集合是否被數據以及集合的整體排序

屬性 類型 默認值 功能
id

String

null

定義ID

name

String

null

定義集合列名,支持nanm_id

orderNum

int

0

排序,支持name_id

type

Class<?>

ArrayList.class

導入時創建對象使用

@ExcelIgnore

忽略這個屬性,多使用需循環引用中,無需多解釋吧^^

 接下來就是實戰了:

首先是實體類:

 

 

接下來是工具類的編寫:

package com.example.easypoi.util;

import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;

/**
* @Auther: lijiawei
* @Date: 2018/7/23 12:08
* @Description: Excle 文件導入導出Util(easypoi)
*/
public class EasyPoiUtil {
/**
* 功能描述:復雜導出Excel,包括文件名以及表名。創建表頭
*
* @author 李家威
* @date 2018/7/23 13:07
* @param list 導出的實體類
* @param title 表頭名稱
* @param sheetName sheet表名
* @param pojoClass 映射的實體類
* @param isCreateHeader 是否創建表頭
* @param fileName
* @param response
* @return
*/
public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName, boolean isCreateHeader, HttpServletResponse response) {
ExportParams exportParams = new ExportParams(title, sheetName);
exportParams.setCreateHeadRows(isCreateHeader);
defaultExport(list, pojoClass, fileName, response, exportParams);
}


/**
* 功能描述:復雜導出Excel,包括文件名以及表名,不創建表頭
*
* @author 李家威
* @date 2018/7/23 13:07
* @param list 導出的實體類
* @param title 表頭名稱
* @param sheetName sheet表名
* @param pojoClass 映射的實體類
* @param fileName
* @param response
* @return
*/
public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName, HttpServletResponse response) {
defaultExport(list, pojoClass, fileName, response, new ExportParams(title, sheetName));
}

/**
* 功能描述:Map 集合導出
*
* @author 李家威
* @date 2018/7/23 16:14
* @param list 實體集合
* @param fileName 導出的文件名稱
* @param response
* @return
*/
public static void exportExcel(List<Map<String, Object>> list, String fileName, HttpServletResponse response) {
defaultExport(list, fileName, response);
}

/**
* 功能描述:默認導出方法
*
* @author 李家威
* @date 2018/7/23 15:33
* @param list 導出的實體集合
* @param fileName 導出的文件名
* @param pojoClass pojo實體
* @param exportParams ExportParams封裝實體
* @param response
* @return
*/
private static void defaultExport(List<?> list, Class<?> pojoClass, String fileName, HttpServletResponse response, ExportParams exportParams) {
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list);
if (workbook != null) {
downLoadExcel(fileName, response, workbook);
}
}

/**
* 功能描述:Excel導出
*
* @author 李家威
* @date 2018/7/23 15:35
* @param fileName 文件名稱
* @param response
* @param workbook Excel對象
* @return
*/
private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) {
try {
response.setCharacterEncoding("UTF-8");
response.setHeader("content-Type", "application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
workbook.write(response.getOutputStream());
} catch (IOException e) {
throw new RuntimeException(e);
}
}

/**
* 功能描述:默認導出方法
*
* @author 李家威
* @date 2018/7/23 15:33
* @param list 導出的實體集合
* @param fileName 導出的文件名
* @param response
* @return
*/
private static void defaultExport(List<Map<String, Object>> list, String fileName, HttpServletResponse response) {
Workbook workbook = ExcelExportUtil.exportExcel(list, ExcelType.HSSF);
if (workbook != null) ;
downLoadExcel(fileName, response, workbook);
}


/**
* 功能描述:根據文件路徑來導入Excel
*
* @author 李家威
* @date 2018/7/23 14:17
* @param filePath 文件路徑
* @param titleRows 表標題的行數
* @param headerRows 表頭行數
* @param pojoClass Excel實體類
* @return
*/
public static <T> List<T> importExcel(String filePath, Integer titleRows, Integer headerRows, Class<T> pojoClass) {
//判斷文件是否存在
if (StringUtils.isBlank(filePath)) {
return null;
}
ImportParams params = new ImportParams();
params.setTitleRows(titleRows);
params.setHeadRows(headerRows);
List<T> list = null;
try {
list = ExcelImportUtil.importExcel(new File(filePath), pojoClass, params);
} catch (NoSuchElementException e) {
throw new RuntimeException("模板不能為空");
} catch (Exception e) {
e.printStackTrace();

}
return list;
}

/**
* 功能描述:根據接收的Excel文件來導入Excel,並封裝成實體類
*
* @author 李家威
* @date 2018/7/23 14:17
* @param file 上傳的文件
* @param titleRows 表標題的行數
* @param headerRows 表頭行數
* @param pojoClass Excel實體類
* @return
*/
public static <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class<T> pojoClass) {
if (file == null) {
return null;
}
ImportParams params = new ImportParams();
params.setTitleRows(titleRows);
params.setHeadRows(headerRows);
List<T> list = null;
try {
list = ExcelImportUtil.importExcel(file.getInputStream(), pojoClass, params);
} catch (NoSuchElementException e) {
throw new RuntimeException("excel文件不能為空");
} catch (Exception e) {
throw new RuntimeException(e.getMessage());

}
return list;
}


}
下面是測試類以及結果:

 

 

 

就此,easypoi 的工作就完成了 是不是很簡單

更多教程可以參考官方APIhttp://easypoi.mydoc.io/#text_202979
---------------------
作者:HiBoyljw
來源:CSDN
原文:https://blog.csdn.net/HiBoyljw/article/details/81170802
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM