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

前篇我们讲完了我们这个工具库的架构设计篇,那个是我工具设计的思想点。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的博客

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

推荐阅读更多精彩内容