当前位置: 首页 > news >正文

easyexcel 3.0.x 版本实现指定列 锁定以及指定列隐藏

1:效果示例

2:代码示例:

UnLockCell.java
package com.example.juc.zhujie;/*** @Author * @Date Created in  2023/12/19 10:09* @DESCRIPTION:* @Version V1.0*/import java.lang.annotation.*;/*** 用于标记锁定哪些列不需要锁定* @author 12926*/
@Target(value = {ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface UnLockCell {}

 实例类:

package com.example.juc.studyExcel.entity;import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.example.juc.zhujie.UnLockCell;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** @Author x* @Date Created in  2023/12/6 8:31* @DESCRIPTION:* @Version V1.0*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {@ExcelProperty("用户id")@UnLockCellprivate String id;@ExcelProperty("姓名")private String name;@ExcelProperty("年龄")@ColumnWidth(5)private String age;
}

controller层:

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.WriteWorkbook;
import com.example.juc.studyExcel.entity.Student;
import com.example.juc.test.handler.CellHandler;
import com.example.juc.test.handler.LockSheetWriteHandler;
import com.example.juc.test.handler.StyleWriteHandler;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;/*** @Author * @Date Created in  2023/12/16 16:32* @DESCRIPTION:* @Version V1.0*/
@RestController
@RequestMapping("testSuoding")
public class 测试excel列锁定 {/*** 文件下载(失败了会返回一个有部分数据的Excel)* <p>* 1. 创建excel对应的实体对象 参照{@link }* <p>* 2. 设置返回的 参数* <p>* 3. 直接写,这里注意,finish的时候会自动关闭OutputStream,当然你外面再关闭流问题不大*/@GetMapping("download")public void download(HttpServletResponse response) throws IOException {List<Student> list = new ArrayList<>();list.add(new Student("1","夏天","18"));list.add(new Student("2","夏天","18"));list.add(new Student("3","夏天","18"));list.add(new Student("4","夏天","18"));list.add(new Student("5","夏天","18"));// 设置响应头response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");EasyExcel.write(response.getOutputStream(),Student.class).registerWriteHandler(new LockSheetWriteHandler())  //锁整张sheet.registerWriteHandler(new CellHandler(1))  //根据自定义注解解锁某些特定的列.sheet("模板").doWrite(list);}
}
LockSheetWriteHandler.java
package com.example.juc.test.handler;import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.streaming.SXSSFSheet;import java.util.UUID;/*** @author 夏* @since 2024/1/12 16:08*/
public class LockSheetWriteHandler implements SheetWriteHandler {@Overridepublic void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {}@Overridepublic void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {Sheet sheet = writeSheetHolder.getSheet();//锁定工作簿,设置保护密码String passWord = UUID.randomUUID().toString();sheet.protectSheet(passWord);// 锁定单元格不可选中(防止别人直接复制内容到其他excel修改)((SXSSFSheet) writeSheetHolder.getSheet()).lockSelectLockedCells(true);}
}
CellHandler.java
package com.example.juc.test.handler;import com.alibaba.excel.annotation.ExcelProperty;
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.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import com.example.juc.zhujie.UnLockCell;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellUtil;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @Author xlj* @Date Created in  2023/12/19 10:11* @DESCRIPTION:* @Version V1.0*/
public class CellHandler implements CellWriteHandler {private static final String PASSWORD = "1qaz!QAZ";private static final Integer A = 1;private static final Integer B = 0;private final Integer bigData;public CellHandler(int i) {this.bigData = i;}@Overridepublic void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) {}@Overridepublic int order() {return Integer.MAX_VALUE;}@Overridepublic void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {}@Overridepublic void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {if (isHead) {return; // 不处理表头}String fieldName = head.getFieldName();Class<?> clazz = writeSheetHolder.getClazz();Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {if (field.getName().equals(fieldName)) {if (field.isAnnotationPresent(UnLockCell.class) && field.isAnnotationPresent(ExcelProperty.class)) {Map<String, Object> properties = new HashMap<>(1);properties.put(CellUtil.LOCKED, false);CellUtil.setCellStyleProperties(cell, properties);Sheet sheet = writeSheetHolder.getSheet();if (bigData == 1) {sheet.setColumnHidden(A,true);} else {sheet.setColumnHidden(B,true);}}}}}}

注意:

pom依赖如下:

      <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.1.2</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version></dependency>

相关文章:

easyexcel 3.0.x 版本实现指定列 锁定以及指定列隐藏

1&#xff1a;效果示例 2&#xff1a;代码示例&#xff1a; UnLockCell.java package com.example.juc.zhujie;/*** Author * Date Created in 2023/12/19 10:09* DESCRIPTION:* Version V1.0*/import java.lang.annotation.*;/*** 用于标记锁定哪些列不需要锁定* author 12…...

whistle代理+mock轻松解决“页面端“测试接口没数据难题

0、whistle是什么&#xff1f;怎么用&#xff1f; 自行百度&#xff0c;此处不再赘述&#xff01; 1、示例演示&#xff08;交易订单测试&#xff09; 背景和痛点最近在测试一个小需求&#xff0c;需要涉及订单侧服务商品库侧服务库存侧服务财务侧线下交易服务。痛点主要在订…...

HNU-计算机网络-实验5(自选)-安全相关编程实验

计算机网络 课程综合实验安全相关编程实验&#xff08;RUST&#xff09; 计科210X 甘晴void 202108010XXX 【前言】 这个《课程综合实验》是21级开始新加的实验&#xff0c;之前都没有。具体的可以看实验指导书&#xff0c;是用的19级同学的毕设。我完成的这个实验需要一点点R…...

Ubuntu搭建OpenCV环境(C++)

Ubuntu搭建OpenCV环境(C) 文章目录 Ubuntu搭建OpenCV环境(C)一、环境介绍二、依赖安装三、安装包下载四、opencv安装五、测试 一、环境介绍 虚拟机 &#xff1a;VMware 15.5 OS &#xff1a; Ubuntu 20.04 opencv 版本 &#xff1a; 4.9.0 操作系统安装本文不再赘述&#x…...

R语言【paleobioDB】——pbdb_orig_ext():绘制随着时间变化而出现的新类群

Package paleobioDB version 0.7.0 paleobioDB 包在2020年已经停止更新&#xff0c;该包依赖PBDB v1 API。 可以选择在Index of /src/contrib/Archive/paleobioDB (r-project.org)下载安装包后&#xff0c;执行本地安装。 Usage pbdb_orig_ext (data, rank, temporal_extent…...

Vue模板的理解和使用

Vue模板 Vue.js 的模板是一种声明性的语法&#xff0c;用于将数据渲染进 DOM&#xff08;文档对象模型&#xff09;。它们使开发者能够以直观的方式声明式地描述用户界面应该如何根据应用程序数据的变化动态显示。 Vue模板的主要特点包括&#xff1a; 数据绑定&#xff1a; …...

mysql group_concat函数使用

CREATE TABLE aa (id int(11) DEFAULT NULL,name varchar(50) DEFAULT NULL ) ENGINEInnoDB DEFAULT CHARSETutf8mb41、基本查询 SELECT * FROM aa;2、以id分组&#xff0c;把name字段的值打印在一行&#xff0c;逗号分隔(默认) select id,group_concat(name) from aa group …...

并发编程之三大特性及JMM内存模型

目录 原子性 如何保证原子性 可见性 如何保证可见性 有序性 如何保证有序性 Java内存模型(JMM内存模型) Java内存模型的一些关键概念&#xff1a; 主内存与工作内存交互协议 Java内存模型通过以下手段来确保多线程程序的正确性&#xff1a; 锁机制 volatile volat…...

centos系统设置runlevel为5

在 CentOS 系统中&#xff0c;可以使用以下步骤将运行级别&#xff08;runlevel&#xff09;设置为 5&#xff1a; 1. 打开终端或 SSH 连接到 CentOS 服务器。 2. 以 root 用户身份登录。 3. 运行以下命令来编辑 /etc/inittab 文件&#xff1a; shell sudo vi /etc/inittab…...

关于群晖ARPL界面能出现ip但是使用Synology Assistant搜索不到ip问题 及解决方法

文章引用ing304 频道文章&#xff1a;https://qun.qq.com/qqweb/qunpro/share?_wv3&_wwv128&appChannelshare&inviteCode20jx8dPsU2z&contentID1m4NKs&businessType2&from181174&shareSource5&bizka 前言 当进入该界面后 提示IP无法访问&a…...

mysql Linux系统云服务器配置远程访问

mysql Linux系统云服务器配置远程访问 1.安装mysql 服务器 2.配置远程登录用户权限 3.进行远程登录&#xff0c;并访问数据库 1.安装mysql 服务器 首先先安装一下云服务器 sudo apt-get install mysql-server安装好之后&#xff0c;我们直接以root用户登录&#xff1a; …...

使用WAF防御网络上的隐蔽威胁之SQL注入攻击

SQL注入攻击是一种普遍存在且危害巨大的网络安全威胁&#xff0c;它允许攻击者通过执行恶意的SQL语句来操纵或破坏数据库。 这种攻击不仅能够读取敏感数据&#xff0c;还可能用于添加、修改或删除数据库中的记录。因此&#xff0c;了解SQL注入攻击的机制及其防御策略对于保护网…...

【书生·浦语】大模型实战营——第五次课程作业

基础作业——使用LMDeploy 以本地对话、网页Gradio、API服务中的一种方式部署InternLM-Chat-7B模型&#xff0c;生成300字的小故事 环境准备 除了安装所需依赖之后&#xff0c;重要的是进行模型转化&#xff08;转换成TurboMind格式&#xff09;&#xff0c;这里需要注意转化命…...

Unity | 渡鸦避难所-7 | 攻击碰撞检测

1 前言 英雄的宝剑并非只是装饰物&#xff0c;利剑出鞘时可以对怪物造成伤害。同样&#xff0c;怪物挥出铁拳时也会对英雄造成伤害。当然&#xff0c;都有同样的前提&#xff1a;在武器碰到对方的情况下&#xff0c;才会造成伤害。利用物理引擎&#xff0c;可以轻松的实现碰撞…...

Linux Mii management/mdio子系统分析之一 总体概述

Linux Mii management/mdio子系统分析之一 总体概述 &#xff08;转载&#xff09;原文链接&#xff1a;https://blog.csdn.net/u014044624/article/details/123303099 从本章开始&#xff0c;我们介绍linux的mii management对应的mdio子模块&#xff0c;该模块主要用于管理phy…...

C语言:自定义类型——联合和枚举

一、联合体 1.1 联合体类型的声明 像结构体⼀样&#xff0c;联合体也是由⼀个或者多个成员构成&#xff0c;这些成员可以是不同的类型。 声明方式如下图&#xff1a; 那联合体和结构体究竟有什么区别呢&#xff1f;&#xff1f; 下面将重点讲解联合体的特点&#xff01;&am…...

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -用户投票实现

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…...

如何实现一个两栏布局,右侧自适应?三栏布局中间自适应?

要实现一个两栏布局&#xff0c;右侧自适应的效果&#xff0c;可以使用 CSS 的 Flexbox 或 Grid 布局来实现。以下是使用 Flexbox 实现的示例&#xff1a; HTML 结构&#xff1a; htmlCopy Code<div class"container"><div class"left-column"&…...

004 Golang-channel-practice 左右括号匹配

第四题 左右括号打印 一个协程负责打印“&#xff08;”&#xff0c;一个协程负责打印“&#xff09;”&#xff0c;左右括号的数量要匹配。在这道题目里&#xff0c;我在main函数里进行了一个死循环。会产生一个随机数&#xff0c;随机数就是接下来要打印的左括号的数量。 例…...

MS2351M/MS2351D:RF 检测器/控制器

产品简述 MS2351M/MS2351D 是一款对数放大器芯片&#xff0c;主要用于接收 信号强度指示 (RSSI) 与 控 制 功 率 放 大 器 &#xff0c; 工 作 频 率 范 围 是 0.05GHz  4.0GHz &#xff0c;动态范围随信号频率不同可达 35dB 到 45dB 。 MS2351M/MS2351D 是电压响…...

DeepSeek隐私保护能力首次第三方穿透测试报告(CNAS认证机构出具,仅限本期披露3项核心缺陷)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;DeepSeek数据隐私保护能力概览 DeepSeek系列大模型在设计与部署阶段即深度融入隐私优先&#xff08;Privacy-by-Design&#xff09;原则&#xff0c;其数据处理机制严格遵循最小化采集、本地化计算、端…...

FanControl终极指南:3步掌握Windows风扇控制,打造静音高效散热系统

FanControl终极指南&#xff1a;3步掌握Windows风扇控制&#xff0c;打造静音高效散热系统 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode…...

Monitorian多显示器亮度管理终极指南:条件命令、定时任务与快捷键实战技巧

Monitorian多显示器亮度管理终极指南&#xff1a;条件命令、定时任务与快捷键实战技巧 【免费下载链接】Monitorian A Windows desktop tool to adjust the brightness of multiple monitors with ease 项目地址: https://gitcode.com/gh_mirrors/mo/Monitorian 还在为多…...

终极指南:如何用novel-downloader轻松保存网络小说到本地

终极指南&#xff1a;如何用novel-downloader轻松保存网络小说到本地 【免费下载链接】novel-downloader 一个可扩展的通用型小说下载器。 项目地址: https://gitcode.com/gh_mirrors/no/novel-downloader 你是否曾经遇到过心爱的小说突然从网站上消失的窘境&#xff1f…...

TranslucentTB:Windows任务栏透明化终极解决方案与高级配置指南

TranslucentTB&#xff1a;Windows任务栏透明化终极解决方案与高级配置指南 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB TranslucentT…...

BetterGI原神自动化工具:5分钟快速上手指南,解放你的游戏时间

BetterGI原神自动化工具&#xff1a;5分钟快速上手指南&#xff0c;解放你的游戏时间 【免费下载链接】better-genshin-impact &#x1f4e6;BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动刷本 | 自动采集/挖矿/锄地 | 一条…...

比系统自带强在哪?深度体验WizTree v4.16:磁盘分析老手的新选择

WizTree v4.16&#xff1a;重新定义磁盘空间分析的效率革命当你的C盘突然亮起红色警告&#xff0c;或是发现SSD剩余空间以每天1GB的速度神秘消失时&#xff0c;大多数人的第一反应是打开Windows自带的磁盘清理工具。但真正经历过数据洪流洗礼的IT老手&#xff0c;往往会默默启动…...

非Root安卓设备上使用Frida Gadget实现应用层Hook

1. 为什么非Root设备上Hook安卓App不再是“不可能任务”很多人第一次听说Frida&#xff0c;脑海里自动浮现出的场景是&#xff1a;一台已Root的测试机、adb shell里敲着su、frida-server在后台静静运行、然后用frida-trace监听onCreate——一套行云流水的操作&#xff0c;但前提…...

基于群论的双曲空间统计建模:从莫比乌斯分布到高效算法

1. 项目概述&#xff1a;为什么我们需要双曲空间与群论&#xff1f;如果你处理过社交网络、知识图谱或者自然语言中的词汇关系&#xff0c;一定对“层次结构”这个词不陌生。想象一下&#xff0c;你要把整个维基百科的词条关系&#xff0c;或者一个公司的组织架构图&#xff0c…...

Midjourney对比度调控失效全解析(从sref色域偏移到底层CLIP文本嵌入权重干预)

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;Midjourney对比度控制失效的现象学观察 当用户在 Midjourney v6 中显式使用 --contrast 参数&#xff08;如 /imagine prompt: a cyberpunk alley at night --contrast 100&#xff09;时&#xff0c;输出图…...