前篇我們講完了我們這個(gè)工具庫(kù)的入門篇,其實(shí)那個(gè)是博主抽象的基準(zhǔn)點(diǎn)绊茧。PoiExportUtil這個(gè)接口庫(kù)就是依賴于前篇兩部分抽象的铝宵。那么現(xiàn)在我們來(lái)講下這個(gè)工具的架構(gòu)以及功能說(shuō)明吧。
文章結(jié)構(gòu):(1)PoiExportUtil架構(gòu)說(shuō)明华畏;(2)PoiExportUtil功能說(shuō)明鹏秋;
一、PoiExportUtil架構(gòu)說(shuō)明:
(一)一張圖秒懂PoiExportUtil的架構(gòu):
(二)PoiExportUtil工具細(xì)節(jié)說(shuō)明:
(1)PoiInterface 接口:
主要職責(zé):定義工具提供的所有接口(大家可直接調(diào)用)亡笑;
對(duì)于此接口需要理解的參數(shù):
/*
* 一些通用的方法:在此明確所有參數(shù)
* excelVersion excel的版本
* title 表格標(biāo)題名
* headersName 表格屬性列名數(shù)組(即:每列標(biāo)題)
* headersId 表格屬性列名對(duì)應(yīng)的字段(即:每列標(biāo)題的英文標(biāo)識(shí)--為了去list去拿)---你需要導(dǎo)出的字段名(所有接口都是支持headersId亂序的設(shè)計(jì))
* dtoList 想要導(dǎo)出的數(shù)據(jù)list(即:數(shù)據(jù)庫(kù)查出的數(shù)據(jù)集合) 有兩種風(fēng)格:JavaBean風(fēng)格 與 哈希數(shù)據(jù)結(jié)構(gòu)風(fēng)格
* out 與輸出設(shè)備關(guān)聯(lián)的流對(duì)象侣夷,可以將EXCEL文檔導(dǎo)出到本地文件或者網(wǎng)絡(luò)中
*
* wb Workbook工作簿對(duì)象
* sheet 表格對(duì)象
*
* styleUtil 是我抽象出來(lái)的樣式層,大家可繼承ExcelStyleBase類實(shí)現(xiàn)自己的超高自定義樣式
*
* pageNum 分頁(yè)碼--針對(duì)大數(shù)據(jù)量的分頁(yè)功能
* pageSize 每頁(yè)的數(shù)量--針對(duì)大數(shù)據(jù)量的分頁(yè)功能
*/
接口的實(shí)現(xiàn)代碼:
package com.fuzhu.base;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import java.io.OutputStream;
import java.util.List;
import java.util.Map;
/**
* Created by 符柱成 on 2017/8/24.
*/
public interface PoiInterface<T> {
/*
(普通JavaBean結(jié)構(gòu))
*/
//導(dǎo)出默認(rèn)樣式EXCEL文件(根據(jù)headersId來(lái)導(dǎo)出對(duì)應(yīng)字段仑乌,)--根據(jù)headersId篩選要導(dǎo)出的字段
int exportBeanExcel(int excelVersion,String title, List<String> headersName, List<String> headersId,
List<T> dtoList, OutputStream out);
//導(dǎo)出自定義樣式Excel文件--根據(jù)headersId篩選要導(dǎo)出的字段
int exportStyleBeanExcel(int excelVersion,String title, List<String> headersName, List<String> headersId,
List<T> dtoList, OutputStream out,StyleInterface styleUtil);
//默認(rèn)導(dǎo)出dtolist的所有數(shù)據(jù)--默認(rèn)導(dǎo)出dtolist的所有數(shù)據(jù)
int exportStyleBeanExcel(int excelVersion,String title, List<String> headersName,
List<T> dtoList, OutputStream out,StyleInterface styleUtil);
//分頁(yè)導(dǎo)出自定義樣式Excel文件----拿到工作簿
Workbook getPageExcelBook(int excelVersion);
//分頁(yè)導(dǎo)出自定義樣式Excel文件----拿到表格
Sheet getPageExcelSheet(Workbook wb,String bookTitle);
//分頁(yè)導(dǎo)出自定義樣式Excel文件----標(biāo)題欄
Sheet exportPageTitleExcel(Workbook wb,Sheet sheet,List<String> headersName,StyleInterface styleUtil);
//分頁(yè)導(dǎo)出Bean結(jié)構(gòu)自定義樣式Excel文件----數(shù)據(jù)體
Sheet exportPageContentBeanExcel(Workbook wb,Sheet sheet,List<String> headersId,List<T> dtoList,StyleInterface styleUtil,int pageNum,int pageSize);
//分頁(yè)導(dǎo)出Bean結(jié)構(gòu)自定義樣式Excel文件----數(shù)據(jù)體--沒(méi)有標(biāo)題欄字段匹配--默認(rèn)導(dǎo)出dtolist的所有數(shù)據(jù)
Sheet exportPageContentBeanExcel(Workbook wb,Sheet sheet,List<T> dtoList,StyleInterface styleUtil,int pageNum,int pageSize);
//分頁(yè)導(dǎo)出Map結(jié)構(gòu)自定義樣式Excel文件----數(shù)據(jù)體--根據(jù)headersId篩選要導(dǎo)出的字段
Sheet exportPageContentMapExcel(Workbook wb,Sheet sheet,List<String> headersId,List<Map<String, Object>> dtoList,StyleInterface styleUtil,int pageNum,int pageSize);
//分頁(yè)導(dǎo)出Map結(jié)構(gòu)自定義樣式Excel文件----數(shù)據(jù)體--沒(méi)有標(biāo)題欄字段匹配百拓,數(shù)據(jù)體dtoList需要使用treemap。--默認(rèn)導(dǎo)出dtolist的所有數(shù)據(jù)
Sheet exportPageContentMapExcel(Workbook wb,Sheet sheet,List<Map<String, Object>> dtoList,StyleInterface styleUtil,int pageNum,int pageSize);
/*
List<Map<String, Object>>結(jié)構(gòu)
*/
//導(dǎo)出默認(rèn)樣式的Map結(jié)構(gòu)Excel--根據(jù)headersId篩選要導(dǎo)出的字段
int exportMapExcel(int excelVersion,String title, List<String> headersName, List<String> headersId,
List<Map<String, Object>> dtoList, OutputStream out) throws Exception ;
//導(dǎo)出自定義樣式的Map結(jié)構(gòu)Excel--根據(jù)headersId篩選要導(dǎo)出的字段
int exportStyleMapExcel(int excelVersion,String title, List<String> headersName, List<String> headersId,
List<Map<String, Object>> dtoList, OutputStream out,StyleInterface styleUtil) throws Exception ;
//導(dǎo)出自定義樣式的Map結(jié)構(gòu)Excel--沒(méi)有標(biāo)題欄字段匹配晰甚,數(shù)據(jù)體dtoList需要使用treemap衙传。--默認(rèn)導(dǎo)出dtolist的所有數(shù)據(jù)
int exportStyleMapExcel(int excelVersion,String title, List<String> headersName,
List<Map<String, Object>> dtoList, OutputStream out,StyleInterface styleUtil) throws Exception ;
}
(2)StyleInterface接口:
主要職責(zé):抽象出樣式層;
此接口額外說(shuō)明:當(dāng)使用CellStyle setHeaderStyle(Workbook wb, Sheet sheet);此接口方法厕九,這意味著你要完全自定義所有樣式蓖捶,其余方法除CellStyle setDataStyle(Workbook wb);均會(huì)失效。使用時(shí)請(qǐng)?zhí)貏e注意止剖,這個(gè)主要是針對(duì)所有行列以及標(biāo)題欄做的完全自定義腺阳。
接口代碼:
package com.fuzhu.base;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
/**
* Created by 符柱成 on 2017/8/24.
*/
public interface StyleInterface {
//設(shè)置標(biāo)題欄的樣式
CellStyle setHeaderStyle(Workbook wb);
//設(shè)置數(shù)據(jù)列的樣式
CellStyle setDataStyle(Workbook wb);
//設(shè)置行高(自動(dòng)設(shè)置每一列)
void setRowHigh();
//設(shè)置列寬(自動(dòng)設(shè)置每一列)
void setColumnWidth();
//可利用此方法設(shè)定特定的列寬與行高---這個(gè)方法請(qǐng)不要覆寫(xiě)或重載,這個(gè)是給抽象類以及底層封裝使用的
void setSpecifiedHighAndWidth(Sheet sheet);
/*
當(dāng)你使用以下這個(gè)方法的sheet對(duì)象時(shí)穿香,請(qǐng)不要使用上面的setHeaderStyle(Workbook wb)、setRowHigh()绎速、setColumnWidth()皮获、setSpecifiedHighAndWidth(Sheet sheet)方法。因?yàn)橄旅媸峭耆远x纹冤,會(huì)完全覆蓋上面方法的洒宝。
同時(shí)請(qǐng)小心使用sheet對(duì)象,此處調(diào)用及其容易破壞封裝萌京。
*/
//高度自定義標(biāo)題欄樣式--可以針對(duì)單列單行 寬高
CellStyle setHeaderStyle(Workbook wb, Sheet sheet);
//獲取行高
short getRowHigh();
//獲取列寬
short getColumnWidth();
}
(3)PoiExcelBase抽象類:
主要職責(zé):實(shí)現(xiàn)兩個(gè)產(chǎn)品工具的公有方法雁歌,公有屬性,實(shí)現(xiàn)部分PoiInterface接口方法知残。
類代碼:(代碼過(guò)多就不一一列舉了靠瞎,說(shuō)明關(guān)鍵屬性)
/*
EXCEL版本支持:03與07
0 EXCEL_VERSION_03
1 EXCEL_VERSION_07
(普通JavaBean)
-1 導(dǎo)出EXCEL文件
(Map結(jié)構(gòu))
-5 導(dǎo)出默認(rèn)樣式EXCEL文件
*/
public static int EXCEL_VERSION_03 = 0;
public static int EXCEL_VERSION_07 = 1;
public static int EXPORT_SIMPLE_EXCEL = -1;
public static int EXPORT_MAP_EXCEL = -5;
(4)ExcelStyleBase抽象類:
主要職責(zé):實(shí)現(xiàn)樣式接口的部分方法,定義公有屬性,模板模式處理一些方法以便接口更容易上手乏盐。
package com.fuzhu.base;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Created by 符柱成 on 2017/8/25.
*/
public abstract class ExcelStyleBase implements StyleInterface{
private short rowHigh = 0;//行高
private short columnWidth = 0;//列寬
@Override
public abstract CellStyle setHeaderStyle(Workbook wb);
@Override
public abstract CellStyle setDataStyle(Workbook wb);
@Override
public abstract void setRowHigh();
@Override
public abstract void setColumnWidth();
public abstract Map<Integer,Integer> setMySpecifiedHighAndWidth();
//可利用此方法設(shè)定特定的列寬與行高--模板模式
@Override
public void setSpecifiedHighAndWidth(Sheet sheet) {
Map<Integer,Integer> map = this.setMySpecifiedHighAndWidth();
if (map!=null) {
Set<Map.Entry<Integer, Integer>> entrySet = map.entrySet();
for (Map.Entry<Integer, Integer> entry : entrySet) {
Integer key = entry.getKey();
Integer value = entry.getValue();
sheet.setColumnWidth(key, value);
}
}
}
@Override
public short getRowHigh() {
return rowHigh;
}
@Override
public short getColumnWidth() {
return columnWidth;
}
protected void setMyRowHigh(short high){
rowHigh = high;
}
protected void setMyColumnWidth(short width){
columnWidth = width;
}
}
(5)至于ExportBeanExcel以及ExportMapExcel這兩個(gè)類佳窑,里面就是前篇文章的封裝啦,比較復(fù)雜父能。有興趣的朋友去我github看吧神凑。
(6)而圖中的MyStyle類,是大家可以繼承我的ExcelStyleBase抽象類何吝,實(shí)現(xiàn)自己的自定義樣式類的溉委。
二、PoiExportUtil功能說(shuō)明:
下一篇將詳細(xì)講解PoiExportUtil的使用
(一)針對(duì)普通JavaBean結(jié)構(gòu):
(1)導(dǎo)出默認(rèn)樣式EXCEL文件--根據(jù)headersId篩選要導(dǎo)出的字段爱榕。
int exportBeanExcel(int excelVersion,String title, List<String> headersName, List<String> headersId,
List<T> dtoList, OutputStream out);
(2)導(dǎo)出自定義樣式Excel文件--根據(jù)headersId篩選要導(dǎo)出的字段:
int exportStyleBeanExcel(int excelVersion,String title, List<String> headersName, List<String> headersId,
List<T> dtoList, OutputStream out,StyleInterface styleUtil);
(3)默認(rèn)導(dǎo)出dtolist的所有數(shù)據(jù)--默認(rèn)導(dǎo)出dtolist的所有數(shù)據(jù):
int exportStyleBeanExcel(int excelVersion,String title, List<String> headersName,
List<T> dtoList, OutputStream out,StyleInterface styleUtil);
(二)針對(duì)List-Map結(jié)構(gòu):
(1)導(dǎo)出默認(rèn)樣式的Map結(jié)構(gòu)Excel--根據(jù)headersId篩選要導(dǎo)出的字段:
int exportMapExcel(int excelVersion,String title, List<String> headersName, List<String> headersId,
List<Map<String, Object>> dtoList, OutputStream out) throws Exception ;
(2)導(dǎo)出自定義樣式的Map結(jié)構(gòu)Excel--根據(jù)headersId篩選要導(dǎo)出的字段:
int exportStyleMapExcel(int excelVersion,String title, List<String> headersName, List<String> headersId,
List<Map<String, Object>> dtoList, OutputStream out,StyleInterface styleUtil) throws Exception ;
(3)導(dǎo)出自定義樣式的Map結(jié)構(gòu)Excel--沒(méi)有標(biāo)題欄字段匹配薛躬,數(shù)據(jù)體dtoList需要使用treemap。--默認(rèn)導(dǎo)出dtolist的所有數(shù)據(jù):
int exportStyleMapExcel(int excelVersion,String title, List<String> headersName,
List<Map<String, Object>> dtoList, OutputStream out,StyleInterface styleUtil) throws Exception ;
(三)另外本博主還封裝了應(yīng)對(duì)大量數(shù)據(jù)導(dǎo)出的分頁(yè)方案呆细。將在后面詳細(xì)講述型宝。
(四)導(dǎo)出的數(shù)據(jù)順序說(shuō)明:
(1)有headersId限定的,數(shù)據(jù)順序以headersId為準(zhǔn)絮爷;
(2)沒(méi)有headersId限定的趴酣,對(duì)于JavaBean結(jié)構(gòu)的數(shù)據(jù)順序是:他所有屬性的順序
(3)沒(méi)有headersId限定的,對(duì)于List-Map結(jié)構(gòu)的數(shù)據(jù)順序是:數(shù)據(jù)加入到dtoList時(shí)的順序坑夯,也就是加入到Map容器的時(shí)候的順序岖寞。(為了有序,須使用TreeMap規(guī)范數(shù)據(jù)順序)
好了,JavaWEB--POI之EXCEL操作淑履、優(yōu)化隶垮、封裝詳解系列(四)--PoiExportUtil架構(gòu)設(shè)計(jì)篇與功能說(shuō)明講完了,這是自己設(shè)計(jì)的第一個(gè)Java工具庫(kù)秘噪,并且抽象作為開(kāi)源工具了狸吞,在這里寫(xiě)出來(lái)記錄,這是積累的必經(jīng)一步指煎,我會(huì)繼續(xù)出這個(gè)系列文章蹋偏,分享經(jīng)驗(yàn)給大家。歡迎在下面指出錯(cuò)誤至壤,共同學(xué)習(xí)M肌!你的點(diǎn)贊是對(duì)我最好的支持O窠帧黎棠!