您的位置:

Hutool导出Excel教程:如何实现Excel数据导出

Excel作为一种非常常见的表格文件,通常用于存储和展示大量的数据,也是很多程序员在日常工作中不可避免会碰到的。而Hutool是针对Java语言的一个开源工具包,提供了丰富的API,使程序员能够快速、简单地完成各种常见操作。

一、Hutool导出Excel的基本原理

在讲解Hutool导出Excel之前,需要了解一下Excel的基本结构,通常由Workbook、Sheet、Row和Cell几个对象组成。Workbook代表整个Excel文件,一个Workbook可以包含多个Sheet,而每个Sheet则包含多个Row,每个Row包含多个Cell。

导出Excel的流程一般为:先创建Workbook对象-> 在该对象中创建Sheet对象 -> 然后在Sheet对象中创建Row对象 -> 最后在每个Row对象中创建Cell对象并填充数据。而Hutool则为我们提供了非常方便的API,能够在不需要我们手动创建这些对象的情况下,快速地完成Excel数据的导出。

二、Hutool导出Excel的使用方法

首先需要导入Hutool相关的依赖, 接下来我们使用Hutool导出一个简单的Excel表格,表格内容为:姓名、性别、年龄。

1. 创建Excel对象

// 创建工作簿
Workbook workbook = ExcelUtil.getWorkbook();
// 创建工作表
Sheet sheet = workbook.createSheet("学生信息表");

使用ExcelUtil提供的方法,可以轻松地创建Excel对象。ExcelUtil的getWorkbook()方法默认会创建一个XSSFWorkbook对象,而如果想要创建一个HSSFWorkbook对象(即Excel 2003以前的版本),则可以使用getHSSFWorkbook()方法。

2. 创建表头

Row header = sheet.createRow(0);
header.createCell(0).setCellValue("姓名");
header.createCell(1).setCellValue("性别");
header.createCell(2).setCellValue("年龄");

在这里我们创建了一个Row对象,即表头,设置了表头的列名。

3. 填充数据

for (int i = 0; i < students.size(); i++) { 
    Row row = sheet.createRow(i + 1);
    row.createCell(0).setCellValue(students.get(i).getName());
    row.createCell(1).setCellValue(students.get(i).getGender());
    row.createCell(2).setCellValue(students.get(i).getAge());
}

填充数据和创建表头很类似,只需要在每个Row对象中根据列号设置对应数据即可。

4. 导出Excel

ExcelWriter writer = ExcelUtil.getWriter("学生信息表.xlsx");
writer.write(workbook);
writer.close();

使用ExcelWriter对象的write()方法将Workbook对象写入到文件中,然后关闭ExcelWriter对象即可。在这里我们导出了一个名称为“学生信息表”的Excel文件。

三、Hutool导出Excel的高级用法

Hutool提供了丰富的API,能够使Excel导出的过程更加简单、高效地完成。这里介绍两种常见的高级用法。

1. 导出Excel的同时对数据进行格式化

可能出现这样的情况,导出到Excel的数据需要进行一些数值格式化,例如将浮点数保留到小数点后两位、转换时间格式等等。Hutool提供了FormatCellValue接口,可以用来对导出到Excel的数据进行格式化。下面是一个简单的示例:

Map map = CollUtil.newHashMap();
map.put("name", "张三");
map.put("age", 18);
map.put("height", 175);

ExcelWriter writer = ExcelUtil.getWriter();
writer.writeCellValue(0, 0, map, new FormatCellValue() {
    public Object format(Object value, Object key, Cell cell) {
        if (StrUtil.equals(key.toString(), "age")) {
            return value + "岁";
        } else if (StrUtil.equals(key.toString(), "height")) {
            return value + "厘米";
        }
        return value;
    }
});

writer.flush(response.getOutputStream());
writer.close();

  

在这个示例中,我们定义了一个FormatCellValue的实现类,在这个实现类中,我们为数据的“年龄”和“身高”列添加了单位,使用setCellValue()方法导出数据即可。

2. 导出Excel并将其存储在云存储平台中

不仅可以将Excel导出到本地文件系统中,还可以将其存储在云存储平台中。Hutool提供了多种云存储平台的支持,例如:阿里云OSS、腾讯云COS等等。在这里以阿里云OSS为例进行介绍:

private static final String ENDPOINT = "oss-cn-hangzhou.aliyuncs.com";
private static final String ACCESS_KEY_ID = "xxxx";
private static final String ACCESS_KEY_SECRET = "xxxx";
private static final String BUCKET_NAME = "xxxx";

public void exportExcel(List<Student> students) {
    Workbook workbook = ExcelUtil.getWorkbook();
    Sheet sheet = workbook.createSheet("学生信息表");

    // 创建表头
    Row header = sheet.createRow(0);
    header.createCell(0).setCellValue("姓名");
    header.createCell(1).setCellValue("性别");
    header.createCell(2).setCellValue("年龄");

    // 填充数据
    for (int i = 0; i < students.size(); i++) {
        Row row = sheet.createRow(i + 1);
        row.createCell(0).setCellValue(students.get(i).getName());
        row.createCell(1).setCellValue(students.get(i).getGender());
        row.createCell(2).setCellValue(students.get(i).getAge());
    }

    // 导出Excel
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    ExcelWriter writer = new ExcelWriter(outputStream, ExcelTypeEnum.XLSX);
    writer.write(workbook);
    writer.finish();
    
    // 存储到OSS
    ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
    OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
    ossClient.putObject(BUCKET_NAME, "学生信息表.xlsx", inputStream);
    ossClient.shutdown();
}

在这个示例中,我们使用ExcelWriter将Workbook导出为一个流,然后将其转为一个字节数组,最后将其存储到阿里云OSS中。

总结

本文主要介绍了如何使用Hutool进行Excel数据导出,从Hutool导出Excel的基本原理、使用方法到高级用法中的格式化、存储在云平台中均有阐述。希望本文能够帮助到初学者快速了解和使用Hutool中的Excel相关API。