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

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

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

    前篇我们讲完了我们这个工具库的架构设计篇,那个是我工具设计的思想点。PoiExportUtil这个接口库就是基于前篇来进行封装的。那么现在我们来讲下这个工具的使用吧。

    文章结构:(1)库参数说明;(2)如何使用自定义样式接口?(3)针对普通JavaBean结构的接口使用;(4)针对List-Map结构的接口使用;

    一、库参数说明:

    (一)博主提供的PoiInterface接口的总参数:

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

    (1)excelVersion :选择excel版本

    PoiExcelBase.EXCEL_VERSION_07
    PoiExcelBase.EXCEL_VERSION_03
    

    (2)title :表格名

    (3) headersName :表格属性列名数组(即:每列标题)

    这个需要我们针对自己想要的标题手动设置。

    (4)headersId :就是我们针对dtoList 想要导出的字段啦。

    因为一些业务SQL查询出来的数据有时候会过多复杂,故在此补充这个参数可作为限定。导出的数据列以headersId 为基准

    (5)dtoList :就是我们查询出来想导出的数据啦

    (6) wb :就是工作簿对象,在分页功能会使用到

    (7)sheet :就是表格对象,在分页功能会使用到

    (8)styleUtil :这个是重点喔,当我们想使用自定义样式的时候,就需要使用到这个参数了。至于怎么自定义样式?下面会讲到。

    (9)pageNum :分页码--在分页功能会使用到

    (10)pageSize :每页的数量--在分页功能会使用到

    二、如何使用自定义样式接口??

    (1)继承ExcelStyleBase抽象类:

    public class TestStyle extends ExcelStyleBase {
    //设置标题栏的样式
        @Override
        public CellStyle setHeaderStyle(Workbook wb) {
            return null;
        }
    //设置数据列的样式
        @Override
        public CellStyle setDataStyle(Workbook wb) {
            return null;
        }
    //设置行高(自动设置每一列)
        @Override
        public void setRowHigh() {
    
        }
    //设置列宽(自动设置每一列)
        @Override
        public void setColumnWidth() {
    
        }
    //可利用此方法设定特定的列宽与行高,可以针对单列单行 宽高
        @Override
        public Map<Integer, Integer> setMySpecifiedHighAndWidth() {
            return null;
        }
    
        /*
            当你使用以下这个方法的sheet对象时,请不要使用上面的setHeaderStyle(Workbook wb)、setRowHigh()、setColumnWidth()、setSpecifiedHighAndWidth(Sheet sheet)方法。因为下面是完全自定义,会完全覆盖上面方法的。
            同时请小心使用sheet对象,此处调用及其容易破坏封装。
         */
        //高度自定义标题栏样式
        @Override
        public CellStyle setHeaderStyle(Workbook wb, Sheet sheet) {
            return null;
        }
    
    }
    

    (2)一般如何配套使用?两条路线配套使用。而且在两条使用路线中,可随意使用各自方法,或者不使用。这都是支持的。

    第一条路线使用:不使用高度自定义标题栏样式的方法setHeaderStyle(Workbook wb, Sheet sheet)。

    public class MyStyle extends ExcelStyleBase {
    
        @Override
        public CellStyle setHeaderStyle(Workbook wb) {
    
            // 设置字体
            Font font = wb.createFont();
            //设置字体大小
            font.setFontHeightInPoints((short) 10);
            //字体加粗
            font.setBoldweight(Font.BOLDWEIGHT_BOLD);
            font.setFontName("宋体");
            font.setColor((short) 10);
            // 生成一个样式
            CellStyle headerStyle = wb.createCellStyle();
            // 设置背景色
            headerStyle.setFillForegroundColor((short) 13);
            headerStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
            //设置字体
            headerStyle.setFont(font);
            //设置顶边框;
            headerStyle.setBorderTop(CellStyle.BORDER_THIN);
            //设置右边框;
            headerStyle.setBorderRight(CellStyle.BORDER_THIN);
            //设置左边框;
            headerStyle.setBorderLeft(CellStyle.BORDER_THIN);
            //设置底边框;
            headerStyle.setBorderBottom(CellStyle.BORDER_THIN);
            //设置自动换行;
            headerStyle.setWrapText(false);
            //设置水平对齐的样式为居中对齐;
            headerStyle.setAlignment(CellStyle.ALIGN_CENTER);
            //设置垂直对齐的样式为居中对齐;
            headerStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
            return headerStyle;
        }
    
        @Override
        public CellStyle setDataStyle(Workbook wb) {
            // 设置字体
            Font font = wb.createFont();
            //设置字体大小
            font.setFontHeightInPoints((short) 10);
            //字体加粗
    //        font.setBoldweight(Font.BOLDWEIGHT_BOLD);
            font.setFontName("宋体");
            font.setColor((short) 32767);
            // 生成一个样式
            CellStyle dataStyle = wb.createCellStyle();
            // 设置背景色
            dataStyle.setFillForegroundColor((short)70);
            dataStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
            //设置字体
            dataStyle.setFont(font);
            //设置顶边框;
            dataStyle.setBorderTop(CellStyle.BORDER_THIN);
            //设置右边框;
            dataStyle.setBorderRight(CellStyle.BORDER_THIN);
            //设置左边框;
            dataStyle.setBorderLeft(CellStyle.BORDER_THIN);
            //设置底边框;
            dataStyle.setBorderBottom(CellStyle.BORDER_THIN);
            //设置自动换行;
            dataStyle.setWrapText(false);
            //设置水平对齐的样式为居中对齐;
            dataStyle.setAlignment(CellStyle.ALIGN_CENTER);
            //设置垂直对齐的样式为居中对齐;
            dataStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
            return dataStyle;
        }
    
        @Override
        public void setRowHigh() {
            setMyRowHigh((short) (2 * 256));
        }
    
        @Override
        public void setColumnWidth() {
            setMyColumnWidth((short) 30);
        }
    
        @Override
        public Map<Integer,Integer> setMySpecifiedHighAndWidth() {
            Map<Integer,Integer> map  = new HashMap<>();
            map.put(1,3000);
            map.put(2,3000);
            return map;
        }
        @Override
        public CellStyle setHeaderStyle(Workbook wb, Sheet sheet) {
            return null;
        }
    }
    

    第二条路线使用:单纯使用高度自定义方式以及设置数据栏的方法CellStyle setDataStyle(Workbook wb)

    public class TestStyle extends ExcelStyleBase {
        @Override
        public CellStyle setHeaderStyle(Workbook wb) {
            return null;
        }
    
        @Override
        public CellStyle setDataStyle(Workbook wb) {
            // 设置字体
            Font font = wb.createFont();
            //设置字体大小
            font.setFontHeightInPoints((short) 10);
            //字体加粗
    //        font.setBoldweight(Font.BOLDWEIGHT_BOLD);
            font.setFontName("宋体");
            font.setColor((short) 32767);
            // 生成一个样式
            CellStyle dataStyle = wb.createCellStyle();
            // 设置背景色
            dataStyle.setFillForegroundColor((short)70);
            dataStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
            //设置字体
            dataStyle.setFont(font);
            //设置顶边框;
            dataStyle.setBorderTop(CellStyle.BORDER_THIN);
            //设置右边框;
            dataStyle.setBorderRight(CellStyle.BORDER_THIN);
            //设置左边框;
            dataStyle.setBorderLeft(CellStyle.BORDER_THIN);
            //设置底边框;
            dataStyle.setBorderBottom(CellStyle.BORDER_THIN);
            //设置自动换行;
            dataStyle.setWrapText(false);
            //设置水平对齐的样式为居中对齐;
            dataStyle.setAlignment(CellStyle.ALIGN_CENTER);
            //设置垂直对齐的样式为居中对齐;
            dataStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
            return dataStyle;
        }
    
        @Override
        public void setRowHigh() {
    
        }
    
        @Override
        public void setColumnWidth() {
    
        }
    
        @Override
        public CellStyle setHeaderStyle(Workbook wb, Sheet sheet) {
            //通过sheet对象实现高度自定义,可手动设置行高列宽、间隔等等
            sheet.setColumnWidth(1, 600);
            // 设置字体
            Font font = wb.createFont();
            //设置字体大小
            font.setFontHeightInPoints((short) 10);
            //字体加粗
            font.setBoldweight(Font.BOLDWEIGHT_BOLD);
            font.setFontName("宋体");
            font.setColor((short) 10);
            // 生成一个样式
            CellStyle headerStyle = wb.createCellStyle();
            // 设置背景色
            headerStyle.setFillForegroundColor((short) 13);
            headerStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
            //设置字体
            headerStyle.setFont(font);
            //设置顶边框;
            headerStyle.setBorderTop(CellStyle.BORDER_THIN);
            //设置右边框;
            headerStyle.setBorderRight(CellStyle.BORDER_THIN);
            //设置左边框;
            headerStyle.setBorderLeft(CellStyle.BORDER_THIN);
            //设置底边框;
            headerStyle.setBorderBottom(CellStyle.BORDER_THIN);
            //设置自动换行;
            headerStyle.setWrapText(false);
            //设置水平对齐的样式为居中对齐;
            headerStyle.setAlignment(CellStyle.ALIGN_CENTER);
            //设置垂直对齐的样式为居中对齐;
            headerStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
            return headerStyle;
        }
    
        @Override
        public Map<Integer, Integer> setMySpecifiedHighAndWidth() {
            return null;
        }
    }
    

    (3)自定义样式的特别使用说明:

    对于以下两个接口方法,是有固定的使用方式的

        //设置行高(自动设置每一行)
        void setRowHigh();
        //设置列宽(自动设置每一列)
        void setColumnWidth();
    

    固定的使用方式:而且此方法是针对每一行每一列的

    /*
        必须调用在对应的方法中调用:
         setMyRowHigh(short high)
         setMyColumnWidth(short width)
         这两个方法。不然设置是不成功的。
    */
     @Override
        public void setRowHigh() {
            setMyRowHigh((short) (2 * 256));
        }
    
        @Override
        public void setColumnWidth() {
            setMyColumnWidth((short) 30);
        }
    

    (4)有多少样式我们可以自定义?

    这只是个API的问题。本博主就不列举了,给出链接就好:POI的多种样式API

    三、针对普通JavaBean结构:

    (一)导出默认样式EXCEL文件–根据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);
    

    DEMO代码:

    package com.fuzhu.test;
    
    import com.fuzhu.base.PoiExcelBase;
    import com.fuzhu.base.StyleInterface;
    import com.fuzhu.model.Student;
    import com.fuzhu.styleImpl.MyStyle;
    import com.fuzhu.styleImpl.TestStyle;
    import com.fuzhu.util.PoiBeanFactory;
    import com.fuzhu.base.PoiInterface;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * Created by 符柱成 on 2017/8/24.
     */
    public class ExportBeanTest {
        public static void main(String [] args) throws IOException {
            List<String> listName = new ArrayList<>();
            listName.add("id");
            listName.add("名字");
            listName.add("性别");
            List<String> listId = new ArrayList<>();
            listId.add("id");
            listId.add("sex");
            listId.add("name");
            List<Student> list = new ArrayList<>();
            list.add(new Student(111,"张三asdf","男"));
            list.add(new Student(111,"李四asd","男"));
            list.add(new Student(111,"王五bhasdcfvbhujidsaub","女"));
    
            FileOutputStream exportXls = null;
            if (PoiExcelBase.EXCEL_VERSION_07==0) {
                exportXls = new FileOutputStream("E://工单信息表.xls");
            }else {
                exportXls = new FileOutputStream("E://工单信息表.xlsx");
            }
            /*
                (一)去工厂拿导出工具
             */
            PoiInterface<Student> poiInterface = PoiBeanFactory.getInstance().getPoiUtil(PoiExcelBase.EXPORT_SIMPLE_EXCEL);
            /*
                (二)自定义样式(可无)
             */
            StyleInterface myStyle = new TestStyle();
            /*
                (三)根据需求选择接口方法(返回码:1是成功,0为失败)
             */
            //导出默认样式EXCEL文件(根据headersId来导出对应字段,)--根据headersId筛选要导出的字段
            //int flag = poiInterface.exportBeanExcel(PoiExcelBase.EXCEL_VERSION_07,"测试POI导出EXCEL文档",listName,listId,list,exportXls);
    
            //导出自定义样式Excel文件--根据headersId筛选要导出的字段
            int flag = poiInterface.exportStyleBeanExcel(PoiExcelBase.EXCEL_VERSION_07,"测试POI导出EXCEL文档",listName,listId,list,exportXls,myStyle);
            //默认导出dtolist的所有数据--默认导出dtolist的所有数据
           // int flag = poiInterface.exportStyleBeanExcel(PoiExcelBase.EXCEL_VERSION_07,"测试POI导出EXCEL文档",listName,list,exportXls,myStyle);
            System.out.println("flag  : "+flag);
            exportXls.close();
        }
    }
    
    

    四、针对List-Map结构:

    (一)导出默认样式的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 ;
    

    demo代码:

    package com.fuzhu.test;
    
    import com.fuzhu.base.PoiExcelBase;
    import com.fuzhu.base.PoiInterface;
    import com.fuzhu.base.StyleInterface;
    import com.fuzhu.model.Student;
    import com.fuzhu.styleImpl.MyStyle;
    import com.fuzhu.util.PoiBeanFactory;
    
    import java.io.FileOutputStream;
    import java.util.*;
    
    /**
     * Created by 符柱成 on 2017/8/25.
     */
    public class ExportMapTest {
        public static void main(String [] args) throws Exception {
    
            List<String> listName = new ArrayList<>();
            listName.add("id");
            listName.add("名字");
            listName.add("性别");
            List<String> listId = new ArrayList<>();
            listId.add("id");
            listId.add("sex");
            listId.add("name");
            List<Map<String,Object>> listB = new ArrayList<>();
            for (int t=0;t<6;t++){
                Map<String,Object> map = new TreeMap<>();
                map.put("id",t);
                map.put("name","abc"+t);
                map.put("sex","男"+t);
                listB.add(map);
            }
    
    
            FileOutputStream exportXls = null;
            if (PoiExcelBase.EXCEL_VERSION_07==0) {
                exportXls = new FileOutputStream("E://工单信息表Map.xls");
            }else {
                exportXls = new FileOutputStream("E://工单信息表Map.xlsx");
            }
            /*
                (一)去工厂拿导出工具
             */
            PoiInterface<Student> poiInterface = PoiBeanFactory.getInstance().getPoiUtil(PoiExcelBase.EXPORT_MAP_EXCEL);
            /*
                (二)自定义样式(可无)
             */
            StyleInterface myStyle = new MyStyle();
            /*
                (三)根据需求选择接口方法(返回码:1是成功,0为失败)
             */
            //导出默认样式的Map结构Excel--根据headersId筛选要导出的字段
            int flag = poiInterface.exportMapExcel(PoiExcelBase.EXCEL_VERSION_07,"测试POI导出EXCEL文档",listName,listId,listB,exportXls);
    
            //导出自定义样式的Map结构Excel--根据headersId筛选要导出的字段
            //int flag = poiInterface.exportStyleMapExcel(PoiExcelBase.EXCEL_VERSION_07,"测试POI导出EXCEL文档",listName,listId,listB,exportXls,myStyle);
            //导出自定义样式的Map结构Excel--没有标题栏字段匹配,数据体dtoList需要使用treemap。--默认导出dtolist的所有数据
            //int flag = poiInterface.exportStyleMapExcel(PoiExcelBase.EXCEL_VERSION_07,"测试POI导出EXCEL文档",listName,listB,exportXls,myStyle);
    
            System.out.println("flag  : "+flag);
            exportXls.close();
        }
    }
    
    

    POI辅助库PoiExportUtil源码下载:JavaWEB--POI之EXCEL操作、优化、封装详解系列(五)--PoiExportUtil使用文档(1)

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

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

    相关文章

      网友评论

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

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