[笔记] SpringBoot3 使用 EasyExcel 封装工具类实现复杂 Excel 数据处理:使用Java构建高效的数据导入解决方案
文章目录
- 一. 特殊 Excel 表格例子
- 二. 使用示例
- 1. bo 示例(部分字段)
- 2. 自定义监听器
- 3. 使用方法
- 三. 实现
- 1. 工具类
- 2. 默认基础导入(特殊 Excel 建立在这个基础上)
- 2.1 Excel 导入监听
- 2.2 默认监听
- 2.3 Excel 返回对象
- 2.3 默认excel返回对象实现
- 3. 特殊 Excel
- 3.1 单元格位置类
- 3.2 预表头监听器
在当今数据驱动的世界中,有效地管理和处理大量数据已成为企业成功的关键因素之一。特别是对于那些依赖于Excel文件进行数据交换和报告的企业来说,能够快速准确地将Excel数据转换为可操作的信息变得尤为重要。然而,传统的数据导入方法往往面临着性能瓶颈、格式不兼容以及缺乏灵活性等问题。本文介绍了一种基于Java的解决方案,它利用了阿里巴巴开源的EasyExcel库来实现高效且灵活的Excel数据导入功能。我们将探讨如何通过自定义监听器和工具类来处理复杂的Excel表结构,并展示如何轻松应对各种数据验证需求。
期间有些数据转换之类的方法,参考 :
Excel 导出操作 : [笔记] SpringBoot3 使用 EasyExcel 封装工具类实现 自定义表头 导出并实现 数据格式化转换 与 添加下拉框 操作
编写的逻辑是在狮子大佬的开源框架 Ruoyi-Plus 基础上丰富的内容
Ruoyi-Plus 地址 : Ruoyi-Vue-Plus
一. 特殊 Excel 表格例子
二. 使用示例
1. bo 示例(部分字段)
bo 和 vo 注解一样
2. 自定义监听器
3. 使用方法
三. 实现
1. 工具类
/*** Excel相关处理** @author 鲁子狄*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class ExcelUtil {/*** 同步导入(适用于小数据量)** @param is 输入流* @return 转换后集合*/public static <T> List<T> importExcel(InputStream is, Class<T> clazz) {return EasyExcel.read(is).head(clazz).autoCloseStream(false).sheet().doReadSync();}/*** 使用校验监听器 异步导入 同步返回** @param is 输入流* @param clazz 对象类型* @param isValidate 是否 Validator 检验 默认为是* @return 转换后集合*/public static <T> ExcelResult<T> importExcel(InputStream is, Class<T> clazz, boolean isValidate) {DefaultExcelListener<T> listener = new DefaultExcelListener<>(isValidate);EasyExcel.read(is, clazz, listener).sheet().doRead();return listener.getExcelResult();}/*** 使用自定义监听器 异步导入 自定义返回** @param is 输入流* @param clazz 对象类型* @param listener 自定义监听器* @return 转换后集合*/public static <T> ExcelResult<T> importExcel(InputStream is, Class<T> clazz, ExcelListener<T> listener) {EasyExcel.read(is, clazz, listener).sheet().doRead();return listener.getExcelResult();}/*** 使用自定义监听器 异步导入 自定义返回** @param is 输入流* @param clazz 对象类型* @param targetCells 获取表头对应的单元格* @param headRowNum 表头行* @param listener 自定义监听器* @return 转换后集合*/public static <T> ExcelResult<T> importExcel(InputStream is, Class<T> clazz, Set<CellPosition> targetCells, Integer headRowNum, ExcelListener<T> listener) {byte[] inputStreamBytes;try {inputStreamBytes = IOUtils.toByteArray(is);} catch (IOException e) {throw new RuntimeException("读取输入流异常", e);}if (targetCells != null) {// 同步读取预表头数据PreHeaderListener preHeaderListener = new PreHeaderListener(targetCells);// 注册监听器前先设置读取模式为无模型读取try (InputStream preHeaderInputStream = new ByteArrayInputStream(inputStreamBytes)) {EasyExcel.read(preHeaderInputStream).sheet().headRowNumber(0).registerReadListener(preHeaderListener).doReadSync();} catch (IOException e) {throw new RuntimeException("读取预表头数据异常", e);}// 获取预表头数据Map<String, String> preHeaderData = preHeaderListener.getPreHeaderData();listener.setPreHeaderData(preHeaderData);}// 使用新的输入流重新读取文件,这次是为了读取实际数据try (InputStream inputStream = new ByteArrayInputStream(inputStreamBytes)) {EasyExcel.read(inputStream).sheet().head(clazz).headRowNumber(headRowNum).registerReadListener(listener).doRead();} catch (IOException e) {throw new RuntimeException("导出Excel异常", e);}return listener.getExcelResult();}
}
2. 默认基础导入(特殊 Excel 建立在这个基础上)
特殊 Excel 建立在这个基础上,这块的代码也要有
2.1 Excel 导入监听
public interface ExcelListener<T> extends ReadListener<T> {ExcelResult<T> getExcelResult();/*** 设置预表头数据** @param preHeaderData 预表头数据*/void setPreHeaderData(Map<String, String> preHeaderData);
}
2.2 默认监听
@Slf4j
@NoArgsConstructor
public class DefaultExcelListener<T> extends AnalysisEventListener<T> implements ExcelListener<T> {/*** 是否Validator检验,默认为是*/private Boolean isValidate = Boolean.TRUE;/*** excel 表头数据*/private Map<Integer, String> headMap;/*** 导入回执*/private ExcelResult<T> excelResult;public DefaultExcelListener(boolean isValidate) {this.excelResult = new DefaultExcelResult<>();this.isValidate = isValidate;}/*** 处理异常** @param exception ExcelDataConvertException* @param context Excel 上下文*/@Overridepublic void onException(Exception exception, AnalysisContext context) throws Exception {String errMsg = null;if (exception instanceof ExcelDataConvertException excelDataConvertException) {// 如果是某一个单元格的转换异常 能获取到具体行号Integer rowIndex = excelDataConvertException.getRowIndex();Integer columnIndex = excelDataConvertException.getColumnIndex();errMsg = StrUtil.format("第{}行-第{}列-表头{}: 解析异常<br/>",rowIndex + 1, columnIndex + 1, headMap.get(columnIndex));if (log.isDebugEnabled()) {log.error(errMsg);}}if (exception instanceof ConstraintViolationException constraintViolationException) {Set<ConstraintViolation<?>> constraintViolations = constraintViolationException.getConstraintViolations();String constraintViolationsMsg = StreamUtils.join(constraintViolations, ConstraintViolation::getMessage, ", ");errMsg = StrUtil.format("第{}行数据校验异常: {}", context.readRowHolder().getRowIndex() + 1, constraintViolationsMsg);if (log.isDebugEnabled()) {log.error(errMsg);}}excelResult.getErrorList().add(errMsg);throw new ExcelAnalysisException(errMsg);}@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {this.headMap = headMap;log.debug("解析到一条表头数据: {}", JsonUtils.toJsonString(headMap));}@Overridepublic void invoke(T data, AnalysisContext context) {if (isValidate) {ValidatorUtils.validate(data);}excelResult.getList().add(data);}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {log.debug("所有数据解析完成!");}@Overridepublic ExcelResult<T> getExcelResult() {return excelResult;}@Overridepublic void setPreHeaderData(Map<String, String> preHeaderData) {}
2.3 Excel 返回对象
public interface ExcelResult<T> {/*** 对象列表*/List<T> getList();/*** 错误列表*/List<String> getErrorList();/*** 导入回执*/String getAnalysis();
}
2.3 默认excel返回对象实现
public class DefaultExcelResult<T> implements ExcelResult<T> {/*** 数据对象list*/@Setterprivate List<T> list;/*** 错误信息列表*/@Setterprivate List<String> errorList;public DefaultExcelResult() {this.list = new ArrayList<>();this.errorList = new ArrayList<>();}public DefaultExcelResult(List<T> list, List<String> errorList) {this.list = list;this.errorList = errorList;}public DefaultExcelResult(ExcelResult<T> excelResult) {this.list = excelResult.getList();this.errorList = excelResult.getErrorList();}@Overridepublic List<T> getList() {return list;}@Overridepublic List<String> getErrorList() {return errorList;}/*** 获取导入回执** @return 导入回执*/@Overridepublic String getAnalysis() {int successCount = list.size();int errorCount = errorList.size();if (successCount == 0) {return "读取失败,未解析到数据";} else {if (errorCount == 0) {return StrUtil.format("恭喜您,全部读取成功!共{}条", successCount);} else {return "";}}}
}
3. 特殊 Excel
3.1 单元格位置类
/*** 单元格位置类* 用于表示Excel中的单元格位置** @author 鲁子狄* @since 2025/03/19 11:30**/
@Data
public class CellPosition {/*** 行索引*/private final int row;/*** 列索引*/private final int column;/*** 构造函数* 将列字母转换为列索引** @param row 行索引* @param columnLetter 列字母*/public CellPosition(int row, String columnLetter) {this.row = row - 1;column = getColumnIndex(columnLetter);}/*** 将列字母转换为列索引** @param columnLetter 列字母* @return 列索引*/private static int getColumnIndex(String columnLetter) {int columnIndex = 0;for (int i = 0; i < columnLetter.length(); i++) {columnIndex = columnIndex * 26 + (columnLetter.charAt(i) - 'A' + 1);}return columnIndex - 1;}
}
3.2 预表头监听器
/*** 预表头监听器* 用于在读取Excel文件时处理预表头数据** @author 鲁子狄* @since 2025/03/18 14:55**/
@Slf4j
@Getter
public class PreHeaderListener extends AnalysisEventListener<Map<Integer, String>> {/*** 存储目标单元格的位置*/private final Set<CellPosition> targetCells;/*** 存储预表头数据*/private final Map<String, String> preHeaderData = new HashMap<>();/*** 构造函数** @param targetCells 目标单元格的位置集合*/public PreHeaderListener(Set<CellPosition> targetCells) {this.targetCells = targetCells;}/*** 将列索引转换为列字母** @param columnIndex 列索引* @return 列字母*/private static String getColumnLetter(int columnIndex) {StringBuilder columnLetter = new StringBuilder();while (columnIndex >= 0) {columnLetter.insert(0, (char) ('A' + columnIndex % 26));columnIndex = columnIndex / 26 - 1;}return columnLetter.toString();}/*** 处理每一行数据** @param map 当前行的数据* @param context 分析上下文*/@Overridepublic void invoke(Map<Integer, String> map, AnalysisContext context) {int rowIndex = context.readRowHolder().getRowIndex();for (CellPosition position : targetCells) {if (position.getRow() == rowIndex) {int columnIndex = position.getColumn();if (map.containsKey(columnIndex)) {String cellValue = map.get(columnIndex);preHeaderData.put("行" + (rowIndex + 1) + "列" + getColumnLetter(columnIndex), cellValue);}}}}/*** 所有数据解析完成后调用** @param analysisContext 分析上下文*/@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {}
}
相关文章:
[笔记] SpringBoot3 使用 EasyExcel 封装工具类实现复杂 Excel 数据处理:使用Java构建高效的数据导入解决方案
文章目录 一. 特殊 Excel 表格例子二. 使用示例1. bo 示例(部分字段)2. 自定义监听器3. 使用方法 三. 实现1. 工具类2. 默认基础导入(特殊 Excel 建立在这个基础上)2.1 Excel 导入监听2.2 默认监听2.3 Excel 返回对象2.3 默认excel返回对象实现 3. 特殊 Excel3.1 单元格位置类3…...
【数据库】sql错题详解
1. 执行子查询 SELECT 供应商号 FROM 订购单 WHERE 职工号 IN (E1, E3) GROUP BY 供应商号 HAVING COUNT(DISTINCT 职工号) 2筛选职工号为 E1 或 E3 的记录: 依据 WHERE 职工号 IN (E1, E3) 这个条件,从 订购单 表中把职工号为 E1 或者 E3 的记录筛选出…...
Three.js贴图技巧:优化性能与效果
引言 在当今数字化的时代,WebGL 技术为开发者们打开了一扇通往交互式 3D 图形世界的大门,而 Three.js 作为JavaScript库中的佼佼者,凭借其简单易用的 API 和丰富的功能,在创建3D场景和交互应用方面得到了广泛应用。在Three.js构建…...
Java Collection API增强功能系列之一 Arrays.asList()
在Java编程中,Arrays.asList() 是一个高频使用却又容易引发陷阱的工具方法。它能够快速将数组转换为列表,但其特殊行为常常让开发者踩坑。本文将深入剖析该方法的本质特性,并揭示其使用时的注意事项。一、方法定义与基础用法 1. 方法签名 p…...
websocket中spring注入失效
一个null指针引发的思考 websocket中spring注入失效 一个null指针引发的思考场景代码SpringBoot入口类配置类websocket类 问题排查问题1:问题2: 反思解决方案一:方案二:方案三:方案四: 场景 首页有个webso…...
Nat Commun:网络结构在塑造神经表征的强度中扮演着‘幕后推手’的角色
摘要 人类通过一系列离散事件构建他们对世界的心智模型。这一过程被称为图学习,它产生了一个编码事件间转移概率图的模型。近期的研究表明,一些网络比其他网络更容易学习,但这种效应的神经基础仍然未知。在这里,本研究使用功能磁共…...
Driver具体负责什么工作
在 Apache Spark 中,Driver(驱动程序) 是 Spark 应用的核心控制节点,负责协调整个应用的执行流程。它是用户编写的 Spark 应用程序(如 main() 方法)的入口点,直接决定了任务的调度、资源分配和结…...
LeetCode 热题 100----2.移动零
LeetCode 热题 100----2.移动零 题目描述 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。示例 1:输入: nums [0,1,0,3,12] 输出: [1,3,12,…...
能源革命新突破:虚拟电厂赋能微电网智能调控,构建低碳生态新格局
在“双碳”目标的引领下,中央一号文件明确提出了“推进农村能源革命,深化绿色低碳技术应用”。作为能耗集中区域,产业园区如何实现清洁能源高效消纳与碳减排的目标成为了难题,中电国为推出的虚拟电厂与风光储充柴多能互补的微电网…...
Java集合框架深度剖析:从数据结构到实战应用
引言 Java集合框架是Java开发中的核心组件之一,其设计目标是提供高性能、高复用性的数据容器。无论是数据处理、缓存设计还是高并发场景,集合框架都扮演着关键角色。本文将从List、Map、Set三大核心接口出发,深入剖析其主流实现类࿰…...
基于灵动微单片机SPIN系列的两轮车解决方案
电动车需配备与电机兼容性更高的双模控制器。灵动针对两轮车提供了相应的方案和解决算法。在两轮车的霍尔传感器出现故障时,系统应能继续有效地驱动电机。除了常规的过流、过压、过温保护措施外,灵动的方案还支持防盗功能,具备电刹车能力&…...
ngx_http_core_server_name
定义在 src\http\ngx_http_core_module.c static char * ngx_http_core_server_name(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) {ngx_http_core_srv_conf_t *cscf conf;u_char ch;ngx_str_t *value;ngx_uint_t i;ngx_…...
【Docker系列一】Docker 简介
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
[C++面试] 你了解transform吗?
层级核心知识点入门基本语法、与for_each对比、单/双范围操作进阶动态扩展、原地转换、类型兼容性、异常安全高阶性能优化、C20 Ranges、transform_if模拟 一、入门 1、描述std::transform的基本功能,并写出两种版本的函数原型 std::transform函数是 C 标准库<…...
MSE分类时梯度消失的问题详解和交叉熵损失的梯度推导
下面是MSE不适合分类任务的解释,包含梯度推导。以及交叉熵的梯度推导。 前文请移步笔者的另一篇博客:大模型训练为什么选择交叉熵损失(Cross-Entropy Loss):均方误差(MSE)和交叉熵损失的深入对比…...
docker 安装部署 canal
1 mysql 安装 1.1 拉取镜像 docker pull mysql:8.4.41.2 创建挂载目录 mkdir -p /user/lzl/tool/docker/mysql/mysql_8.4.4/home/confmkdir -p /user/lzl/tool/docker/mysql/mysql_8.4.4/home/datamkdir -p /user/lzl/tool/docker/mysql/mysql_8.4.4/home/log1.3 编辑配置文…...
flowable适配达梦7 (2.1)
经过第一版的问题解决,后端项目可以启动,前端页面也集成进去。 前端在流程设计页面报错 之后发现主要是组件中modelerStore这个值没有 解决方法:在data增加对象 给component/process/designer.vue 中涉及到的每个子组件传入 :modelerStore“modeler…...
优化 Docker 镜像 技巧
优化 Docker 镜像可以提高构建速度、减少镜像大小、提高安全性和效率。以下是一些优化 Docker 镜像的方法: 使用适当的基础镜像 选择合适的基础镜像可以减小镜像大小,并确保基础镜像的安全性和更新性。Alpine、Ubuntu Minimal 等轻量级基础镜像是常用选…...
Spring Boot框架中常用注解
以下是Spring Boot框架中常用注解的详细说明,包括名称、用途、用法、使用位置及扩展示例,按功能模块分类整理: 一、核心启动与配置注解 1. SpringBootApplication 用途:主启动类注解,整合了 Configuration、EnableAu…...
Linux笔记之Ubuntu22.04安装IBus中文输入法教程
Linux笔记之Ubuntu22.04安装IBus中文输入法教程 code review! 文章目录 Linux笔记之Ubuntu22.04安装IBus中文输入法教程安装 IBus 并配置中文输入法步骤 1: 安装 IBus 和拼音插件步骤 2: 设置 IBus 为默认输入法框架步骤 3: 重启会话步骤 4: 添加中文输入法步骤 5: …...
(UI自动化测试web端)第二篇:元素定位的方法_xpath属性定位
看代码里的【driver.find_element_by_xpath( )】()里的路径怎么写? xpath元素定位有多种写法,那我们现在说的就是在元素定位时,根据网页的实际情况来选择适合的xpath元素定位的写法。 文章主要介绍了xpath属性定位的方法和属性扩展使用的方法…...
Linux中执行 ifconfig 命令时提示 “未找到命令”
在 Linux 系统里,若执行 ifconfig 命令时提示 “未找到命令” 通常是由于系统没有安装 net-tools 包,或者该命令不在系统的 PATH 环境变量所包含的路径中 安装 net-tools 包 # Ubuntu/Debian sudo apt update sudo apt install net-tools# CentOS 7 及以…...
UE4学习笔记 FPS游戏制作15修正可以换枪中可以继续换枪和开火的Bug
现在存在的问题是换枪动作没完成时,可以继续换枪或者开枪 因为换枪这个动作是由玩家进行的,所以应该修改FppShooter脚本 我们添加两个参数 最后一次换枪的时间和换枪动画的长度 EquipmentLength 设置默认值0.6秒 添加一个新函数IsInEquip,返…...
SSL/TLS 和 SSH 介绍以及他们的区别
目录 SSL/TLS SSL/TLS工作原理的核心步骤握手阶段(Handshake Protocol)加密通信阶段(Encrypted Communication Phase)会话恢复(Session Resumption) SSH SSH 加密机制的核心步骤 SSH 和 SSL 区别 SSL/TLS …...
AudioTrack
AudioTrack是Android Audio系统提供给应用开发者(java/C)的API,用于操作音频播放的数据通路。MeidaPlayer在播放音乐时用到的是它,我们可以也可以直接使用AudioTrack进行音频播放。它是最基本的音频数据输出类。 AudioTrack.java…...
Windows安装Rust环境(详细教程)
一、 安装mingw64(C语言环境) Rust默认使用的C语言依赖Visual Studio,但该工具占用空间大安装也较为麻烦,可以选用轻便的mingw64包。 1.1 安装地址 (1) 下载地址1-GitHub:Releases niXman/mingw-builds-binaries GitHub (2) 下载地址2-W…...
监控IP,网站将异常情况通过飞书机器人发至指定群内
界面如下,丑是丑了点,但主打一个实用。 主要就是通过ping,就是一直在ping,当不通的时候,就根据你设置的报警时间,主要是利用飞书机器人来给飞书指定群里发异常信息报警。 直接上代码 import subprocess i…...
JVM 02
今天是2025/03/23 19:07 day 10 总路线请移步主页Java大纲相关文章 今天进行JVM 3,4 个模块的归纳 首先是JVM的相关内容概括的思维导图 3. 类加载机制 加载过程 加载(Loading) 通过类全限定名获取类的二进制字节流(如从JAR包、网络、动态…...
局域网设备访问虚拟机 挂载NFS
目录 引言:网络IP问题配置虚拟机网络有线网络:无线网络: NFS文件挂载服务端配置客户端连接 引言: 需求:局域网下树莓派设备想要访问电脑主机上的虚拟机。这样可以通过nfs挂载网络设备,有利于交叉编译环境调…...
零、ubuntu20.04 安装 anaconda
1.anaconda下载 地址:Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 选择:Anaconda3-2023.07-2-Linux-x86_64.sh 2.anaconda安装 选择下载目录,选在在终端中打开,然后在终端输入安装命…...
IntelliJ IDEA 将 Spring Boot 项目远程部署到服务器
使用 IntelliJ IDEA 将 Spring Boot 项目远程部署到服务器的详细步骤,涵盖多种常见方法: 方法一:通过 SSH Maven 插件直接部署 1. 服务器环境准备 确保服务器已安装: Java 运行环境(与项目 JDK 版本一致࿰…...
利用dify打造命令行助手
利用dify打造命令行助手 前言 我是mac os 的使用者。 如果说macos哪个工具我使用最频繁,最能提高效率的工作工具非zsh莫属(当然,我安装了iterm)。前不久,我要扩容线上的k8s集群。便想统计一下每个node上运行的pod数量。我不知道合适的命令&…...
前端面试整理
一、csshtml 二、js 三、vue 四、react 1.React 类组件与函数式组件核心区别 定义方式的不同,类组件用ES6的class,继承React.Component,而函数式组件用函数声明。 状态管理方面,类组件用this.state和setState,函…...
Perl语言的计算机网络
Perl语言在计算机网络中的应用 引言 在计算机科学的众多领域中,网络编程是一个极具挑战性和广泛应用的领域。在这其中,Perl语言以其强大的文本处理能力和简洁的语法,成为了网络编程的重要工具之一。自从1987年Larry Wall创造Perl以来&#…...
数据结构初阶-二叉树的应用
1.单值二叉树 题目链接:https://leetcode.cn/problems/univalued-binary-tree/description/ 题目思路:我们把根结点与左孩子和右孩子进行比较,只有左右子树都是单值二叉树的时候才为单值二叉树。但是我们需要先返回的是false,最…...
【赵渝强老师】在Docker中运行达梦数据库
Docker是一个客户端服务器(Client-Server)架构。Docker客户端和Docker守护进程交流,而Docker的守护进程是运作Docker的核心,起着非常重要的作用(如构建、运行和分发Docker容器等)。达梦官方提供了DM 8在Doc…...
掌握C#循环:for、while、break与continue详解及游戏案例
Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...
备份比赛数据【算法赛】
0备份比赛数据【算法赛】 - 蓝桥云课 问题描述 蓝桥杯大赛的组委会最近遇到了一个棘手的问题。他们有 N 台电脑需要备份比赛数据,每台电脑所需的备份时间分别为 A1,A2,…,AN 分钟。 备份必须按编号顺序依次进行,即先第 1 台,再第 2 …...
【算法笔记】图论基础(二):最短路、判环、二分图
目录 最短路松弛操作Dijkstra朴素Dijkstra时间复杂度算法过程例题 堆优化Dijkstra时间按复杂度算法过程例题 bellman-ford时间复杂度为什么dijkstra不能处理负权边?dijkstra的三个步骤:反例失效的原因 算法过程例题 spfa时间复杂度算法过程例题spfa求最短…...
【性能优化点滴】odygrd/quill 中一个简单的标记位作用--降低 IO 次数
在 StreamSink 类中,成员变量 _write_occurred 的作用是 跟踪自上次刷新(Flush)以来是否有写入操作发生,其核心目的是 优化 I/O 性能。以下是详细解析: _write_occurred 的作用 1. 避免不必要的刷新(Flush…...
Unity2022发布Webgl2微信小游戏部分真机黑屏
复现规律: Unity PlayerSetting中取消勾选ShowSplashScreen 分析: 在Unity中,Splash Screen(启动画面) 不仅是视觉上的加载动画,还承担了关键的引擎初始化、资源预加载和渲染环境准备等底层逻辑。禁用后导…...
TDengine 3.3.2.0 集群报错 Post “http://buildkitsandbox:6041/rest/sql“
原因: 初始化时处于内网环境下,Post “http://buildkitsandbox:6041/rest/sql“ 无法访问 修复: vi /etc/hosts将buildkitsandbox映射为本机节点 外网环境下初始化时没有该问题...
基于yolov11的中空圆柱形缺陷检测系统python源码+pytorch模型+评估指标曲线+精美GUI界面
【背景介绍】 中空圆柱形缺陷检测在多个领域具有深远意义。在石油、天然气及化工行业,缺陷检测可预防泄漏事故,避免火灾、爆炸及环境污染,保障人员与财产安全。建筑、桥梁及航空航天领域则依赖此技术确保中空圆柱形结构的稳定性,…...
Python爬虫-爬取AliExpress商品搜索词排名数据
前言 本文是该专栏的第49篇,后面会持续分享python爬虫干货知识,记得关注。 本文,笔者以AliExpress平台为例。基于Python爬虫,通过某个指定的“搜索关键词”,批量获取该“搜索关键词”的商品排名数据。 具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。废…...
20250321在荣品的PRO-RK3566开发板的buildroot系统下使用ll命令【直接编译进IMG】
./buildroot/system/skeleton/etc/profile # some more ls aliases alias llls -alF alias lals -A alias lls -CF 20250321在荣品的PRO-RK3566开发板的buildroot系统下使用ll命令【直接编译进IMG】 2025/3/21 16:53 cd /etc/ echo "" >> # some more ls ali…...
Flink 自定义数据源:从理论到实践的全方位指南
目录 第一章:自定义数据源的基础概念 数据源是什么?它在 Flink 中扮演什么角色? Flink 的内置数据源:开箱即用的 “标配” 为什么需要自定义数据源?它的杀手锏在哪? 第二章:自定义数据源的实现之道 接口选择:从简单到高级,选对工具事半功倍 SourceFunction:入门…...
如何在 Java 中查找 PDF 页面大小(教程)
PDF 文件并未被 Java 直接支持。本教程将向您展示如何使用 JPedal Java PDF 库 以简单的步骤提取 PDF 文件的页面大小(高度和宽度)。页面大小可以以 厘米、英寸或像素 为单位获取。 为什么要使用第三方库处理 PDF 文件? PDF 文件是一种复杂…...
java版嘎嘎快充玉阳软件互联互通中电联云快充协议充电桩铁塔协议汽车单车一体充电系统源码uniapp
演示: 微信小程序:嘎嘎快充 http://server.s34.cn:1888/ 系统管理员 admin/123456 运营管理员 yyadmin/Yyadmin2024 运营商 operator/operator2024 系统特色: 多商户、汽车单车一体、互联互通、移动管理端(开发中) 另…...
使用Mastra.ai构建AI智能体:一次动手实践
Mastra框架提供了一种简洁高效的AI智能体构建方式。 本文将分享我使用Mastra.ai的实践经历。 我们将逐步完成环境搭建、探索框架核心功能,并构建一个能与工具交互的基础智能体。 过程中我会总结成功经验、遇到的问题以及收获的启示。 如果你对AI开发感兴趣,或正在寻找一个…...
Redis之大key问题
BigKey 常见面试题目 你会么? MoreKey 案例 大批量往redis里面插入2000W测试数据key Linux Bash下面执行,批量插入100W for((i1;i<100*10000;i)); do echo "set k$i v$i" >> /tmp/redisTest.txt ;done;生成100W条redis批量设置kv的…...