美文网首页程序员技术干货
JavaWEB--POI之EXCEL操作、优化、封装详解系列(四

JavaWEB--POI之EXCEL操作、优化、封装详解系列(四

作者: JackFrost_fuzhu | 来源:发表于2017-08-31 16:03 被阅读63次

    前篇我们讲完了我们这个工具库的入门篇,其实那个是博主抽象的基准点。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的博客

    相关文章

      网友评论

        本文标题:JavaWEB--POI之EXCEL操作、优化、封装详解系列(四

        本文链接:https://www.haomeiwen.com/subject/wyiqjxtx.html