apache-poi导出excel数据
excel导出
自动设置宽度,设置标题框,设置数据边框。
excel导出
- 添加依赖
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.2</version></dependency>
- 编写工具类
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.*;/*** Excel导出**/
@Slf4j
public class MyExcelExportUtils {/*** 列的最大宽度*/private static final int COLUMN_MAX_WIDTH = 10240;/*** 列的最小宽度*/private static final int COLUMN_MIN_WIDTH = (int) (2048);/*** 导出Excel** @param excelExports excel集合* @param fileName 文件名* @param response 响应对象* @throws IOException*/public static void exportExcel(List<ExcelExport> excelExports, String fileName, HttpServletResponse response)throws IOException {
// ServletOutputStream servletOutputStream = null;try {
// servletOutputStream = response.getOutputStream();response.setContentType("multipart/form-data");response.setCharacterEncoding("utf-8");if (null == fileName || fileName.trim().equals("")) { //如果不设置文件名,则默认fileName = new String((fileName + new SimpleDateFormat("yyyy-MM-dd").format(new Date())).getBytes(), StandardCharsets.UTF_8);}response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xlsx");Workbook workbook = new XSSFWorkbook();// 创建一个单元格样式CellStyle titleCellStyle = workbook.createCellStyle();titleCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());//25%灰色titleCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);titleCellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());titleCellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());titleCellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());titleCellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());// 设置边框样式为细线titleCellStyle.setBorderBottom(BorderStyle.THIN);titleCellStyle.setBorderTop(BorderStyle.THIN);titleCellStyle.setBorderLeft(BorderStyle.THIN);titleCellStyle.setBorderRight(BorderStyle.THIN);titleCellStyle.setAlignment(HorizontalAlignment.CENTER);titleCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 创建一个单元格样式CellStyle dataCellStyle = workbook.createCellStyle();dataCellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());dataCellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());// 设置边框样式为细线dataCellStyle.setBorderLeft(BorderStyle.THIN);dataCellStyle.setBorderRight(BorderStyle.THIN);// 创建一个单元格样式CellStyle lastCellStyle = workbook.createCellStyle();lastCellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());lastCellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());lastCellStyle.setBorderBottom(BorderStyle.THIN);// 设置边框样式为细线lastCellStyle.setBorderLeft(BorderStyle.THIN);lastCellStyle.setBorderRight(BorderStyle.THIN);lastCellStyle.setBorderBottom(BorderStyle.THIN);for (int i = 0; i < excelExports.size(); i++) {ExcelExport excelExport = excelExports.get(i);List<String> headList = excelExport.getTitle();String sheetName = excelExport.getSheetName();List<LinkedHashMap<String, Object>> dataList = excelExport.getDataList();Sheet sheet = workbook.createSheet(sheetName);// 创建数据行Row titleRow = sheet.createRow(0);titleRow.setHeightInPoints(500 / 20);for (int j = 0; j < headList.size(); j++) {Cell cell1 = titleRow.createCell(j);cell1.setCellStyle(titleCellStyle);cell1.setCellValue(headList.get(j));}Map<String, Integer> columnWidthMap = new HashMap<>();for (int k = 0; k < dataList.size(); k++) {Row dataRow = sheet.createRow(k + 1);for (int j = 0; j < headList.size(); j++) {String title = headList.get(j);LinkedHashMap<String, Object> stringObjectLinkedHashMap = dataList.get(k);Object value = stringObjectLinkedHashMap.get(title);Cell cell = dataRow.createCell(j);if (k == (dataList.size() - 1)) {cell.setCellStyle(lastCellStyle);} else {cell.setCellStyle(dataCellStyle);}cell.setCellValue(value == null ? null : value.toString());if (null != value) {// 计算内容的字符长度int charLength = value.toString().length();// 设置一个最大宽度(以字符为单位)int maxWidthInChars = 0;// 根据内容长度和最大宽度计算列宽// 注意:Excel的列宽单位是字符宽度的1/256,因此需要将字符数乘以256// 但由于内容可能包含非单字节字符(如中文),这里简化处理,只考虑ASCII字符宽度// 如果需要更精确的处理,可以考虑使用FontMetrics来计算实际渲染宽度int columnWidth = (int) (Math.max(charLength, maxWidthInChars) * 256);if (columnWidthMap.containsKey(title)) {Integer width = columnWidthMap.get(title);if (width < columnWidth) {columnWidthMap.put(title, columnWidth);}} else {columnWidthMap.put(title, columnWidth);}}}}for (int j = 0; j < headList.size(); j++) {String title = headList.get(j);int width = columnWidthMap.getOrDefault(title,COLUMN_MIN_WIDTH);if (width > COLUMN_MAX_WIDTH) { //防止太长width = COLUMN_MAX_WIDTH;} else if (width < COLUMN_MIN_WIDTH) {width = COLUMN_MIN_WIDTH;}sheet.setColumnWidth(j, width);log.info("列:" + j + ",标题:" + title + ",宽度:" + width);
// sheet.autoSizeColumn(j);//自动行宽}}workbook.write(response.getOutputStream());workbook.close();
// servletOutputStream.flush();} catch (IOException e) {throw new IOException(e.toString());} finally {}}public static void exportExcel2(List<String> headList, List<Object[]> dataList, String sheetName, String fileName, HttpServletResponse response)throws IOException {try {response.setContentType("multipart/form-data");response.setCharacterEncoding("utf-8");if (null == fileName || fileName.trim().equals("")) { //如果不设置文件名,则默认fileName = new String((fileName + new SimpleDateFormat("yyyy-MM-dd").format(new Date())).getBytes(), StandardCharsets.UTF_8);}response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xlsx");Workbook workbook = new XSSFWorkbook();// 创建一个单元格样式CellStyle titleCellStyle = workbook.createCellStyle();titleCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());//25%灰色titleCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);titleCellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());titleCellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());titleCellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());titleCellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());// 设置边框样式为细线titleCellStyle.setBorderBottom(BorderStyle.THIN);titleCellStyle.setBorderTop(BorderStyle.THIN);titleCellStyle.setBorderLeft(BorderStyle.THIN);titleCellStyle.setBorderRight(BorderStyle.THIN);titleCellStyle.setAlignment(HorizontalAlignment.CENTER);titleCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 创建一个单元格样式CellStyle dataCellStyle = workbook.createCellStyle();dataCellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());dataCellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());// 设置边框样式为细线dataCellStyle.setBorderLeft(BorderStyle.THIN);dataCellStyle.setBorderRight(BorderStyle.THIN);// 创建一个单元格样式CellStyle lastCellStyle = workbook.createCellStyle();lastCellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());lastCellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());lastCellStyle.setBorderBottom(BorderStyle.THIN);// 设置边框样式为细线lastCellStyle.setBorderLeft(BorderStyle.THIN);lastCellStyle.setBorderRight(BorderStyle.THIN);lastCellStyle.setBorderBottom(BorderStyle.THIN);Sheet sheet = workbook.createSheet(sheetName);// 创建数据行Row titleRow = sheet.createRow(0);titleRow.setHeightInPoints(500 / 20);
// titleRow.setHeight((short)500);for (int j = 0; j < headList.size(); j++) {Cell cell1 = titleRow.createCell(j);cell1.setCellStyle(titleCellStyle);cell1.setCellValue(headList.get(j));}Map<String, Integer> columnWidthMap = new HashMap<>();for (int k = 0; k < dataList.size(); k++) {Row dataRow = sheet.createRow(k + 1);for (int j = 0; j < headList.size(); j++) {String title = headList.get(j);
// LinkedHashMap<String, Object> stringObjectLinkedHashMap = dataList.get(k);
// Object value = stringObjectLinkedHashMap.get(title);Object value = dataList.get(k)[j];Cell cell = dataRow.createCell(j);if (k == (dataList.size() - 1)) {cell.setCellStyle(lastCellStyle);} else {cell.setCellStyle(dataCellStyle);}cell.setCellValue(value == null ? null : value.toString());if (null != value) {// 计算内容的字符长度int charLength = value.toString().length();// 设置一个最大宽度(以字符为单位)int maxWidthInChars = 0;// 根据内容长度和最大宽度计算列宽// 注意:Excel的列宽单位是字符宽度的1/256,因此需要将字符数乘以256// 但由于内容可能包含非单字节字符(如中文),这里简化处理,只考虑ASCII字符宽度// 如果需要更精确的处理,可以考虑使用FontMetrics来计算实际渲染宽度int columnWidth = (int) (Math.max(charLength, maxWidthInChars) * 256);if (columnWidthMap.containsKey(title)) {Integer width = columnWidthMap.get(title);if (width < columnWidth) {columnWidthMap.put(title, columnWidth);}} else {columnWidthMap.put(title, columnWidth);}}}}for (int j = 0; j < headList.size(); j++) {String title = headList.get(j);int width = columnWidthMap.getOrDefault(title,COLUMN_MIN_WIDTH);if (width > COLUMN_MAX_WIDTH) { //防止太长width = COLUMN_MAX_WIDTH;} else if (width < COLUMN_MIN_WIDTH) {width = COLUMN_MIN_WIDTH;}sheet.setColumnWidth(j, width);
// log.info("列:" + j + ",宽度:" + width);log.info("列:" + j + ",标题:" + title + ",宽度:" + width);
// sheet.autoSizeColumn(j);//自动行宽}workbook.write(response.getOutputStream());workbook.close();
// servletOutputStream.flush();} catch (IOException e) {throw new IOException(e.toString());} finally {
// if (servletOutputStream != null) {
// servletOutputStream.close();
// }}}/*** 导出Excel** @param dataList 数据集合* @param sheetName Excel工作表名称* @param fileName 文件名* @param response 响应对象* @throws IOException*/public static void exportExcel3(List<ColumnData> dataList, String sheetName, String fileName, HttpServletResponse response)throws IOException {List<String> headList = new ArrayList<>();int maxColumn = 0;for (ColumnData columnData : dataList) {headList.add(columnData.getTitle());maxColumn = Math.max(maxColumn, columnData.getValues().size());}int titleLength = headList.size();List<Object[]> dataList2 = new ArrayList<>();for (int i = 0; i < maxColumn; i++) {Object[] objects = new Object[titleLength];for (int j = 0; j < titleLength; j++) {ColumnData columnData = dataList.get(j);Object obj = getDataFromColumnData(columnData, i);objects[j] = obj;}dataList2.add(objects);}exportExcel2(headList, dataList2, sheetName, fileName, response);}private static Object getDataFromColumnData(ColumnData columnData, int index) {List values = columnData.getValues();if (index < values.size()) {return values.get(index);}return null;}
}
public class ColumnData {/*** 标题*/private String title;/*** 竖直的数据*/private List values;public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public List getValues() {return values;}public void setValues(List values) {this.values = values;}
}
@Setter
@Getter
public class ExcelExport {/*** 页面名称*/private String sheetName;/*** 标题*/private List<String> title;/*** 数据内容*/List<LinkedHashMap<String, Object>> dataList;
}
- 导出示例
@GetMapping("/exportExcel2")public void exportExcel2(HttpServletRequest request, HttpServletResponse response) throws IOException {ExcelExport excelExport = new ExcelExport();excelExport.setSheetName("测试");excelExport.setTitle(Arrays.asList("用户名", "地址"));List<LinkedHashMap<String, Object>> dataList = new ArrayList();{LinkedHashMap<String, Object> map = new LinkedHashMap();map.put("用户名","test1");map.put("地址","长安");dataList.add(map);}{LinkedHashMap<String, Object> map = new LinkedHashMap();map.put("用户名","test2");map.put("地址","静海");dataList.add(map);}excelExport.setDataList(dataList);MyExcelExportUtils.exportExcel(Arrays.asList(excelExport), "test", response);}
运行结果
相关文章:

apache-poi导出excel数据
excel导出 自动设置宽度,设置标题框,设置数据边框。 excel导出 添加依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.2</version></dependency>…...

唯一值校验的实现思路(续)
本文接着上一篇文章《唯一值校验的实现思路》,在后端实现唯一值校验。用代码实现。 /*** checkUniqueException[唯一值校验]** param entity 新增或编辑的学生实体* param insert 是否新增,如果是传入true;反之传入false* return void* date…...

ffmpeg基本用法
一、用法 ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}... 说明: global options:全局选项,应用于整个 FFmpeg 进程,它们通常不受输入或输出部分的限制。 infile options:输入选…...

MYSQL第四次
目录 题目分析 代码实现 一、修改 Student 表中年龄(sage)字段属性,数据类型由 int 改变为 smallint 二、为 Course 表中 Cno 字段设置索引,并查看索引 三、为 SC 表建立按学号(sno)和课程号ÿ…...

联德胜w801开发板(六)手机蓝牙设置wifi名称和密码
一、概述 W801 是一款集成了 Wi-Fi 和蓝牙功能的芯片,本文将介绍如何利用 W801 的蓝牙功能,实现手机 APP 通过蓝牙配置 W801 连接的 Wi-Fi 名称和密码(即配网功能)。 二、文档查看: demo使用手册这里很清楚…...

Linux:库
目录 静态库 动态库 目标文件 ELF文件 ELF形成可执行 ELF可执行加载 ELF加载 全局偏移量表GOT(global offset table) 库是写好的,成熟的,可以复用的代码 现实中每个程序都要依赖很多的基础的底层库,不可能都是从零开始的 库有两种…...

向量数据库简单对比
文章目录 一、Chroma二、Pinecone/腾讯云VectorDB/VikingDB三、redis四、Elasticsearch五、Milvus六、Qdrant七、Weaviate八、Faiss 一、Chroma 官方地址: https://www.trychroma.com/优点 ①简单,非常简单构建服务。 ②此外,Chroma还具有自…...

大模型基本原理(四)——如何武装ChatGPT
传统的LLM存在几个短板:编造事实、计算不准确、数据过时等,为了应对这几个问题,可以借助一些外部工具或数据把AI武装起来。 实现这一思路的框架包括RAG、PAL、ReAct。 1、RAG(检索增强生成) LLM生成的内容会受到训练…...

从零开始:使用Jenkins实现高效自动化部署
在这篇文章中我们将深入探讨如何通过Jenkins构建高效的自动化部署流水线,帮助团队实现从代码提交到生产环境部署的全流程自动化。无论你是Jenkins新手还是有一定经验的开发者,这篇文章都会为你提供实用的技巧和最佳实践,助你在项目部署中走得…...

Spring Cloud工程完善
目录 完善订单服务 启动类 配置文件 实体类 Controller Service Mapper 测试运行 完成商品服务 启动类 配置文件 实体类 Controller Service Mapper 测试运行 远程调用 需求 实现 1.定义RestTemplate 2.修改order-service中的OrderService 测试运行 Rest…...

SSM仓库物品管理系统 附带详细运行指导视频
文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码1.用户登录代码:2.保存物品信息代码:3.删除仓库信息代码: 一、项目演示 项目演示地址: 视频地址 二、项目介绍 项目描述:这是一个基于SSM框架开发的仓库…...

UI自动化测试中如何处理验证码?
在UI自动化测试中处理验证码是常见的技术挑战,以下是分步解决方案及实际应用建议: 一、验证码处理策略对比 方法实现方式优点缺点适用场景禁用验证码测试环境配置关闭验证码生成简单快捷,零成本无法测试验证码功能本身非验证码相关功能测试万…...

华为交换机堆叠配置
一、CSS堆叠集群配置(框式交换机) 1、通过集群卡连接方式组建集群 [SwitchA] set css mode css-card \\配置集群卡连接方式 [SwitchA] set css id 1 \\配置成员交换机的集群ID(缺省值为1) [SwitchA] set css priority 100 \\配…...

Vue 和 dhtmlx-gantt 实现图表构建动态多级甘特图效果 ,横坐标为动态刻度不是日期
注意事项:1、横坐标根据日期转换成时间刻度在( gantt.config.scales);2、获取时间刻度的最大值(findMaxRepairTime);3、甘特图多级列表需注意二级三级每个父子id需要唯一(convertData) 安装依赖 npm install dhtmlx-gantt --save 在当前页引入和配置 dhtmlx-gantt im…...

collabora online+nextcloud+mariadb在线文档协助
1、环境 龙蜥os 8.9 docker 2、安装docker dnf -y install dnf-plugins-core dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sed -i shttps://download.docker.comhttps://mirrors.tuna.tsinghua.edu.cn/docker-ce /etc/yum.repos.…...

“可通过HTTP获取远端WWW服务信息”漏洞修复
环境说明:①操作系统:windows server;②nginx:1.27.1。 1.漏洞说明 “可通过HTTP获取远端WWW服务信息”。 修复前,在“响应标头”能看到Server信息,如下图所示: 修复后,“响应标头…...

【AI时代】-开发环境准备 之 Conda 创建 Python 环境 (含pip常用命令、jupyter 安装及汉化、自定义文档位置等配置)
一、 安装 Anaconda 1.1 下载并安装 https://www.anaconda.com/download/success 1.2 验证是否成功 CMD输入命令: conda --version注意:找不到命令需要配置环境变量: Path 中 添加 Anaconda 的安装路径: 如果没有修改安装位…...

[LeetCode] day19 454. 四数相加 II
题目链接 题目描述 给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 < i, j, k, l < n nums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1: 输入&…...

LeetCodehot 力扣热题100 验证二叉搜索树
class Solution {vector<int> nums; // 用来存储二叉树节点值的数组 public:bool isValidBST(TreeNode* root) {inorder(root); // 中序遍历二叉树,填充 nums 数组// 遍历 nums 数组,检查是否为严格递增序列for(int i0; i<nums.size()-1; i){…...

四次挥手详解
文章目录 一、四次挥手各状态FIN_WAIT_1CLOSE_WAITFIN_WAIT_2LAST_ACKTIME_WAITCLOSE 二、双方同时调用close(),FIN_WAIT_1状态后进入CLOSING状态CLOSING状态 三、TIME_WAIT状态详解(1) TIME_WAIT状态下的2MSL是什么MSL (报文最大生存时间)为…...

Deepseek-v3 / Dify api接入飞书机器人go程序
准备工作 开通了接收消息权限的飞书机器人,例如我希望用户跟飞书机器人私聊,就需要开通这个权限:读取用户发给机器人的单聊消息 im:message.p2p_msg:readonly准备好飞书机器人的API key 和Secretdeepseek-v3的api keysecret:http…...

2025.2.9 每日学习记录2:技术报告写了一半+一点点读后感
0.近期主任务线 1.完成小论文准备 目标是3月份完成实验点1的全部实验和论文。 2.准备教资笔试 打算留个十多天左右,一次性备考笔试的三个科目 1.实习申请技术准备:微调、Agent、RAG 1.今日完成任务 1.电子斗蛐蛐(文本书写领域&am…...

qml ToolBar详解
1、概述 在 QML 中,ToolBar 是一种常用的 UI 组件,通常位于窗口的顶部或底部,用于提供一系列的操作按钮、菜单或其他交互元素。它可以帮助用户快速访问应用程序的常用功能,提高用户操作的便捷性。ToolBar 可以包含多个 ToolButto…...

机器学习在癌症分子亚型分类中的应用
学习笔记:机器学习在癌症分子亚型分类中的应用——Cancer Cell 研究解析 1. 文章基本信息 标题:Classification of non-TCGA cancer samples to TCGA molecular subtypes using machine learning发表期刊:Cancer Cell发表时间:20…...

Ansible自动化部署K8s集群一 Ansible的基础使用实战
一、Ansible介绍 1.安装ansible: yum install ansible -y 2.ansible的架构图: 3.ansible四部分: inventory:ansible管理的主机信息,包括ip地址、ssh端口、账号和密码等 modules:任务均由模块完成 plugins:增加ansible的核心功能 pla…...

ZooKeeper Watcher 机制详解:从注册到回调的全过程
引言 在分布式系统中,数据的实时性和一致性是至关重要的。ZooKeeper 通过其 Watcher 机制提供了一种高效的方式来监听数据变化或事件,从而使客户端能够在数据发生变化时立即收到通知。本文将深入探讨 ZooKeeper 的 Watcher 机制,具体包括客户…...

flutter_tools/gradle Unsupported class file major version 65 问题解决
1.问题定位 使用 命令 flutter doctor --verbose 可以查看当前项目中,使用的java的版本。 [✓] Android Studio (version 2024.2)• Android Studio at /Applications/Android Studio.app/Contents• Flutter plugin can be installed from:🔨 https…...

C++设计模式 - 模板模式
一:概述 模板方法(Template Method)是一种行为型设计模式。它定义了一个算法的基本框架,并且可能是《设计模式:可复用面向对象软件的基础》一书中最常用的设计模式之一。 模板方法的核心思想很容易理解。我们需要定义一…...

mysql查缺补漏
好文推荐: 【数据库】快速理解脏读、不可重复读、幻读-CSDN博客 再探幻读!什么是幻读?为什么会产生幻读,MySQL中是怎么解决幻读的?-CSDN博客 引擎 mysql默认引擎:innodb 1.支持行锁 2.支持事务 3.支持外键 索引…...

跨越边界,大模型如何助推科技与社会的完美结合?
点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 概述 2024年,大模型技术已成为人工智能领域的焦点。这不仅仅是一项技术进步,更是一次可能深刻影响社会发展方方面面的变革。大模型的交叉能否推动技术与社会的真正融合?2025年…...