JavaWEB--POI之EXCEL操作、优化、封装详解系列(五)--PoiExportUtil使用文档(1)

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

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

一、库参数说明:

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

 /*
     * 一些通用的方法:在此明确所有参数
     * int  excelVersion         excel的版本
     * String title           表格标题名
     * List headersName      表格属性列名数组(即:每列标题)
     * List  headersId        表格属性列名对应的字段(即:每列标题的英文标识--为了去list去拿)---你需要导出的字段名(所有接口都是支持headersId乱序的设计)
     * List dtoList  或者    List>  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 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 setMySpecifiedHighAndWidth() {
        Map 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 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 headersName, List headersId,
                           List dtoList, OutputStream out);

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

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

(三)默认导出dtolist的所有数据–默认导出dtolist的所有数据:

int exportStyleBeanExcel(int excelVersion,String title, List headersName,
                             List 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 listName = new ArrayList<>();
        listName.add("id");
        listName.add("名字");
        listName.add("性别");
        List listId = new ArrayList<>();
        listId.add("id");
        listId.add("sex");
        listId.add("name");
        List 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 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 headersName, List headersId,
                              List> dtoList, OutputStream out) throws Exception ;

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

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

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

int exportStyleMapExcel(int excelVersion,String title, List headersName,
                                  List> 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 listName = new ArrayList<>();
        listName.add("id");
        listName.add("名字");
        listName.add("性别");
        List listId = new ArrayList<>();
        listId.add("id");
        listId.add("sex");
        listId.add("name");
        List> listB = new ArrayList<>();
        for (int t=0;t<6;t++){
            Map 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 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操作、优化、封装详解系列(五)--PoiExportUtil使用文档(1))