EasyExcel使用与详细说明,EasyExcel工具类(二)

简介: EasyExcel使用与详细说明,EasyExcel工具类

3.4.3 文件下载

🍀 编写实体类并创建对象以便写入表格

import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
/**
 * 学生实体类
 * lombok:通过一个插件 + 一个依赖 ,就可以在编译的时候自动帮助生成实体类常用方法
 * 注解 @ContentRowHeight():内容的行高
 * 注解 @HeadRowHeight:表头的行高
 *
 * @author 狐狸半面添
 * @create 2023-02-26 14:56
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
    /**
     * id
     */
    @ExcelIgnore
    private String id;
    /**
     * 学生姓名
     */
    @ExcelProperty("学生姓名")
    private String name;
    /**
     * 学生性别
     */
    @ExcelProperty("学生性别")
    private String gender;
    /**
     * 学生出生日期
     */
    @ExcelProperty("学生出生日期")
    private Date birthday;
}

🍀 将数据写入到响应体实现下载

/**
     * 文件下载
     * 1. 编写实体类并创建对象以便写入表格
     * 2. 设置响应参数:文件的ContentType和文件名,同时设置编码避免乱码
     * 3. 直接写,内部会调用finish方法自动关闭OutputStream
     */
    @GetMapping("/download")
    public void download(HttpServletResponse response) throws IOException {
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        // 防止中文乱码:import java.net.URLEncoder
        String fileName = URLEncoder.encode("测试", "UTF-8");
        response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + fileName + ".xlsx");
        // 创建文件簿
        ExcelWriterBuilder workBook = EasyExcel.write(response.getOutputStream(), Student.class);
        // 创建一个文件表
        ExcelWriterSheetBuilder sheet = workBook.sheet("模板");
        // 生成测试数据
        ArrayList<Student> students = new ArrayList<Student>();
        for (int i = 1; i <= 10; i++) {
            students.add(new Student(null, "逐浪者-" + i, "男", new Date()));
        }
        // 写入,并且会关闭流
        sheet.doWrite(students);
    }

🍀 浏览器测试

💻 访问:http://localhost:8080/student/download

3.5 自定义单元格样式

EasyExcel支持调整行高、列宽、背景色、字体大小等内容,但是控制方式与使用原生POI无异,比较繁琐,不建议使用。

但是可以使用模板填充的方式,向预设样式的表格中直接写入数据,写入数据的时候会保持原有样式。

4.填充

4.1 填充一组数据

🍀 准备模板

Excel表格中用{} 来表示包裹要填充的变量,如果单元格文本中本来就有{}左右大括号,需要在括号前面使用斜杠转义\{\}

代码中被填充数据的实体对象的成员变量名或被填充map集合的key需要和Excel中被{}包裹的变量名称一致。

🍀 封装数据

编写封装填充数据的类或选用Map

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
 * 使用实体类封装填充数据
 * 实体中成员变量名称需要和Excel表各种{}包裹的变量名匹配
 *
 * @author 狐狸半面添
 * @create 2023-02-26 17:32
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class FillData {
    /**
     * 姓名
     */
    private String name;
    /**
     * 年龄
     */
    private int age;
}

🍀 填充

准备数据并填充到文件

/**
     * 单组数据填充:封装类的方式
     */
    @Test
    public void test03() {
        // 1.准备模板
        String templatePath = FillData.class.getResource("/fill_data_template1.xlsx").getPath();
        // 2.创建一个工作簿对象
        ExcelWriterBuilder writeWorkBook = EasyExcel.write("excel填充-单组数据.xlsx", FillData.class)
                .withTemplate(templatePath);
        // 3.创建工作表对象
        ExcelWriterSheetBuilder sheet1 = writeWorkBook.sheet("sheet1");
        // 4.准备数据
        FillData fillData = new FillData("逐浪者", 19);
        // 5.填充数据,并关闭流
        sheet1.doFill(fillData);
    }
    /**
     * 单组数据填充:map的方式
     */
    @Test
    public void test04() {
        // 1.准备模板
        String templatePath = FillData.class.getResource("/fill_data_template1.xlsx").getPath();
        // 2.创建一个工作簿对象
        ExcelWriterBuilder writeWorkBook = EasyExcel.write("excel填充-单组数据.xlsx", FillData.class)
                .withTemplate(templatePath);
        // 3.创建工作表对象
        ExcelWriterSheetBuilder sheet1 = writeWorkBook.sheet("sheet1");
        // 4.准备数据:使用Map数据填充
        HashMap<String, Object> mapFillData = new HashMap<>();
        mapFillData.put("name", "狐狸半面添");
        mapFillData.put("age", 18);
        // 5.填充数据,并关闭流
        sheet1.doFill(mapFillData);
    }

🍀 测试效果

4.2 填充多组数据

🍀 准备模板

Excel表格中用{.} 来表示包裹要填充的变量,如果单元格文本中本来就有{}左右大括号,需要在括号前面使用斜杠转义\{\}

代码中被填充数据的实体对象的成员变量名或被填充map集合的key需要和Excel中被{}包裹的变量名称一致。

🍀 封装数据

编写封装填充数据的类或选用Map

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
 * 使用实体类封装填充数据
 * 实体中成员变量名称需要和Excel表各种{}包裹的变量名匹配
 *
 * @author 狐狸半面添
 * @create 2023-02-26 17:32
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class FillData {
    /**
     * 姓名
     */
    private String name;
    /**
     * 年龄
     */
    private int age;
}

🍀 填充

准备数据并填充到文件

/**
     * 多组数据填充:封装类的方式
     */
    @Test
    public void test05() {
        // 1.准备模板
        String templatePath = FillData.class.getResource("/fill_data_template2.xlsx").getPath();
        // 2.创建一个工作簿对象
        ExcelWriterBuilder writeWorkBook = EasyExcel.write("excel填充-多组数据.xlsx", FillData.class)
                .withTemplate(templatePath);
        // 3.创建工作表对象
        ExcelWriterSheetBuilder sheet1 = writeWorkBook.sheet("sheet1");
        // 4.准备数据
        ArrayList<FillData> data = new ArrayList<>();
        for (int i = 15; i <= 30; i++) {
            data.add(new FillData("逐浪者-" + i, i));
        }
        // 5.填充数据,并关闭流
        sheet1.doFill(data);
    }

🍀 测试效果

4.3 组合填充

🍀 准备模板

即有多组数据填充,又有单一数据填充,为了避免两者数据出现冲突覆盖的情况,在多组填充时需要通过FillConfig对象设置换行。

🍀 封装数据

编写封装填充数据的类或选用Map

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
 * 使用实体类封装填充数据
 * 实体中成员变量名称需要和Excel表各种{}包裹的变量名匹配
 *
 * @author 狐狸半面添
 * @create 2023-02-26 17:32
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class FillData {
    /**
     * 姓名
     */
    private String name;
    /**
     * 年龄
     */
    private int age;
}

🍀 填充

准备数据并填充到文件

/**
     * 组合数据填充
     */
    @Test
    public void test06() {
        // 1.准备模板
        String templatePath = FillData.class.getResource("/fill_data_template3.xlsx").getPath();
        // 2.创建一个工作簿对象
        ExcelWriter workBook = EasyExcel.write("excel填充-组合数据.xlsx", FillData.class)
                .withTemplate(templatePath).build();
        // 3.创建工作表对象
        WriteSheet sheet = EasyExcel.writerSheet().build();
        // 组合填充时,因为多组填充的数据量不确定,需要在多组填充完之后另起一行
        FillConfig fillConfig = FillConfig.builder().forceNewRow(true).build();
        // 4.准备数据
        ArrayList<FillData> data = new ArrayList<>();
        for (int i = 15; i <= 30; i++) {
            data.add(new FillData("逐浪者-" + i, i));
        }
        HashMap<String, String> dateAndTotal = new HashMap<>();
        dateAndTotal.put("date", "2023-02-26");
        dateAndTotal.put("total", "10000");
        // 5.填充数据,会一并关闭流
//        sheet1.doFill(data);
        // 多组填充
        workBook.fill(data, fillConfig, sheet);
        // 单组填充
        workBook.fill(dateAndTotal, sheet);
        // 关闭流
        workBook.finish();
    }

🍀 测试效果

4.4 水平填充

🍀 准备模板

水平填充和多组填充模板一样,不一样的地方在于,填充时需要通过FillConfig对象设置水平填充。

🍀 封装数据

编写封装填充数据的类或选用Map

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
 * 使用实体类封装填充数据
 * 实体中成员变量名称需要和Excel表各种{}包裹的变量名匹配
 *
 * @author 狐狸半面添
 * @create 2023-02-26 17:32
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class FillData {
    /**
     * 姓名
     */
    private String name;
    /**
     * 年龄
     */
    private int age;
}

🍀 填充

准备数据并填充到文件

/**
     * 水平填充
     */
    @Test
    public void test07() {
        // 1.准备模板
        String templatePath = FillData.class.getResource("/fill_data_template4.xlsx").getPath();
        // 2.创建一个工作簿对象
        ExcelWriter workBook = EasyExcel.write("excel填充-水平填充.xlsx", FillData.class)
                .withTemplate(templatePath).build();
        // 3.创建工作表对象
        WriteSheet sheet = EasyExcel.writerSheet().build();
        // 4.数据准备
        ArrayList<FillData> data = new ArrayList<>();
        for (int i = 15; i <= 30; i++) {
            data.add(new FillData("逐浪者-" + i, i));
        }
        // 换行
        FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build();
        // 多组填充
        workBook.fill(data, fillConfig, sheet);
        // 关闭流
        workBook.finish();
    }

🍀 测试效果

4.5 注意事项

为了节省内存,所以没有采用把整个文档在内存中组织好之后再整体写入到文件的做法,而是采用的是一行一行写入的方式,不能实现删除和移动行,也不支持备注写入。多组数据写入的时候,如果需要新增行,只能在最后一行增加,不能在中间位置添加。

4.6 填充综合练习

/**
     * 报表导出
     */
    @Test
    public void test08() {
        // 1.准备模板
        String templatePath = FillData.class.getResource("/report_template.xlsx").getPath();
        // 2.创建一个工作簿对象
        ExcelWriter workBook = EasyExcel.write("报表.xlsx", FillData.class)
                .withTemplate(templatePath).build();
        // 3.创建工作表对象
        WriteSheet sheet = EasyExcel.writerSheet().build();
        // ****** 准备数据 *******
        // 日期
        HashMap<String, String> dateMap = new HashMap<>();
        dateMap.put("date", "2020-03-16");
        // 总会员数
        HashMap<String, String> totalCountMap = new HashMap<>();
        dateMap.put("totalCount", "1000");
        // 新增员数
        HashMap<String, String> increaseCountMap = new HashMap<>();
        dateMap.put("increaseCount", "100");
        // 本周新增会员数
        HashMap<String, String> increaseCountWeekMap = new HashMap<>();
        dateMap.put("increaseCountWeek", "50");
        // 本月新增会员数
        HashMap<String, String> increaseCountMonthMap = new HashMap<>();
        dateMap.put("increaseCountMonth", "100");
        // 新增会员数据
        List<Student> students = new ArrayList<>();
        for (int i = 1; i <= 10; i++) {
            students.add(new Student(null, "逐浪者-" + i, "男", new Date()));
        }
        // **** 准备数据结束****
        // 写入统计数据
        workBook.fill(dateMap, sheet);
        workBook.fill(totalCountMap, sheet);
        workBook.fill(increaseCountMap, sheet);
        workBook.fill(increaseCountWeekMap, sheet);
        workBook.fill(increaseCountMonthMap, sheet);
        // 写入新增会员
        workBook.fill(students, sheet);
        // 关闭流
        workBook.finish();
    }


相关文章
|
前端开发 Java 数据库连接
Spring Boot 3 整合 Mybatis-Plus 动态数据源实现多数据源切换
Spring Boot 3 整合 Mybatis-Plus 动态数据源实现多数据源切换
|
前端开发
File和MultipartFile互相转化工具类
File和MultipartFile互相转化工具类
2139 0
|
存储 easyexcel Java
EasyExcel教程
EasyExcel教程
16528 0
|
前端开发 easyexcel Java
Java+EasyExcel实现文件导入导出,导入导出如此简单
项目中需要Excel文件的导入与导出Excel并下载,例如,导入员工信息,导出员工信息,手动输入比较繁琐,所以本篇博文教大家如何在Java中导入Excel文件与导出Excel文件
15058 3
Java+EasyExcel实现文件导入导出,导入导出如此简单
|
11月前
|
消息中间件 Java Kafka
在Java中实现分布式事务的常用框架和方法
总之,选择合适的分布式事务框架和方法需要综合考虑业务需求、性能、复杂度等因素。不同的框架和方法都有其特点和适用场景,需要根据具体情况进行评估和选择。同时,随着技术的不断发展,分布式事务的解决方案也在不断更新和完善,以更好地满足业务的需求。你还可以进一步深入研究和了解这些框架和方法,以便在实际应用中更好地实现分布式事务管理。
|
10月前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
1987 65
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
easyexcel Java 关系型数据库
阿里巴巴-EasyExcel 基于Java的简单、省内存的读写Excel
该文章主要介绍了在Java应用中如何使用EasyExcel技术完成对Excel文件的导入和导出操作,包括环境搭建、基本概念、快速入门、进阶操作和综合应用等内容,并提供了相关代码示例和注意事项。
 阿里巴巴-EasyExcel 基于Java的简单、省内存的读写Excel
|
存储 JavaScript easyexcel
EasyExcel使用与详细说明,EasyExcel工具类(一)
EasyExcel使用与详细说明,EasyExcel工具类
1777 0
|
数据可视化 程序员
IDEA插件-Rainbow Variable/IDEA彩色变量
"Rainbow Variable"是一款用于 IntelliJ IDEA 的插件,旨在提高代码中变量的可视化区分度。通过使方法中的参数和变量呈现不同的颜色,提高代码可读性。 插件允许用户自定义颜色,使得在同一个函数内部相同的变量采用相同的颜色,从而避免误用。
2493 0
IDEA插件-Rainbow Variable/IDEA彩色变量
|
easyexcel Java API
SpringBoot集成EasyExcel 3.x:高效实现Excel数据的优雅导入与导出
SpringBoot集成EasyExcel 3.x:高效实现Excel数据的优雅导入与导出
2280 1