介绍

excel导出工具

整个项目的代码结构如下

com
\---utils
+---demo # 案例相关
| | ExcelExportApplication.java # springboot启动类
| |
| +---bean
| | DemoBean.java # 测试bean
| |
| +---controller
| | ExcelExportController.java # 测试url访问弹出下载excel文件和导出excel到文件
| |
| \---exportParam
| | DemoExportParam.java # 导出参数
| |
| \---dataConversion
| HobbyConversion.java # 爱好属性导出转换类
| SexConversion.java # 性别属性导出转换类
|
\---excelExport # 导出工具包
| AsyncExportExcel.java #多线程导出
| ExportExcel.java # 导出工具类
|
+---data
| BaseParam.java # 基础导出参数类
|
+---dataConversion
| DataExportConversion.java # 属性导出转换接口
|
+---defaultDataHandle # 默认的数据处理
| AbstractDataHandler.java
| BooleanDataHandler.java
| DataHandlerFactory.java
| DateDataHandler.java
| StringDataHandler.java
|
\---style # 默认的样式
AbstractCellStyle.java
DefaultDataCellStyle.java
DefaultTitleCellStyle.java

简单的来说excel导出可以分为几步

  1. 获得需要导出的数据
  2. 设置excel的工作表(sheet)名称
  3. 设置当前工作表的第一行,也就是标题行
  4. 将数据逐行填充,有需要的数据进行转换

使用

ExportExcel工具类

首先实例化ExportExcel工具类,我这里提供了三个构造函数

public ExportExcel() 

public ExportExcel(SXSSFWorkbook workbook) 

public ExportExcel(SXSSFWorkbook workbook, AbstractCellStyle titleCellStyle, AbstractCellStyle dataCellStyle)

通常使用的是无参构造函数。另外两个都需要自己实例化workbook对象,有三个参数的构造函数,需要传入workbook、标题行样式对象、数据行样式对象。关于样式对象下方有说明。


实例化ExportExcel工具类之后,需要调用exportExcel方法,方法定义如下

public void exportExcel(String sheetName, BaseParam baseParam, OutputStream out)
参数名称 参数内容
sheetName 工作表(sheet)的名称
baseParam 继承BaseParam的导出参数对象(后面会说明)
out OutputStream对象、例如FileOutputStream

样式抽象类AbstractCellStyle

public abstract class AbstractCellStyle {
Workbook workbook;
CellStyle style;
Font font; public AbstractCellStyle(Workbook workbook) {
this.workbook = workbook;
style = workbook.createCellStyle();
font = workbook.createFont();
} protected abstract void setStyle(); protected abstract void setFont(); public CellStyle getCellStyle() {
style.setFont(font);
return style;
}
}

通过继承样式抽象类AbstractCellStyle,可以实现下方两个方法

// 设置样式
protected abstract void setStyle();
// 设置字体
protected abstract void setFont();

通过这两个方法可以修改单元格的样式和字体。

基础导出参数类BaseParam

BaseParam类代码如下

public class BaseParam {
public List data = new ArrayList<>();
public List<ColumnParam> columnParams = new ArrayList<>(); //Set Get Constructor /**
* 数据行参数
*/
public class ColumnParam{```}
}

属性

可以看到BaseParam类有两个属性

public List data = new ArrayList<>();
public List<ColumnParam> columnParams = new ArrayList<>();

data毫无疑问是存放需要导出的数据,而columnParams是存放每一列的数据,现在来看看内部类ColumnParam

内部类ColumnParam

public class ColumnParam{
private String headerName;
private String fieldName;
private DataExportConversion conversion;//数据转换 //Set Get Constructor
}
属性
属性名称 属性内容
headerName 标题名称
fieldName 实体类对应的属性名
conversion 数据转换对象
数据转换接口DataExportConversion
public interface DataExportConversion<T> {
String transferData(T data);
}

比如说,获取出来的数据是0、1,然后你需要将数据转换成女、男,那么就可以实现数据转换接口DataExportConversion,自定义转换输出的格式,代码如下

public class SexConversion implements DataExportConversion<Integer> {
@Override
public String transferData(Integer data) {
if (0 == data){
return "女";
} else if (1 == data){
return "男";
}
return "不详";
}
}

案例

场景

原始数据如下

姓名 性别 出生日期 爱好(List对象)
尘心 0 2018-08-08 14:59:11 [舞刀,弄枪]
千月 1 2018-08-08 14:59:11 [唱歌,跳舞]

需要转换为下方内容

姓名 性别 出生日期 爱好
尘心 2018-08-08 14:59:11 舞刀,弄枪
千月 2018-08-08 14:59:11 唱歌,跳舞

实体类如下

public class DemoBean {

    //姓名
private String name; //性别,0->女,1->男
private Integer sex; //出生日期
private Date birthday; //爱好
private List<String> hobbies; //Set Get }

数据转换

可以看到有两个属性需要转换,分别是性别和爱好。性别的数据转换上面已经有了,就不贴出来了,下面是爱好的数据转换

public class HobbyConversion implements DataExportConversion<List<String>> {
@Override
public String transferData(List<String> data) {
StringBuilder hobby = new StringBuilder(); for (String s:data){
hobby.append(s).append(",");
} //移除最后一个逗号
if (hobby.length() >= 1){
hobby.deleteCharAt(hobby.length()-1);
} return hobby.toString();
}
}

导出参数类

数据转换类写好了之后,开始编写导出参数类,代码如下

public class DemoExportParam extends BaseParam {
public DemoExportParam(List<DemoBean> list) {
setData(list);
setColumnParam();
} private void setColumnParam() {
columnParams.add(new ColumnParam("姓名","name"));
columnParams.add(new ColumnParam("性别","sex", new SexConversion()));
columnParams.add(new ColumnParam("出生日期","birthday"));
columnParams.add(new ColumnParam("爱好","hobbies", new HobbyConversion()));
}
}

在实例化DemoExportParam时,需要传入导出的数据,同时设置每一列对应的列参数ColumnParam。

可以看到总共有4个列参数

  • 第一列标题名称为姓名,对应的属性名称为name
  • 第二列标题名称为性别,对应的属性名称为sex,还有数据转换对象SexConversion
  • 第三列标题名称为出生日期,对应的属性名称为birthday
  • 第四列标题名称为爱好,对应的属性名称为hobbies,数据转换对象HobbyConversion

导出

先写一个生成数据的方法,如下

private List<DemoBean> getDemoBeanList(){
DemoBean man = new DemoBean();
DemoBean woman = new DemoBean(); String[] manHobbys = {"舞刀", "弄枪"};
String[] womanHobbys = {"唱歌", "跳舞"}; man.setName("尘心").setBirthday(new Date()).setSex(0).setHobbies(Arrays.asList(manHobbys));
woman.setName("千月").setBirthday(new Date()).setSex(1).setHobbies(Arrays.asList(womanHobbys)); //将两个bean添加到list中
List<DemoBean> list = new ArrayList<>();
list.add(man);
list.add(woman); return list;
}

接下来有两种数据导出方式,一种是url访问弹出下载excel文件,另外一种是导出excel到文件

url访问弹出下载excel文件

@ResponseBody
@RequestMapping("/export")
public void exportByWeb(HttpServletResponse response) throws IOException { OutputStream out = new BufferedOutputStream(response.getOutputStream()); response.reset();
String headStr = "attachment; filename=" + URLEncoder.encode("导出demo.xlsx", "utf-8");
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
response.setHeader("Content-Disposition", headStr); //获得导出数据
List<DemoBean> list = getDemoBeanList(); DemoExportParam demoExportParam = new DemoExportParam(list); ExportExcel exportExcel = new ExportExcel();
exportExcel.exportExcel("demo", demoExportParam, response.getOutputStream()); out.flush();
out.close();
}

导出excel到文件

@Test
public void exportByFile() throws IOException { File file = new File("F:\\导出demo.xlsx");
FileOutputStream out = new FileOutputStream(file); //获得导出数据
List<DemoBean> list = getDemoBeanList(); DemoExportParam demoExportParam = new DemoExportParam(list); ExportExcel exportExcel = new ExportExcel();
exportExcel.exportExcel("demo", demoExportParam, out); out.flush();
out.close();
}

项目位置:https://github.com/rainbowda/utils/tree/master/excel_export,有需要的可以去下载。

excel导出工具的更多相关文章

  1. 基于jdk1.7实现的excel导出工具类

    通用excel导出工具类,基于泛型.反射.hashmap 以及基于泛型.反射.bean两种方式 import java.io.*;import java.lang.reflect.Field;impo ...

  2. Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类

    Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类 ============================== ©Copyright 蕃薯耀 20 ...

  3. EXCEL导出工具类及调用

    一.Excel导出工具类代码 package com.qiyuan.util; import java.io.OutputStream; import java.io.UnsupportedEncod ...

  4. 自己写的java excel导出工具类

    最近项目要用到excel导出功能,之前也写过类似的代码.因为这次项目中多次用到excel导出.这次长了记性整理了一下 分享给大伙 欢迎一起讨论 生成excel的主工具类: public class E ...

  5. excel导出工具类

    package com.jianwu.util.excel; import com.google.common.collect.Lists;import com.jianwu.exception.Mo ...

  6. 我把这个贼好用的Excel导出工具开源了!!

    写在前面 不管是传统软件企业还是互联网企业,不管是管理软件还是面向C端的互联网应用.都不可避免的会涉及到报表操作,而对于报表业务来说,一个很重要的功能就是将数据导出到Excel.如果我们在业务代码中, ...

  7. 一个很好的通用 excel 导出工具类

    此类用主要 jxl +注解+流 实现扩展性很强,jxl性能会比poi好一点,值得我们学习. package oa.common.utils; import java.io.OutputStream; ...

  8. 「starter推荐」简单高效Excel 导出工具

    EasyExcel EasyExcel是一个基于Java的简单.省内存的读写Excel的开源项目.在尽可能节约内存的情况下支持读写百M的Excel. 64M内存1分钟内读取75M(46W行25列)的E ...

  9. Java常用工具类之Excel导出

    package com.wazn.learn.util; import java.util.List; import java.util.Map; import org.apache.poi.hssf ...

随机推荐

  1. Equation

    You are given an equation: Ax2 + Bx + C = 0. Your task is to find the number of distinct roots of th ...

  2. 1.react的基础知识

    React 的基础之:JSX 语法 react 使用 JSX 语法,js 代码中可以写 HTML 代码. let myTitle = <h1>Hello, World!</h1> ...

  3. 安装CenOS7.4 LNMP环境

    从头开始安装环境 1.在vmware中安装最新的CentOS7.4 linux版本下载地址:http://man.linuxde.net/download/ 下载好的东东为:iso后缀的文件 安装教程 ...

  4. Hibernate基础(一)

    Hibernate是ORM开源组件 源码:http://sourceforge.net/projects/hibernate/ 1.Hibernate的配置文件. 默认配置文件: hibernate. ...

  5. Windows10:怎么安装whl文件

    whl格式本质上是一个压缩包,里面包含了py文件,以及经过编译的pyd文件.使得可以在不具备编译环境的情况下,选择合适自己的python环境进行安装.安装方法很简单,进入命令行输入pip instal ...

  6. iOS中的数据存储

    SQLite3 SQLite3是一款开源的嵌入式关系型数据库,可移植性好,易使用,内存开销小. SQLite3是无类型的,意味着你可以保存任何类型的数据到任意表的任意字段中. SQLite3常用的4种 ...

  7. Cordova 3.x 配置文件config.xml强制横屏

    官方文档: http://cordova.apache.org/docs/en/3.5.0/config_ref_index.md.html#The%20config.xml%20File 添加 &l ...

  8. 关于多账套API的设计

    帐套在财务核算中是记载一个独立核算的经济实体的所有往来信息的一整套记录表和统计分析报表.不同的帐套之间的关系是相对独立的,对其中的任何一个帐套中的数据进行建立.删除或修改都不会影响其他帐套.在ERP中 ...

  9. spring MVC 异常处理整理

    一.异常结构 1.异常由外到内如下: web服务器处理异常--->web应用里面web.xml处理异常--->Spring框架处理异常---->控制器注释处理异常--->控制器 ...

  10. javascript——对象的概念——函数 2 (内建函数与类型转换)

    javascript 有许多内建函数,用于各种操作,以下为常用的内建方法. 1.parseInt(object,int):将输入的 int 进制的值 object 转换为 10 进制的数值: obje ...