Java Hutool 包工具类推荐 ExcelUtil详解
作者:莫傷曉 发布时间:2023-01-22 23:47:12
标签:Java,Hutool,包工具类,ExcelUtil
Java Hutool 包工具类推荐 ExcelUtil
包引入
hutool包版本号可根据实际情况更换
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.4.M1</version>
</dependency>
除hutool包之外,还需要引入操作Excel必要包
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-full</artifactId>
<version>5.0.0</version>
</dependency>
一般简单表头Excel封装工具类
直接上代码
package io.supers.common.utils;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.URLUtil;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import cn.hutool.poi.excel.style.StyleUtil;
import io.supers.framework.em.BaseErrorEnum;
import io.supers.framework.exception.RRException;
import org.apache.commons.collections.CollectionUtils;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Map;
/**
* Excel 工具类
*
* @author guoc
* @date 2022年05月31日 下午 17:21
*/
public class ExcelUtils {
/**
* 下载 Excel 模板 (只有表头的 Excel)
*
* @param response response
* @param headers 表头
* @param fileName 文件名
*/
public static void exportHeaders(HttpServletResponse response, List<String> headers, String fileName) {
export(response, null, headers, fileName);
}
/**
* 导出或下载 Excel 公用方法
*
* @param response 当前请求的 HttpServletResponse
* @param rows 需要写入的数据 List
* @param fileName 最终文件名
*/
public static void export(HttpServletResponse response, List<Map<String, Object>> rows, List<String> headers, String fileName) {
// 获取 Writer
ExcelWriter writer = ExcelUtil.getWriter(true);
// 写入表头
writer = writer.writeHeadRow(headers);
// 若是有数据 则写入数据
if (CollectionUtils.isNotEmpty(rows)) {
writer.write(rows);
}
Workbook workbook = writer.getWorkbook();
CellStyle defaultCellStyle = StyleUtil.createDefaultCellStyle(workbook);
DataFormat format = writer.getWorkbook().createDataFormat();
// 默认为 文本格式
defaultCellStyle.setDataFormat(format.getFormat("@"));
// 默认为 居中
defaultCellStyle.setAlignment(HorizontalAlignment.CENTER);
for (int i = 0; i < headers.size(); i++) {
String h = headers.get(i);
h = h == null ? " " : h;
writer.setColumnStyle(i, defaultCellStyle);
// 默认宽度为 3 * 表头字符数
writer.setColumnWidth(i, 3 * h.length());
}
try {
// 弹出下载对话框的文件名,不能为中文,中文请自行编码
fileName = URLUtil.encode(fileName);
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
response.setContentType(ExcelUtil.XLSX_CONTENT_TYPE);
// 输出
ServletOutputStream out = response.getOutputStream();
writer.flush(out, true);
// 关闭writer,释放内存
writer.close();
//此处记得关闭输出Servlet流
IoUtil.close(out);
} catch (IOException e) {
e.printStackTrace();
throw new RRException(BaseErrorEnum.COMMON_ERROR, "下载文件失败!\n" + e.getMessage());
}
}
/**
* 读取上传到后台的excel
*
* @param file MultipartFile 上传的文件
* @return 数据列表
* @throws IOException e
*/
public static List<Map<String, Object>> readExcelRows(MultipartFile file) throws IOException {
return ExcelUtil.getReader(file.getInputStream()).readAll();
}
}
工具类封装了三个方法, 只写入表头方法, 写入表头和数据方法 和 读取表格数据列表方法。
三个方法的操作简单,看代码就能明白,不多赘述了。
复杂表头或表格内合并单元格写入
合并单元格核心方法
// cn.hutool.poi.excel.ExcelWriter#merge(int, int, int, int, java.lang.Object, boolean)
/**
* 合并某行的单元格,并写入对象到单元格<br>
* 如果写到单元格中的内容非null,行号自动+1,否则当前行号不变<br>
* 样式为默认标题样式,可使用{@link #getHeadCellStyle()}方法调用后自定义默认样式
*
* @param firstRow 起始行,0开始
* @param lastRow 结束行,0开始
* @param firstColumn 起始列,0开始
* @param lastColumn 结束列,0开始
* @param content 合并单元格后的内容
* @param isSetHeaderStyle 是否为合并后的单元格设置默认标题样式,只提取边框样式
* @return this
* @since 4.0.10
*/
public ExcelWriter merge(int firstRow, int lastRow, int firstColumn, int lastColumn, Object content, boolean isSetHeaderStyle) {
Assert.isFalse(this.isClosed, "ExcelWriter has been closed!");
CellStyle style = null;
if (null != this.styleSet) {
style = styleSet.getStyleByValueType(content, isSetHeaderStyle);
}
return merge(firstRow, lastRow, firstColumn, lastColumn, content, style);
}
看完一般表头写入的代码,可以得知,此工具类写入表头时只需传入表头的字符串列表,即 List<String>,若是遇到动态表头时,则可以通过遍历的操作,先生成出导出数据中所有需要的表头信息,即可为下一步的写入数据的数据列表List<Map<String,Object>> 做准备了。
若是遇到某列或某些列中有合并单元格的,一般都有规律的,可以遍历数据时根据合并的数据项内容通过合并单元格方法进行合并单元格操作。
来源:https://www.cnblogs.com/mlxs/archive/2022/09/30/16745344.html


猜你喜欢
- Glide介绍Glide是一个快速高效的Android图片加载库,注重于平滑的滚动。Glide提供了易用的API,高性能、可扩展的图片解码管
- 什么是apllo开源分布式配置中心?apllo开源分布式配置中心是携程框架部门研发的一个能够集中化管理应用的不同环境、不同集群的配置,并且具
- 1.vs中生成dll对应的生成dll的cpp如下 #include<opencv2/opencv.hpp>#inclu
- 1. 概述官方JavaDocsApi: java.awt.BorderLayout BorderLayout,边界布局管理器。它把 Cont
- 本文主要介绍了面向对象的三大特征实例解析,下面看看具体内容。封装封装一个Teacher和Student类package com.hz.tes
- 本文主要讨论C#开发使用百度语音合成API在线将文本内容合成语音,保存为 MP3 文件,本文最后会提供本安全源代码以及运行软件包,
- Parallel类(https://www.jb51.net/article/244267.htm)的并行任务需要结束后才能运行后面的代码,
- 一、多媒体应用架构1.1 音视频传统应用架构通常,传统的播放音频或视频的多媒体应用由两部分组成:播放器:用于吸收数字媒体并将其呈现为视频和/
- RibbonRibbon 是 Netflix开源的基于HTTP和TCP等协议负载均衡组件Ribbon 可以用来做客户端负载均衡,调用注册中心
- itextpdf解决PDF合并的问题本文章是我在项目开发过程中解决了一个关于PDF显示的需求而记录的。需求是这样的,需要将两个PDF进行合并
- Mybatis的Dao层实现传统开发方式1、编写UserDao接口public interface UserMapper {public L
- 一、背景知识:树(Tree)在之前的笔记中,我们介绍的链表、栈、队列、数组和字符串都是以线性结构来组织数据的。本篇笔记要介绍的树采用的是树状
- 本文实例为大家分享了Android实现拍照或者选取本地图片的具体代码,供大家参考,具体内容如下总体流程从selectPhotoActivit
- @Value注解设置默认值在Spring Boot中,如果使用@Value注解对属性进行赋值,但如果在配置文件或启动参数中未指定对应的参数值
- 前言在 App 开发过程中,ListView 是 比较很常见的控件,用来处理 列表类的数据展示。当然 Flutter 也是支持的,由于 Fl
- 针对将特定端口加入到windows系统的防火墙中,使其允许或禁止通过防火墙。其大概思路是:/// <summary> /// 添
- 一、@ConditionalOnClass() Spring中存在指定class对象时,注入指定配置和ConditionalOnBean()
- 这篇文章主要介绍了Springboot整合Shiro的代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- springboots使用的版本是2.0.1,注意不同版本可能有差异,并不一定通用添加Mybatis的起步依赖:<!--mybatis
- 引言在 java8 中,您可以使用 Arrays.Stream 或 Stream.of 将 Array 转换为 Stream。1. 对象数组