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