apache poi 导出复杂的excel表格

如何导出复杂的excel 表格

如图表格,存在行和列的合并,边框,样式,颜色等。
在这里插入图片描述

依赖

 <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency>

实现的示例demo

 @GetMapping("/exportExcel")public void exportExcel(HttpServletRequest request, HttpServletResponse response) {try {HSSFWorkbook workbook = new HSSFWorkbook();//创建一个excel对象HSSFSheet sheet = workbook.createSheet();//创建一个工作薄对象HSSFRow row = sheet.createRow(0);HSSFCell createCell = row.createCell(0);
//            sheet.addMergedRegion(CellRangeAddress.valueOf("$A$1:$E$1"));//单元格合并HSSFCellStyle cellStyle = workbook.createCellStyle();cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());//25%灰色cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);//颜色cellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());cellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());cellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());cellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());// 设置边框样式为细线cellStyle.setBorderRight(BorderStyle.THIN);cellStyle.setBorderLeft(BorderStyle.THIN);cellStyle.setBorderTop(BorderStyle.THIN);cellStyle.setBorderBottom(BorderStyle.THIN);//字体水平和垂直居中cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中cellStyle.setAlignment(HorizontalAlignment.CENTER);//水平居中HSSFFont font = workbook.createFont();//字体,大小,粗细font.setFontName("宋体");font.setFontHeight((short) 20);font.setBold(true);//加粗cellStyle.setFont(font);createCell.setCellStyle(cellStyle);createCell.setCellValue("活动统计报表");
//            CellRangeAddress mergedRegion = new CellRangeAddress(0, 0, 0, 4);CellRangeAddress mergedRegion = CellRangeAddress.valueOf("$A$1:$E$1");sheet.addMergedRegion(mergedRegion);//单元格合并RegionUtil.setBorderTop(BorderStyle.THIN, mergedRegion, sheet);// 合并 A1:E1 设置边框粗细RegionUtil.setBorderTop(BorderStyle.THIN, mergedRegion, sheet);RegionUtil.setBorderBottom(BorderStyle.THIN, mergedRegion, sheet);RegionUtil.setBorderLeft(BorderStyle.THIN, mergedRegion, sheet);RegionUtil.setBorderRight(BorderStyle.THIN, mergedRegion, sheet);row = sheet.createRow(1);createCell = row.createCell(0);font.setFontHeightInPoints((short) 12);font.setBold(true);cellStyle.setFont(font);createCell.setCellValue("2024-01-01~2024-01-31");createCell.setCellStyle(cellStyle);sheet.autoSizeColumn(0);sheet.autoSizeColumn(1);List<String> headerList = Arrays.asList("项目", "", "活动类型", "参数人数", "经费");List<List<String>> listData = new ArrayList<>();listData.add(Arrays.asList("球类赛事", "", "篮球", "16", "158"));listData.add(Arrays.asList("", "", "羽毛球", "8", "231"));listData.add(Arrays.asList("", "", "网球", "23", "143"));font.setBold(true);cellStyle.setFont(font);for (int j = 0; j < listData.size(); j++) {row = sheet.createRow(j + 3);List<String> strings = listData.get(j);for (int k = 0; k < headerList.size(); k++) {createCell = row.createCell(k, CellType.STRING);createCell.setCellStyle(cellStyle);String text = strings.get(k);text = null == text ? "" : text;createCell.setCellValue(text);sheet.autoSizeColumn(k);}}sheet.addMergedRegion(CellRangeAddress.valueOf("$A$2:$E$2"));sheet.addMergedRegion(CellRangeAddress.valueOf("$A$3:$E$3"));sheet.addMergedRegion(CellRangeAddress.valueOf("$A$4:$B$6"));ExcelUtil.setFileDownloadHeader(request, response, "测试" + System.currentTimeMillis() + ".xls");OutputStream outputStream = response.getOutputStream();workbook.write(outputStream);workbook.close();logger.info("导出成功");} catch (Exception e) {logger.error("导出失败", e);}}
import org.apache.commons.lang.StringUtils;
import org.apache.poi.ss.util.CellReference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;public class ExcelUtil {private static final Logger logger = LoggerFactory.getLogger(ExcelUtil.class);public static void setFileDownloadHeader(HttpServletRequest request, HttpServletResponse response, String fileName) {String userAgent = request.getHeader("USER-AGENT");try {String finalFileName = null;if (StringUtils.contains(userAgent, "MSIE") || StringUtils.contains(userAgent, "Trident")) {finalFileName = URLEncoder.encode(fileName, "UTF8");} else if (StringUtils.contains(userAgent, "Mozilla")) {finalFileName = new String(fileName.getBytes(), "ISO8859-1");} else {finalFileName = URLEncoder.encode(fileName, "UTF8");}response.setHeader("Cache-Control", "private");response.setHeader("Pragma", "private");response.setContentType("application/vnd.ms-excel;charset=utf-8");response.setHeader("Content-Type", "application/force-download");response.setHeader("Content-Disposition", "attachment;filename=\"" + finalFileName + "\"");} catch (UnsupportedEncodingException e) {logger.error("导出设置错误", e);}}public static String columnIndexToColumnName(int columnIndex) {String string = CellReference.convertNumToColString(16384);return string;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/922148.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/922148.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

下载 Eclipse Temurin 的 OpenJDK 提示 “无法访问此网站 github.com 的响应时间过长”

打开 Eclipse Temurin 的 OpenJDK 的官网下载地址&#xff1a; https://adoptium.net/zh-CN/temurin/releases 问 deepseek&#xff1a; 国内网络&#xff0c;打不开github.com网页&#xff0c;提示github.com 的响应时间过长。 国内无法访问 GitHub 或访问缓慢&#xff0c;通…

C/C++类型转换

C/C类型转换 1. C类型转换 C 语言中的类型转换主要分为两种&#xff1a;隐式类型转换 (Implicit Conversion) - 由编译器自动完成。显式类型转换 (Explicit Conversion) - 由程序员强制指定&#xff0c;也称为强制类型转换。1.2 隐式类型转换 编译器在编译时自动进行的转换&…

【Java】Windows切换Java8和Java11

现在有些项目要升级到Java17, 所以需要切换不同的java版本。 如何安装Java8 由于已经安装了jJava8, 之前的安装文章&#xff1a;【Java】jdk8安装——英文版 如何安装Java17 Java17下载地址 https://www.oracle.com/java/technologies/downloads/#java17-windows 下载到电…

SQLite 数据库核心知识与 C 语言编程

一、数据库基础概念1.1 数据库分类根据规模和应用场景&#xff0c;数据库可分为以下几类&#xff1a;大型数据库&#xff1a;Oracle&#xff08;适用于企业级高并发、大容量场景&#xff09;中型数据库&#xff1a;MySQL、MSSQL&#xff08;适用于中小型系统、Web 应用&#xf…

Netty 调优篇:实战配置、性能监控与常见坑

&#x1f680; Netty 调优篇&#xff1a;实战配置、性能监控与常见坑前面我们已经深入了 Netty 的 线程模型、Pipeline、EventLoop、内存池、零拷贝和背压机制。 但在实际工作中&#xff0c;很多人踩坑的地方不是“源码没看懂”&#xff0c;而是 调优没做好。 今天我们就从三个…

Linux Node.js 安装及环境配置详细教程

如果您喜欢此文章&#xff0c;请收藏、点赞、评论&#xff0c;谢谢&#xff0c;祝您快乐每一天。 一、Node.js是什么 Node.js是一个基于Chrome V8引擎的[JavaScript运行环境]。 Node.js使用了一个事件驱动、非阻塞式I/O 的模型。 Node.js是一个让JavaScript运行在服务端的开…

呼叫中心系统IVR流程设计的心理学

呼叫中心的 IVR&#xff08;交互式语音应答&#xff09;系统看似是 “机器与用户的对话”&#xff0c;实则暗藏对用户心理的精准把握。其设计需围绕降低焦虑、提升效率、强化信任三大核心目标&#xff0c;背后依托认知心理学、行为心理学、情感心理学等理论支撑。一、认知负荷理…

一些开源或免费的网络管理工具

整理开源及免费网络管理工具推荐,涵盖监控、配置、安全、流量分析等场景,适用于不同规模的网络环境: ​一、网络监控与性能分析​ 1. ​Zabbix​ ​特点​:企业级监控方案,支持SNMP、IPMI、JMX等多种协议,提供实时仪表盘、告警通知和自动化发现功能。 ​适用场景​:服…

谷粒商城项目-P16快速开发-人人开源搭建后台管理系统

1.对脚手架工程进行改造 此项目选用的脚手架工程是人人开源 地址&#xff1a;人人开源 选择的是下图标红的renren-fast作为后端&#xff0c;renren-fast-vue作为前端 克隆上述两个项目 2.后端改造 2.1将renrenfast项目的git文件夹删除后&#xff0c;拖进后端代码文件夹中 2…

V少JS基础班之第八弹:this

文章目录一、 前言二、本节涉及知识点三、重点内容1、从新的角度认识this2、this是函数的参数3、this的值4、函数的调用1- 裸函数调用2- 函数作为构造函数调用3- 函数作为对象的方法调用4- 函数显示调用5- 箭头函数一、 前言 第八弹内容是this。this相对来说难度不大&#xff…

《堆的详解:结构、操作及堆排序算法》

目录 一.堆的概念与结构 1.1 堆的概念 1.2 堆性质&#xff1a; 1.3 堆的结构定义 二.堆的初始化和销毁 2.1 堆的初始化&#xff1a; 2.2 堆的销毁&#xff1a; 三.堆的插入数据(含向上调整算法的实现) 3.1 插入逻辑 3.2 插入函数 3.3 向上调整算法 三. 堆的删除数…

深入解析 Kubernetes 中的 Service 资源:为应用提供稳定的网络访问

什么是 Kubernetes 中的 Service&#xff1f; 在现代微服务架构中&#xff0c;服务之间的通信和负载均衡是至关重要的。尤其是在 Kubernetes 环境中&#xff0c;由于 Pod 是动态创建和销毁的&#xff0c;如何为一组 Pod 提供稳定的访问入口&#xff0c;成为了架构设计中的一个关…

使用Samba网络磁盘作为MacOS时间机器的远程备份磁盘

最近考虑MacOS系统升级&#xff0c;所以需要做磁盘备份&#xff0c;MacOS里有个备份磁盘很方便的工具&#xff1a;时间机器&#xff0c;可以自动定期备份磁盘&#xff0c;但是一般需要一个大点的移动硬盘插在macbook上选择其为备份磁盘&#xff0c;可惜我并没有移动硬盘&#x…

智能头盔实时监控系统设计与实现

智能头盔实时监控系统设计与实现 源码 https://gitee.com/intostars/csdn-demo/tree/master/src/views/smartHelmet 预览 一、功能概述 智能头盔实时监控系统是基于Vue 3和TypeScript开发的一套用于远程监控和控制智能头盔设备的前端应用模块。该系统通过WebSocket与后端服务…

Docker 学习笔记(八):容器运行时工具实践及 OpenStack 部署基础

容器管理工具Containerd nerdctl 实践 nerdctl管理存储 nerdctl命令创建容器的时候&#xff0c;可以使用-v选项将本地目录挂载给容器实现数据持久化 示例&#xff1a; [rootlocalhost ~]# mkdir /data [rootlocalhost ~]# nerdctl run -d -v /data:/data busybox -- sleep infi…

Unity键盘控制角色运动

以下是一个完整的Unity角色移动和跳跃脚本,支持WASD或方向键移动: 使用说明 确保组件设置正确: 确保您的游戏对象有一个CharacterController组件 如果没有,可以通过菜单 "Component -> Physics -> Character Controller" 添加 相机设置: 确保场景中有一…

linux 宏 DEVICE_ATTR

理解 DEVICE_ATTR DEVICE_ATTR 是 Linux 内核中用于创建设备属性的宏&#xff0c;通常用于 sysfs 文件系统。通过 sysfs&#xff0c;用户空间的程序可以读取或修改内核中的设备属性。DEVICE_ATTR 宏定义在 <linux/device.h> 头文件中&#xff0c;用于声明和定义一个设备属…

MCP模型上下文协议以及交互流程

1. MCP 是什么全称&#xff1a;Model Context Protocol定位&#xff1a;让大语言模型&#xff08;LLM&#xff09;能在“上下文”之外&#xff0c;按统一格式访问外部数据、调用插件、持久化状态。动机&#xff1a;以前每家框架&#xff08;LangChain、LlamaIndex 等&#xff0…

MySQLTransactionRollbackException

问题描述mysql部署1主3从&#xff0c;昨天发现主库有大量报警错误&#xff1a;Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction ; Deadlock found when trying to get lock; …

Redis环境搭建指南:Windows/Linux/Docker多场景安装与配置

Redis环境搭建指南&#xff1a;Windows/Linux/Docker多场景安装与配置 1. Redis安装方式概览 1.1 安装方式对比 安装方式适用场景优点缺点难度Windows直接安装开发调试安装简单&#xff0c;Windows兼容好性能不如Linux&#xff0c;生产不推荐⭐Linux源码编译生产环境性能最佳…