JavaWEB--POI之EXCEL操作侮邀、優(yōu)化坏怪、封裝詳解系列(四)--PoiExportUtil架構(gòu)設(shè)計(jì)篇與功能說(shuō)明

前篇我們講完了我們這個(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):

這里寫(xiě)圖片描述

(二)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ù)順序)


POI輔助庫(kù)PoiExportUtil源碼下載:JavaWEB--POI之EXCEL操作柜蜈、優(yōu)化仗谆、封裝詳解系列(四)--PoiExportUtil架構(gòu)設(shè)計(jì)篇與功能說(shuō)明

好了,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窠帧黎棠!

更多內(nèi)容晋渺,可以訪問(wèn)JackFrost的博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市葫掉,隨后出現(xiàn)的幾起案子些举,更是在濱河造成了極大的恐慌,老刑警劉巖俭厚,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件户魏,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡挪挤,警方通過(guò)查閱死者的電腦和手機(jī)叼丑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)扛门,“玉大人鸠信,你說(shuō)我怎么就攤上這事÷壅” “怎么了星立?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)葬凳。 經(jīng)常有香客問(wèn)我绰垂,道長(zhǎng),這世上最難降的妖魔是什么火焰? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任劲装,我火速辦了婚禮,結(jié)果婚禮上昌简,老公的妹妹穿的比我還像新娘占业。我一直安慰自己,他們只是感情好纯赎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布谦疾。 她就那樣靜靜地躺著,像睡著了一般址否。 火紅的嫁衣襯著肌膚如雪餐蔬。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,165評(píng)論 1 299
  • 那天佑附,我揣著相機(jī)與錄音,去河邊找鬼仗考。 笑死音同,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的秃嗜。 我是一名探鬼主播权均,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼顿膨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了叽赊?” 一聲冷哼從身側(cè)響起恋沃,我...
    開(kāi)封第一講書(shū)人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎必指,沒(méi)想到半個(gè)月后囊咏,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡塔橡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年梅割,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片葛家。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡户辞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出癞谒,到底是詐尸還是另有隱情底燎,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布弹砚,位于F島的核電站双仍,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏迅栅。R本人自食惡果不足惜殊校,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望读存。 院中可真熱鬧为流,春花似錦、人聲如沸让簿。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)尔当。三九已至莲祸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間椭迎,已是汗流浹背锐帜。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留畜号,地道東北人缴阎。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像简软,于是被迫代替她去往敵國(guó)和親蛮拔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子述暂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容