Hutool(Excel工具使用)

2023-11-10

Hutool(Excel工具使用)

官方文档Hutool

目录:

基本依赖的导入

Writer方法的使用

1.1 写出List数据
1.2 写出Map数据
1.3 写出我们的Bean对象
1.4 自定义Bean的key别名
1.5 写出到IO流
1.6 写出到客户端下载(写出到Servlet)

Writer方法的使用补充

2.1 设置单元格背景色
2.2 自定义字体
2.3 写出多个sheet
2.4 更详细的定义样式

ExcelReader读取Excel、流、工作簿

3.1 常用的读取方式

简单实战

4.1 实现Excel的下载
4.2 实现Excel导入到数据库
4.3 实现Excel的模板从服务器下载到客户端


基本依赖的导入


<!-- 基本依赖包 -->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.3.8</version>
</dependency>
<!-- Excel包 -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.2</version>
</dependency>

Writer方法的使用



1. 写出List数据


1.1 制造我们的rows集合对象

List<String> row1 = CollUtil.newArrayList("aa", "bb", "cc", "dd");
List<String> row2 = CollUtil.newArrayList("aa1", "bb1", "cc1", "dd1");
List<String> row3 = CollUtil.newArrayList("aa2", "bb2", "cc2", "dd2");
List<String> row4 = CollUtil.newArrayList("aa3", "bb3", "cc3", "dd3");
List<String> row5 = CollUtil.newArrayList("aa4", "bb4", "cc4", "dd4");

List<List<String>> rows = CollUtil.newArrayList(row1, row2, row3, row4, row5);

1.2 将我们的对象写出

//通过工具类创建writer
ExcelWriter writer = ExcelUtil.getWriter("d:/writeTest.xlsx");
//通过构造方法创建writer
//ExcelWriter writer = new ExcelWriter("d:/writeTest.xls");

//跳过当前行,既第一行,非必须,在此演示用
writer.passCurrentRow();

//合并单元格后的标题行,使用默认标题样式
writer.merge(row1.size() - 1, "测试标题");
//一次性写出内容,强制输出标题
writer.write(rows, true);
//关闭writer,释放内存
writer.close();

2. 写出Map数据


1.1 制造我们的Map对象

Map<String, Object> row1 = new LinkedHashMap<>();
row1.put("姓名", "张三");
row1.put("年龄", 23);
row1.put("成绩", 88.32);
row1.put("是否合格", true);
row1.put("考试日期", DateUtil.date());

Map<String, Object> row2 = new LinkedHashMap<>();
row2.put("姓名", "李四");
row2.put("年龄", 33);
row2.put("成绩", 59.50);
row2.put("是否合格", false);
row2.put("考试日期", DateUtil.date());

ArrayList<Map<String, Object>> rows = CollUtil.newArrayList(row1, row2);

1.2 写出我们的rows对象

// 通过工具类创建writer
ExcelWriter writer = ExcelUtil.getWriter("d:/writeMapTest.xlsx");
// 合并单元格后的标题行,使用默认标题样式
writer.merge(row1.size() - 1, "一班成绩单");
// 一次性写出内容,使用默认样式,强制输出标题
writer.write(rows, true);
// 关闭writer,释放内存
writer.close();

3. 写出我们的Bean对象


1.1 制造我们的Bean数据

TestBean bean1 = new TestBean();
bean1.setName("张三");
bean1.setAge(22);
bean1.setPass(true);
bean1.setScore(66.30);
bean1.setExamDate(DateUtil.date());

TestBean bean2 = new TestBean();
bean2.setName("李四");
bean2.setAge(28);
bean2.setPass(false);
bean2.setScore(38.50);
bean2.setExamDate(DateUtil.date());

List<TestBean> rows = CollUtil.newArrayList(bean1, bean2);

1.2 写出我们的Rows对象

// 通过工具类创建writer
ExcelWriter writer = ExcelUtil.getWriter("d:/writeBeanTest.xlsx");
// 合并单元格后的标题行,使用默认标题样式
writer.merge(4, "一班成绩单");
// 一次性写出内容,使用默认样式,强制输出标题
writer.write(rows, true);
// 关闭writer,释放内存
writer.close();

4. 自定义Bean的key别名


// 通过工具类创建writer
ExcelWriter writer = ExcelUtil.getWriter("d:/writeBeanTest.xlsx");

//自定义标题别名
writer.addHeaderAlias("name", "姓名");
writer.addHeaderAlias("age", "年龄");
writer.addHeaderAlias("score", "分数");
writer.addHeaderAlias("isPass", "是否通过");
writer.addHeaderAlias("examDate", "考试时间");

// 合并单元格后的标题行,使用默认标题样式
writer.merge(4, "一班成绩单");
// 一次性写出内容,使用默认样式,强制输出标题
writer.write(rows, true);
// 关闭writer,释放内存
writer.close();

5. 写出到IO流


// 通过工具类创建writer,默认创建xls格式
ExcelWriter writer = ExcelUtil.getWriter();
//创建xlsx格式的
//ExcelWriter writer = ExcelUtil.getWriter(true);
// 一次性写出内容,使用默认样式,强制输出标题
writer.write(rows, true);
//out为OutputStream,需要写出到的目标流
writer.flush(out);
// 关闭writer,释放内存
writer.close();

6. 写出到客户端下载(写出到Servlet)


1.1 写出xls

// 通过工具类创建writer,默认创建xls格式
ExcelWriter writer = ExcelUtil.getWriter();
// 一次性写出内容,使用默认样式,强制输出标题
writer.write(rows, true);
//out为OutputStream,需要写出到的目标流

//response为HttpServletResponse对象
response.setContentType("application/vnd.ms-excel;charset=utf-8"); 
//test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码
response.setHeader("Content-Disposition","attachment;filename=test.xls"); 
ServletOutputStream out=response.getOutputStream(); 

writer.flush(out, true);
// 关闭writer,释放内存
writer.close();
//此处记得关闭输出Servlet流
IoUtil.close(out);

1.2 写出xlsx

ExcelWriter writer = ExcelUtil.getWriter(true);
writer.write(rows, true);

response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8"); 
response.setHeader("Content-Disposition","attachment;filename=test.xlsx"); 

writer.flush(out, true);
writer.close();
IoUtil.close(out);

Writer方法的使用补充



1. 设置单元格背景色


// 定义单元格背景色
StyleSet style = writer.getStyleSet();
// 第二个参数表示是否也设置头部单元格背景
style.setBackgroundColor(IndexedColors.RED, false);
Copy to clipboardErrorCopied

2. 自定义字体


ExcelWriter writer = ...;
//设置内容字体
Font font = writer.createFont();
font.setBold(true);
font.setColor(Font.COLOR_RED); 
font.setItalic(true); 
//第二个参数表示是否忽略头部样式
writer.getStyleSet().setFont(font, true);
Copy to clipboardErrorCopied

3. 写出多个sheet


//初始化时定义表名
ExcelWriter writer = new ExcelWriter("d:/aaa.xls", "表1");
//切换sheet,此时从第0行开始写
writer.setSheet("表2");
...
writer.setSheet("表3");
...
Copy to clipboardErrorCopied

4. 更详细的定义样式


在Excel中,由于样式对象个数有限制,因此Hutool根据样式种类分为4个样式对象,使相同类型的单元格可以共享样式对象。样式按照类别存在于StyleSet中,其中包括:

头部样式 headCellStyle
普通单元格样式 cellStyle
数字单元格样式 cellStyleForNumber
日期单元格样式 cellStyleForDate
其中cellStyleForNumber cellStyleForDate用于控制数字和日期的显示方式。

因此我们可以使用以下方式获取CellStyle对象自定义指定种类的样式:

StyleSet style = writer.getStyleSet();
CellStyle cellStyle = style.getHeadCellStyle();
...

ExcelReader读取Excel、流、工作簿



1. 常用的读取方式


1.1 构建我们的实体类

@Data
public class Student {
    String name;
    String gender;
    String idCard;
    String mobile;
    String education;
    String remarks;
    // 这个字段在Excel表中没有就不会被Htool封装进入数据
    String more;
}

1.2 选择一张excel表

在这里插入图片描述

1.3 进行ExcelReader的测试使用

@Test
public void test01() {
    // 直接按照行读取所有行的数据
    ExcelReader reader = ExcelUtil.getReader("B:/xlxx backup.xlsx");
    List<List<Object>> read = reader.read();
    read.stream().forEach(objects -> System.out.println(objects));

    System.out.println("-----------------");

    // 第一行的列名 ——> 接下来的列的对应值
    List<Map<String, Object>> maps = reader.readAll();
    maps.stream().forEach(map -> map.entrySet().stream().forEach(item -> System.out.println("Column: "+item.getKey()+" Value: "+item.getValue())));

    System.out.println("-----------------");

    // 根据实体类进行字段的对应
    List<Student> students = reader.readAll(Student.class);
    students.stream().forEach(student -> System.out.println(student));

}

简单实战



1. 实现Excel的下载


1.1 Controller

/**
 * @param pageNum       当前页
 * @param pageSize      页面信息条数
 * @param response      返回流信息对象
 * @description 导出学生Excel
 * @author 叶之越
 * @email 739153436@qq.com
 * @date 2020/7/7 13:50
 */
@ApiOperation("导出分页学生信息")
@PostMapping("/export")
public void export(Integer pageNum, Integer pageSize,HttpServletResponse response) {
    talentStudentService.export(pageNum, pageSize, response);
}

1.2 Service

/**
 * @param pageNum       当前页
 * @param pageSize      页面信息条数
 * @param talentStudent 我们导出的学生数据类型
 * @param response      返回流信息对象
 * @description 导出学生Excel
 * @author 叶之越
 * @email 739153436@qq.com
 * @date 2020/7/7 13:54
 */
@Override
public void export(Integer pageNum, Integer pageSize, TalentStudent talentStudent, HttpServletResponse response) {
    // 从数据库查出数据对象封装成map
    final List<Map<String, Object>> educationList = page(new Page<>(pageNum, pageSize), Wrappers.lambdaQuery(talentStudent)).getRecords()
            .stream()
            // 封装成 Map 并且放入 List
            .map(item -> {
                final Map<String, Object> map = new LinkedHashMap<>();
                // 错误,这里需要根据表中字段名称进行命名
                map.put("name", item.getName());
                map.put("gender", item.getGender());
                map.put("idCard", item.getIdCard());
                map.put("mobile", item.getMobile());
                map.put("education", item.getEducation());
                map.put("remarks", item.getRemarks());
                return map;
            })
            .collect(Collectors.toList());
    // 准备将数据集合封装成Excel对象
    ExcelWriter writer = ExcelUtil.getWriter(true);
    // 通过工具类创建writer并且进行别名
    writer.addHeaderAlias("name", "姓名");
    writer.addHeaderAlias("gender", "性别( 0 表示男 , 1 表示 女)");
    writer.addHeaderAlias("idCard", "身份证");
    writer.addHeaderAlias("mobile", "电话");
    writer.addHeaderAlias("education", "个人介绍");
    writer.addHeaderAlias("remarks", "备注");
    // 准备将对象写入我们的 List
    writer.write(educationList, true);
    try {
        // 获取我们的输出流
        final OutputStream output = response.getOutputStream();
        response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode("stu.xlsx", "UTF-8"));
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        writer.flush(output, true);
        writer.close();
        // 这里可以自行关闭资源或者写一个关闭资源的工具类
        IoUtil.close(output);
    } catch (IOException e) {
        log.error("EducationServiceImpl [export] 输出到响应流失败", e);
        throw new BusinessException("导出Excel异常");
    }
}

2. 实现Excel导入到数据库


1.1 Controller

/**
 * @param file 需要同步学生信息用户的Excel文件
 * @description 导入查询学生信息
 * @author 叶之越
 * @email 739153436@qq.com
 * @date 2020/7/7 13:50
 */
@ApiOperation("通过Excel表导入数据")
@PostMapping("/importStudent")
public ResultBean<Boolean> importStudent(@RequestParam MultipartFile file) {
    try {
        return ResultBean.restResult(talentStudentService.getStudentInfos(file.getInputStream()), ErrorCodeInfo.OK);
    } catch (IOException e) {
        log.error("EducationController [getEducation] 获取输入流失败", e);
        throw new BusinessException("获取输入流失败");
    }
}

1.2 Service

/**
 * @param pageNum 当前页
 * @param pageSize 页面信息条数
 * @param talentStudent 我们导出的学生数据类型
 * @param response 返回流信息对象
 * @description 导出学生Excel
 * @author 叶之越
 * @email 739153436@qq.com
 * @date 2020/7/7 13:50
 */
@ApiOperation("导出分页学生信息")
@PostMapping("/export")
public void export(Integer pageNum, Integer pageSize, TalentStudent talentStudent, HttpServletResponse response) {
    talentStudentService.export(pageNum,pageSize, talentStudent,response);
}

3. 实现Excel的模板从服务器下载到客户端


1.1 Controller

/**
 * @param response: 需要对返回IO流
 * @description 返回我们 Excel 的模板
 * @author 叶之越
 * @email 739153436@qq.com
 * @date 2020/7/7 15:15
 */
@ApiOperation("获取学生的数据模板")
@PostMapping("/getExcelTemplate")
public void getExcelTemplate(HttpServletResponse response) {
    talentStudentService.getExcelTemplate(response);
}
}

1.2 Service

/**
 * @param response: 返回输入流
 * @description 下载我们 Excel 的模板
 * @author 叶之越
 * @email 739153436@qq.com
 * @date 2020/7/7 15:17
 */
@Override
public void getExcelTemplate(HttpServletResponse response) {

    try {
        // 1 读取对象
        final ExcelReader reader = ExcelUtil.getReader(this.getClass().getResourceAsStream("/exceltemplate/stu.xlsx"));
        List<List<Object>> lists = reader.read();
        ExcelWriter writer = ExcelUtil.getWriter(true);
        writer.write(lists);

        response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode("stu.xlsx", "UTF-8"));
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        // 2 写出对象
        ServletOutputStream outputStream = response.getOutputStream();
        // 通过IO写出我们的表格对象
        writer.flush(outputStream, true);
        writer.close();
        IoUtil.close(outputStream);
    } catch (IOException e) {
        log.error("EducationServiceImpl [export] 输出到响应流失败", e);
        throw new BusinessException("导出Excel异常");
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hutool(Excel工具使用) 的相关文章

随机推荐

  • BMP文件格式详解(BMP file format)

    BMP文件格式 又称为Bitmap 位图 或是DIB Device Independent Device 设备无关位图 是Windows系统中广泛使用的图像文件格式 由于它可以不作任何变换地保存图像像素域的数据 因此成为我们取得RAW数据的
  • 【SIMULINK】基于DQ0模型的三相异步电机自制仿真模型教程

    SIMULINK 基于DQ0模型的三相异步电机自制仿真模型 其实 打开simscape自带的异步电机模型 里面也是基于DQ0的 电机的模型定子电压作为输入 定子电流是输出 内部结构 omega 1 是DQ坐标系的转速 为0时退化为 alph
  • 计算机是人类的好伴侣 作文,书是我们的好伴侣_我和书的故事作文

    书 大家是并不陌生的 它会让人陶醉享受 也会使人沉迷于此 总得来说 书 是我们的好伴侣 不管是休闲娱乐 还是读后写作都少不了它 说到我喜欢的书 我还是算得上是个小小小的 书迷 但是我最喜欢沈石溪所写的动物小说 内容精彩而又丰富 把这所有的动
  • Android性能分析和优化之traces.txt(ANR分析)

    ANR 类型分类 1 KeyDispatchTimeout 5 seconds 主要类型按键或触摸事件在特定时间内无响应 按键或者触摸引起的ANR的时间定于是在AMS中 static final int KEY DISPATCHING TI
  • C语言——文件操作

    C语言文件操作 使用文件的原因 文件 程序文件 数据文件 文件名 文件的打开和关闭 文件指针 文件的打开和关闭 文件的顺序读写 文件的随机读写 fseek ftell rewind 文本文件和二进制文件 文件读取结束的判定 文件缓冲区 使用
  • Python 入门习题

    如果下面代码有问题或者你有更好的实现方法欢迎与我私信 1 输入一个字符串 内容是带小数的实数 例如 123 45 输出是两个整数变量x和y x是整数部分123 y是小数部分45 你可以用split函数完成 str input L str s
  • iOS编程基础-OC(七)-运行时系统(续)

    该系列文章系个人读书笔记及总结性内容 任何组织和个人不得转载进行商业活动 第7章 运行时系统 7 4 动态绑定 动态绑定 dynamic binding 是指在运行程序时 而不是在编译时 将消息与方法对应起来的处理过程 在运行程序和发送消息
  • Motionbuilder矩阵计算方式

    基本使用 对于类型为 FBModel 的对象 有 GetMatrix SetMatrix 方法来获取及设置其变换矩阵 GetMatrix pMatrix FBMatrix pWhat kModelTransformation pGlobal
  • SpringBoot 集成 Apollo 配置中心,一文搞定!(万字长文)

    由于 Apollo 概念比较多 刚开始使用比较复杂 最好先过一遍概念再动手实践尝试使用 1 背景 随着程序功能的日益复杂 程序的配置日益增多 各种功能的开关 参数的配置 服务器的地址 对程序配置的期望值也越来越高 配置修改后实时生效 灰度发
  • STM32操作增量式编码器(一)----使用外部中断实现测速

    1 编码器概述 这里对此不再详细说明 本博文重在如何使用编码器 有兴趣的同学可以去网上了解 或者参考一下博文 旋转编码器工作原理 2 增量式编码器控制思路 图2 1 编码器实物图 图2 2 编码器与MCU接线图 我们首先需要清楚编码器输出什
  • 【剑指Offer题解:java】从上往下打印二叉树

    题目 从上往下打印出二叉树的每个节点 同层节点从左至右打印 分析 初始化 一个队列Queue queue 将root节点入队列queue 如果队列不空 做如下操作 弹出队列头 保存为node 将node的左右非空子节点加入队列 做2 3步骤
  • Zimbra安装成功后,邮件发送失败!!急!!发生错误 (mail.TRY_AGAIN),原因不详。

    method unknown msg try again Unable to connect to the MTA code mail TRY AGAIN detail soap Receiver trace com zimbra cs m
  • Less-27and27a

    文章目录 1 思路分析 2 注入过程 3 27a 1 思路分析 这一关表上上告诉你他只是过滤了union和select 其实不然 function blacklist id id preg replace id strip out id p
  • MQ-2烟雾报警器

    MQ 2烟雾报警器 原理 MQ 2型烟雾传感器属于二氧化锡半导体气敏材料 属于表面离子式N型半导体 处于200 300摄氏度时 二氧化锡吸附空气中的氧 形成氧的负离子吸附 使半导体中的电子密度减少 从而使其电阻值增加 当与烟雾接触时 如果晶
  • 传输线阻抗理论

    一 理想元件阻抗特性 对于所有的理想元件 传输线 阻抗 为该导体两端的电压和流经该导体的电流的比值 一般包括阻抗 感抗和容抗的统称 电阻阻抗 电感感抗 电容容抗 显然 对于理想电感和电容 其阻抗和频率有关 理想电感器的阻抗随频率升高而增大
  • maven手动引入仓库文件操作

    捕获 jpg 一 idea打开maven命令窗口 在框里输入命令 mvn install install file DgroupId com elink web DartifactId jcifs Dversion 1 3 15 SNAPS
  • 【2021年全国大学生数学建模竞赛题】“生产企业原材料的订购与运输”详细解析(内附MATLAB代码)

    2021年全国大学生数学建模竞赛题 生产企业原材料的订购与运输 详细解析 内附MATLAB代码 文章目录 1 模型建立 1 1确定被评判对象的对象集及因素集 1 2确定各评价指标权重 1 3建立相对模糊及对因素的偏差加权平均 1 4根据Fj
  • Android APK安装完成自动删除安装包

    需要实现此功能 一般实际开发是在自动版本更新上 当更新完开始自动安装完毕后 删除内存卡里的安装包 实现方式很简单 监听应用广播 获取内存卡下的文件 删除 1 监听广播 java view plain copy package com exa
  • 数据库系统原理课程总结8——备份与日志初步、并发模拟实验

    一 备份与日志初步实验 1 了解你所使用的数据库平台的单表数据备份和整库备份方法 进行相应备份操作 并尝试利用备份数据在另一个机器上恢复数据 并在实验报告中描述上述过程 答 首先 在MySQL中使用mysqldump将数据库的单表数据以sq
  • Hutool(Excel工具使用)

    Hutool Excel工具使用 官方文档Hutool 目录 基本依赖的导入 Writer方法的使用 1 1 写出List数据 1 2 写出Map数据 1 3 写出我们的Bean对象 1 4 自定义Bean的key别名 1 5 写出到IO流