JavaWEB--POI之EXCEL操作、优化、封装详解系列(四)--PoiExportUtil架构设计篇与功能说明

前篇我们讲完了我们这个工具库的入门篇,其实那个是博主抽象的基准点。PoiExportUtil这个接口库就是依赖于前篇两部分抽象的。那么现在我们来讲下这个工具的架构以及功能说明吧。

文章结构:(1)PoiExportUtil架构说明;(2)PoiExportUtil功能说明;

一、PoiExportUtil架构说明:

(一)一张图秒懂PoiExportUtil的架构:

这里写图片描述

(二)PoiExportUtil工具细节说明:

(1)PoiInterface 接口:

主要职责:定义工具提供的所有接口(大家可直接调用);
对于此接口需要理解的参数:
    /*
     * 一些通用的方法:在此明确所有参数
     *  excelVersion         excel的版本
     *  title           表格标题名
     * headersName      表格属性列名数组(即:每列标题)
     * headersId        表格属性列名对应的字段(即:每列标题的英文标识--为了去list去拿)---你需要导出的字段名(所有接口都是支持headersId乱序的设计)
     * dtoList          想要导出的数据list(即:数据库查出的数据集合)   有两种风格:JavaBean风格  与  哈希数据结构风格
     *  out             与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
     *
     *  wb              Workbook工作簿对象
     *  sheet           表格对象
     *
     *  styleUtil       是我抽象出来的样式层,大家可继承ExcelStyleBase类实现自己的超高自定义样式
     *
     *  pageNum         分页码--针对大数据量的分页功能
     *  pageSize        每页的数量--针对大数据量的分页功能
     */
接口的实现代码:
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结构)
     */
    //导出默认样式EXCEL文件(根据headersId来导出对应字段,)--根据headersId筛选要导出的字段
    int exportBeanExcel(int excelVersion,String title, List<String> headersName, List<String> headersId,
                           List<T> dtoList, OutputStream out);
    //导出自定义样式Excel文件--根据headersId筛选要导出的字段
    int exportStyleBeanExcel(int excelVersion,String title, List<String> headersName, List<String> headersId,
                          List<T> dtoList, OutputStream out,StyleInterface styleUtil);
    //默认导出dtolist的所有数据--默认导出dtolist的所有数据
    int exportStyleBeanExcel(int excelVersion,String title, List<String> headersName,
                             List<T> dtoList, OutputStream out,StyleInterface styleUtil);

    //分页导出自定义样式Excel文件----拿到工作簿
    Workbook getPageExcelBook(int excelVersion);
    //分页导出自定义样式Excel文件----拿到表格
    Sheet getPageExcelSheet(Workbook wb,String bookTitle);
    //分页导出自定义样式Excel文件----标题栏
    Sheet exportPageTitleExcel(Workbook wb,Sheet sheet,List<String> headersName,StyleInterface styleUtil);


    //分页导出Bean结构自定义样式Excel文件----数据体
    Sheet exportPageContentBeanExcel(Workbook wb,Sheet sheet,List<String> headersId,List<T> dtoList,StyleInterface styleUtil,int pageNum,int pageSize);
    //分页导出Bean结构自定义样式Excel文件----数据体--没有标题栏字段匹配--默认导出dtolist的所有数据
    Sheet exportPageContentBeanExcel(Workbook wb,Sheet sheet,List<T> dtoList,StyleInterface styleUtil,int pageNum,int pageSize);


    //分页导出Map结构自定义样式Excel文件----数据体--根据headersId筛选要导出的字段
    Sheet exportPageContentMapExcel(Workbook wb,Sheet sheet,List<String> headersId,List<Map<String, Object>>  dtoList,StyleInterface styleUtil,int pageNum,int pageSize);
    //分页导出Map结构自定义样式Excel文件----数据体--没有标题栏字段匹配,数据体dtoList需要使用treemap。--默认导出dtolist的所有数据
    Sheet exportPageContentMapExcel(Workbook wb,Sheet sheet,List<Map<String, Object>>  dtoList,StyleInterface styleUtil,int pageNum,int pageSize);


    /*
        List<Map<String, Object>>结构
     */
    //导出默认样式的Map结构Excel--根据headersId筛选要导出的字段
    int exportMapExcel(int excelVersion,String title, List<String> headersName, List<String> headersId,
                              List<Map<String, Object>> dtoList, OutputStream out) throws Exception ;
    //导出自定义样式的Map结构Excel--根据headersId筛选要导出的字段
    int exportStyleMapExcel(int excelVersion,String title, List<String> headersName, List<String> headersId,
                              List<Map<String, Object>> dtoList, OutputStream out,StyleInterface styleUtil) throws Exception ;
    //导出自定义样式的Map结构Excel--没有标题栏字段匹配,数据体dtoList需要使用treemap。--默认导出dtolist的所有数据
    int exportStyleMapExcel(int excelVersion,String title, List<String> headersName,
                                  List<Map<String, Object>> dtoList, OutputStream out,StyleInterface styleUtil) throws Exception ;
}

(2)StyleInterface接口:

主要职责:抽象出样式层;
此接口额外说明:当使用CellStyle setHeaderStyle(Workbook wb, Sheet sheet);此接口方法,这意味着你要完全自定义所有样式,其余方法除CellStyle setDataStyle(Workbook wb);均会失效。使用时请特别注意,这个主要是针对所有行列以及标题栏做的完全自定义。
接口代码:
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 {
    //设置标题栏的样式
    CellStyle setHeaderStyle(Workbook wb);
    //设置数据列的样式
    CellStyle setDataStyle(Workbook wb);
    //设置行高(自动设置每一列)
    void setRowHigh();
    //设置列宽(自动设置每一列)
    void setColumnWidth();
    //可利用此方法设定特定的列宽与行高---这个方法请不要覆写或重载,这个是给抽象类以及底层封装使用的
    void setSpecifiedHighAndWidth(Sheet sheet);

    /*
        当你使用以下这个方法的sheet对象时,请不要使用上面的setHeaderStyle(Workbook wb)、setRowHigh()、setColumnWidth()、setSpecifiedHighAndWidth(Sheet sheet)方法。因为下面是完全自定义,会完全覆盖上面方法的。
        同时请小心使用sheet对象,此处调用及其容易破坏封装。
     */
    //高度自定义标题栏样式--可以针对单列单行 宽高
    CellStyle setHeaderStyle(Workbook wb, Sheet sheet);


    //获取行高
    short getRowHigh();
    //获取列宽
    short getColumnWidth();
}

(3)PoiExcelBase抽象类:

主要职责:实现两个产品工具的公有方法,公有属性,实现部分PoiInterface接口方法。
类代码:(代码过多就不一一列举了,说明关键属性)
/*
        EXCEL版本支持:03与07
        0 EXCEL_VERSION_03
        1 EXCEL_VERSION_07


        (普通JavaBean)
        -1 导出EXCEL文件

        (Map结构)
        -5 导出默认样式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抽象类:

主要职责:实现样式接口的部分方法,定义公有属性,模板模式处理一些方法以便接口更容易上手。
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();

    //可利用此方法设定特定的列宽与行高--模板模式
    @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这两个类,里面就是前篇文章的封装啦,比较复杂。有兴趣的朋友去我github看吧。

(6)而图中的MyStyle类,是大家可以继承我的ExcelStyleBase抽象类,实现自己的自定义样式类的。


二、PoiExportUtil功能说明:

下一篇将详细讲解PoiExportUtil的使用

(一)针对普通JavaBean结构:

(1)导出默认样式EXCEL文件--根据headersId筛选要导出的字段。

int exportBeanExcel(int excelVersion,String title, List<String> headersName, List<String> headersId,
                           List<T> dtoList, OutputStream out);

(2)导出自定义样式Excel文件--根据headersId筛选要导出的字段:

int exportStyleBeanExcel(int excelVersion,String title, List<String> headersName, List<String> headersId,
                          List<T> dtoList, OutputStream out,StyleInterface styleUtil);

(3)默认导出dtolist的所有数据--默认导出dtolist的所有数据:

int exportStyleBeanExcel(int excelVersion,String title, List<String> headersName,
                             List<T> dtoList, OutputStream out,StyleInterface styleUtil);

(二)针对List-Map结构:

(1)导出默认样式的Map结构Excel--根据headersId筛选要导出的字段:

int exportMapExcel(int excelVersion,String title, List<String> headersName, List<String> headersId,
                              List<Map<String, Object>> dtoList, OutputStream out) throws Exception ;

(2)导出自定义样式的Map结构Excel--根据headersId筛选要导出的字段:

int exportStyleMapExcel(int excelVersion,String title, List<String> headersName, List<String> headersId,
                              List<Map<String, Object>> dtoList, OutputStream out,StyleInterface styleUtil) throws Exception ;

(3)导出自定义样式的Map结构Excel--没有标题栏字段匹配,数据体dtoList需要使用treemap。--默认导出dtolist的所有数据:

int exportStyleMapExcel(int excelVersion,String title, List<String> headersName,
                                  List<Map<String, Object>> dtoList, OutputStream out,StyleInterface styleUtil) throws Exception ;

(三)另外本博主还封装了应对大量数据导出的分页方案。将在后面详细讲述。

(四)导出的数据顺序说明:

(1)有headersId限定的,数据顺序以headersId为准;

(2)没有headersId限定的,对于JavaBean结构的数据顺序是:他所有属性的顺序

(3)没有headersId限定的,对于List-Map结构的数据顺序是:数据加入到dtoList时的顺序,也就是加入到Map容器的时候的顺序。(为了有序,须使用TreeMap规范数据顺序)


POI辅助库PoiExportUtil源码下载:JavaWEB--POI之EXCEL操作、优化、封装详解系列(四)--PoiExportUtil架构设计篇与功能说明

好了,JavaWEB--POI之EXCEL操作、优化、封装详解系列(四)--PoiExportUtil架构设计篇与功能说明讲完了,这是自己设计的第一个Java工具库,并且抽象作为开源工具了,在这里写出来记录,这是积累的必经一步,我会继续出这个系列文章,分享经验给大家。欢迎在下面指出错误,共同学习!!你的点赞是对我最好的支持!!

更多内容,可以访问JackFrost的博客

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容