excel导出工具

简介:

介绍

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,有需要的可以去下载。

目录
相关文章
|
3天前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
45 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
3月前
|
人工智能 Python
读取excel工具:openpyxl | AI应用开发
`openpyxl` 是一个 Python 库,专门用于读写 Excel 2010 xlsx/xlsm/xltx/xltm 文件。它是处理 Excel 文件的强大工具,可以让你在不需要安装 Excel 软件的情况下,对 Excel 文件进行创建、修改、读取和写入操作【10月更文挑战第3天】
102 0
|
9天前
|
人工智能 自然语言处理 JavaScript
Univer:开源全栈 AI 办公工具,支持 Word、Excel、PPT 等文档处理和多人实时协作
Univer 是一款开源的 AI 办公工具,支持 Word、Excel 等文档处理的全栈解决方案。它具有强大的功能、高度的可扩展性和跨平台兼容性,适用于个人和企业用户,能够显著提高工作效率。
68 7
Univer:开源全栈 AI 办公工具,支持 Word、Excel、PPT 等文档处理和多人实时协作
|
2月前
|
前端开发
实现Excel文件和其他文件导出为压缩包,并导入
实现Excel文件和其他文件导出为压缩包,并导入
32 1
|
2月前
|
数据可视化 数据挖掘 项目管理
打破协作壁垒,Excel多人协同编辑工具带来翻天覆地的变化!
在现代办公中,团队协作和信息共享至关重要。Excel的多人协同编辑功能显著提升了工作效率,避免了版本冲突和重复劳动。市场上的Google Sheets、Airtable、板栗看板和Zoho Sheet等工具也提供了类似功能。以其清晰的界面和强大的数据分析能力,特别适合项目管理和进度追踪,帮助团队高效协作,达成目标。
|
2月前
|
数据格式 UED
记录一次NPOI库导出Excel遇到的小问题解决方案
【11月更文挑战第16天】本文记录了使用 NPOI 库导出 Excel 过程中遇到的三个主要问题及其解决方案:单元格数据格式错误、日期格式不正确以及合并单元格边框缺失。通过自定义单元格样式、设置数据格式和手动添加边框,有效解决了这些问题,提升了导出文件的质量和用户体验。
202 3
|
2月前
|
SQL 数据可视化 数据挖掘
想让Excel表格设计更美观?试试这几款好用工具!
Excel表格设计在项目管理和数据分析中至关重要。本文推荐四款辅助工具:板栗看板、Excel自动图表助手、Think-Cell Chart 和 Power BI,分别在任务管理、图表生成、数据可视化等方面表现突出,帮助你设计出更专业、美观的表格。
87 2
|
2月前
|
Java API Apache
|
2月前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
81 4
|
2月前
|
数据处理
在Excel中,通配符是一种强大的工具
【10月更文挑战第23天】在Excel中,通配符是一种强大的工具
26 4