SpringBoot 项目使用 EasyExcel 插件构建 Excel 表格格式(行高、列宽和字体等)工具类

server/2024/12/15 12:23:50/

本文主要讲了如何使用 EasyExcel 插件,在导出 Excel 时,设置行高,列宽,表头格式,内容字体大小等工具类。

1、代码使用的依赖

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.2.1</version>
</dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version>
</dependency>

2、行高列宽设置工具类

import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.metadata.data.CellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import com.alibaba.excel.write.style.column.AbstractColumnWidthStyleStrategy;
import org.apache.poi.ss.usermodel.*;
import org.springframework.util.CollectionUtils;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** 表头宽度根据数据内容自适应*/
public class CustomWidthStyleStrategy extends AbstractColumnWidthStyleStrategy {private Map<Integer, Map<Integer, Integer>> CACHE = new HashMap<>();/*** 设置列宽*/@Overrideprotected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {boolean needSetWidth = isHead || !CollectionUtils.isEmpty(cellDataList);if (needSetWidth) {Map<Integer, Integer> maxColumnWidthMap = CACHE.computeIfAbsent(writeSheetHolder.getSheetNo(), k -> new HashMap<>());int columnWidth = this.dataLength(cellDataList, cell, isHead);if (columnWidth >= 0) {if (columnWidth > 255) {columnWidth = 255;}Integer maxColumnWidth = maxColumnWidthMap.get(cell.getColumnIndex());if (maxColumnWidth == null || columnWidth > maxColumnWidth) {maxColumnWidthMap.put(cell.getColumnIndex(), columnWidth);writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(), columnWidth * 256);}}}}/*** 数据长度*/private Integer dataLength(List<WriteCellData<?>> cellDataList, Cell cell, Boolean isHead) {// 头直接返回原始长度if (isHead) {return cell.getStringCellValue().getBytes().length;} else {// 不是头的话 看是什么类型 用数字加就可以了WriteCellData cellData = cellDataList.get(0);CellDataTypeEnum type = cellData.getType();if (type == null) {return -1;} else {switch (type) {case STRING:return cellData.getStringValue().getBytes().length + 3;case BOOLEAN:return cellData.getBooleanValue().toString().getBytes().length + 1;case NUMBER:return cellData.getNumberValue().toString().getBytes().length + 3;default:return -1;}}}}/*** 单元格样式策略*/public static HorizontalCellStyleStrategy getHorizontalCellStyleStrategy() {// 内容的策略WriteCellStyle contentWriteCellStyle = new WriteCellStyle();// 设置边框contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);contentWriteCellStyle.setBorderRight(BorderStyle.THIN);contentWriteCellStyle.setBorderTop(BorderStyle.NONE);// 配置字体WriteFont contentWriteFont = new WriteFont();// 字体contentWriteFont.setFontName("宋体");// 字体大小contentWriteFont.setFontHeightInPoints(fontHeightInPoints);// 设置加粗contentWriteFont.setBold(false);contentWriteCellStyle.setWriteFont(contentWriteFont);// 【水平居中需要使用以下两行】// 设置文字左右居中contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.JUSTIFY);// 设置文字上下居中contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 设置 自动换行contentWriteCellStyle.setWrapped(true);// contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);// contentWriteCellStyle.setFillForegroundColor(IndexedColors.PINK.getIndex());// 样式策略return new HorizontalCellStyleStrategy(null, contentWriteCellStyle);}
}

3、代码如何使用工具类

public void exportInfo(Request request, HttpServletResponse response) {try {response.setContentType("multipart/form-data");response.setCharacterEncoding("utf-8");List<UserDto> items = new ArrayList<>();for(int i = 0; i < 10; i++) {UserDto user = new UserDto();user.setName("长江" + i + "号");user.setType(i);items.add(user);}String fileName = "用户信息";response.setHeader("Content-Disposition", "attachment;filename*=utf-8'zh_cn'" + URLEncoder.encode(fileName, "UTF-8") + ExportFileType.EXCEL_XLSX.getDefaultExtName());EasyExcel.write(response.getOutputStream(), OnlineInfoResultExcelDto.class).autoCloseStream(true).charset(/*fileType.equals(ExportFileType.EXCEL_XLSX.ordinal()) ? StandardCharsets.UTF_8 : */Charset.forName("GBK")).sheet("Sheet0").registerWriteHandler(getHorizontalCellStyleStrategy()).registerWriteHandler(new CustomWidthStyleStrategy()).doWrite(data);} catch (IOException e) {throw new OnlineMonitorException(500, "export error");}
}

4、导出类

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;@Data
public class User {@ExeclProperty("姓名")private String name;@ExeclProperty("类型")private Integet type;}

http://www.ppmy.cn/server/150345.html

相关文章

go build command

文章目录 1.简介2.格式3.选项4.示例5.小结参考文献 1.简介 go build 是 Go 语言工具链中的一个命令&#xff0c;它用于编译 Go 源代码并生成可执行文件。 2.格式 go build [-o output] [build flags] [packages]可选的 -o 选项强制 build 将生成的可执行文件或对象写入指定的…

游戏引擎学习第45天

仓库: https://gitee.com/mrxiao_com/2d_game 回顾 我们刚刚开始研究运动方程&#xff0c;展示了如何处理当人物遇到障碍物时的情况。有一种版本是角色会从障碍物上反弹&#xff0c;而另一版本是角色会完全停下来。这种方式感觉不太自然&#xff0c;因为在游戏中&#xff0c;…

机器视觉认识OpenCV

一、什么是OpenCV OpenCV 1、绪论 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库。它包含了众多关于图像处理和计算机视觉的通用算法&#xff0c;这些算法可以用于解决各种实际问题&#xff0c;比如人脸识别、物…

【XR】静态初始化与动态初始化(MACKF与VINS的初始化特点)

静态初始化&#xff08;Static Initialization&#xff09;和动态初始化&#xff08;Dynamic Initialization&#xff09;在多视图几何SLAM系统中各有优缺点&#xff0c;具体到MSCKF与VINS-Mono的实现对比如下&#xff1a; 静态初始化&#xff08;MSCKF的实现&#xff09; 特点…

19. 【.NET 8 实战--孢子记账--从单体到微服务】--记账模块--收支记录

在本篇文章中&#xff0c;我们将一起编写孢子记账的收支记录功能&#xff08;CURD&#xff09;&#xff0c;同样我们只列出一个具体功能的实现&#xff0c;剩下的功能由读者实现。 一、 需求 需求如下&#xff1a; 编号需求说明1新增记录1.记录内容包括转换前金额、转换后金…

redis 怎么样删除list

在 Redis 中&#xff0c;可以使用以下方法删除列表或列表中的元素&#xff1a; 1. 删除整个列表 使用 DEL 命令删除一个列表键&#xff1a; DEL mylist这个命令会删除键 mylist 及其值&#xff08;无论 mylist 是一个列表还是其他类型的键&#xff09;。 2. 删除列表中的部分…

【人工智能-中级】卷积神经网络(CNN)的中阶应用:从图像分类到目标检测

文章目录 卷积神经网络(CNN)的中阶应用:从图像分类到目标检测1. 图像分类:CNN的基础应用CNN结构概述经典网络架构2. 目标检测:从分类到定位基于区域的目标检测方法单阶段目标检测方法边界框回归与NMS(Non-Maximum Suppression)3. 深度学习中的目标检测挑战与解决方案4. …

基于 webRTC Vue 的局域网 文件传输工具

文件传输工具&#xff0c;匿名加密&#xff0c;只需访问网页&#xff0c;即可连接到其他设备&#xff0c;基于 webRTC 和 Vue.js coturn TURN 服务器 docker pull coturn/coturn docker run -d --networkhost \-v $(pwd)/my.conf:/etc/coturn/turnserver.conf \coturn/coturn…