因為項目的原因需要用到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
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!