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

Dhatim FastExcel 读写 Excel 文件

Dhatim FastExcel 读写 Excel 文件

  • 一、说明
    • 1、主要特点
    • 2、应用场景
  • 二、使用方法
    • 1、引入依赖
    • 2、Sheet 数据
    • 3、读取 Excel
    • 4、写入 Excel

一、说明

Github 地址:Dhatim FastExcel

Dhatim FastExcel是一个高性能、轻量级的Java库,专门用于读取和写入Excel文件(包括.xlsx和.xls格式)。以下是对Dhatim FastExcel的详细介绍:

1、主要特点

  • 高速读写:FastExcel采用直接操作字节流的方式,避免了内存中创建大量对象,从而大大提高了读写速度。据官方宣称,其性能可以达到Apache POI的20倍。
  • 轻量级:FastExcel不依赖任何其他库,如Apache POI或OpenCSV,这使得它的体积更小,更容易集成到项目中。
  • 易于使用:其API设计简洁直观,无论是读取还是写入,都可以通过几行代码轻松实现。
  • 兼容性:FastExcel支持所有版本的Excel文件,包括2003版的.xls和2007及以后版本的.xlsx。
  • 多线程支持:支持多线程读写,可以在处理大型文件时充分利用多核处理器的性能。
  • 内存友好:对内存占用极低,即使处理大文件也不会造成内存压力。
  • 灵活配置:可以根据需要自定义行列读写策略,适应不同需求。

2、应用场景

  • 数据导入导出:在Web应用中,允许用户批量上传或下载Excel数据。
  • 数据分析:对大量Excel数据进行预处理或转换。
  • 自动化报告生成:基于模板快速生成大量个性化的Excel报表。

二、使用方法

1、引入依赖

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.wxhntmy</groupId><artifactId>dhatim-fastexcel</artifactId><version>1.0.0</version><packaging>jar</packaging><name>dhatim-fastexcel</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target><fastexcel.version>0.18.4</fastexcel.version><commons-io.version>2.16.1</commons-io.version><commons-lang3.version>3.16.0</commons-lang3.version><log4j.version>2.24.0</log4j.version><slf4j.version>2.0.16</slf4j.version><fastjson2.version>2.0.32</fastjson2.version><junit-jupiter.version>5.10.2</junit-jupiter.version><junit-platform.version>1.10.2</junit-platform.version></properties><dependencies><dependency><groupId>org.dhatim</groupId><artifactId>fastexcel</artifactId><version>${fastexcel.version}</version></dependency><dependency><groupId>org.dhatim</groupId><artifactId>fastexcel-reader</artifactId><version>${fastexcel.version}</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>${commons-io.version}</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>${commons-lang3.version}</version></dependency><dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>${fastjson2.version}</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>${log4j.version}</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>${log4j.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-reload4j</artifactId><version>${slf4j.version}</version></dependency><!--junit5--><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>${junit-jupiter.version}</version></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>${junit-jupiter.version}</version></dependency><dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-runner</artifactId><version>${junit-platform.version}</version></dependency><dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-launcher</artifactId><version>${junit-platform.version}</version><scope>test</scope></dependency><dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-console-standalone</artifactId><version>${junit-platform.version}</version><scope>test</scope></dependency></dependencies>
</project>

2、Sheet 数据

import java.util.ArrayList;
import java.util.List;
import java.util.Map;/*** 表格数据实体类*/
public class SheetData {/*** Sheet 名称*/private String sheetName;/*** 表头*/private List<String> header = new ArrayList<>();/*** List<Map<String, String>> 的表格数据*/private List<Map<String, String>> dataMapList = new ArrayList<>();public List<Map<String, String>> getDataMapList() {return dataMapList;}public void setDataMapList(List<Map<String, String>> dataMapList) {this.dataMapList = dataMapList;}public List<String> getHeader() {return header;}public void setHeader(List<String> header) {this.header = header;}public String getSheetName() {return sheetName;}public void setSheetName(String sheetName) {this.sheetName = sheetName;}
}

3、读取 Excel

import org.dhatim.fastexcel.reader.ReadableWorkbook;
import org.dhatim.fastexcel.reader.Row;
import org.dhatim.fastexcel.reader.Sheet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Stream;public class FastExcelRead {private static final Logger logger = LoggerFactory.getLogger(FastExcelRead.class);/*** 读取Excel文件第 1 个Sheet** @param file  Excel文件* @return sheet数据*/public static SheetData read(File file) {return read(file, 0);}/*** 读取Excel文件第 index 个Sheet** @param file  Excel文件* @param sheetName Sheet名称* @return sheet数据*/public static SheetData read(File file, String sheetName) {SheetData sheetData = new SheetData();try (InputStream is = new FileInputStream(file); ReadableWorkbook wb = new ReadableWorkbook(is)) {Optional<Sheet> sheetOptional = wb.findSheet(sheetName);if (sheetOptional.isEmpty()) {throw new RuntimeException("读取Sheet数据失败!");}Sheet sheet = sheetOptional.get();sheetData.setSheetName(sheet.getName());List<Row> rows = sheet.read();Row header = rows.get(0);List<String> headerList = new ArrayList<>();for (int i = 0; i < header.getCellCount(); i++) {headerList.add(header.getCellText(i));}sheetData.setHeader(headerList);List<Map<String, String>> dataMapList = getDataMapList(rows, headerList);sheetData.setDataMapList(dataMapList);} catch (Exception e) {logger.error("Error: ", e);}return sheetData;}/*** 读取Excel文件第 index 个Sheet** @param file  Excel文件* @param index Sheet下标* @return sheet数据*/public static SheetData read(File file, int index) {SheetData sheetData = new SheetData();try (InputStream is = new FileInputStream(file); ReadableWorkbook wb = new ReadableWorkbook(is)) {Optional<Sheet> sheetOptional = wb.getSheet(index);if (sheetOptional.isEmpty()) {throw new RuntimeException("读取Sheet数据失败!");}Sheet sheet = sheetOptional.get();sheetData.setSheetName(sheet.getName());List<Row> rows = sheet.read();Row header = rows.get(0);List<String> headerList = new ArrayList<>();for (int i = 0; i < header.getCellCount(); i++) {headerList.add(header.getCellText(i));}sheetData.setHeader(headerList);List<Map<String, String>> dataMapList = getDataMapList(rows, headerList);sheetData.setDataMapList(dataMapList);} catch (Exception e) {logger.error("Error: ", e);}return sheetData;}/*** 使用流读取Excel文件第 index 个Sheet(逐行读取)** @param file  Excel文件* @param index Sheet下标* @return sheet数据*/public static SheetData readByStream(File file, int index) {SheetData sheetData = new SheetData();try (InputStream is = new FileInputStream(file); ReadableWorkbook wb = new ReadableWorkbook(is)) {Optional<Sheet> sheetOptional = wb.getSheet(index);if (sheetOptional.isEmpty()) {throw new RuntimeException("读取Sheet数据失败!");}Sheet sheet = sheetOptional.get();sheetData.setSheetName(sheet.getName());try (Stream<Row> rows = sheet.openStream()) {AtomicInteger cnt = new AtomicInteger();List<String> headerList = new ArrayList<>();List<Map<String, String>> dataMapList = new ArrayList<>();rows.forEach(r -> {//表头if (cnt.get() == 0) {for (int i = 0; i < r.getCellCount(); i++) {headerList.add(r.getCellText(i));}sheetData.setHeader(headerList);}//数据行else {Map<String, String> rowMap = new HashMap<>();for (int j = 0; j < sheetData.getHeader().size(); j++) {if (j > r.getCellCount()) {rowMap.put(sheetData.getHeader().get(j), "");} else {rowMap.put(sheetData.getHeader().get(j), r.getCellText(j));}}dataMapList.add(rowMap);}cnt.getAndIncrement();});sheetData.setDataMapList(dataMapList);}} catch (Exception e) {logger.error("Error: ", e);}return sheetData;}/*** 数据转换** @param rows       读取到的 List<Row>* @param headerList 读取到的表头* @return 转换后的数据 List<Map<String, String>>*/private static List<Map<String, String>> getDataMapList(List<Row> rows, List<String> headerList) {List<Map<String, String>> dataMapList = new ArrayList<>();for (int i = 1; i < rows.size(); i++) {Row row = rows.get(i);Map<String, String> rowMap = new HashMap<>();for (int j = 0; j < headerList.size(); j++) {if (j > row.getCellCount()) {rowMap.put(headerList.get(j), "");} else {rowMap.put(headerList.get(j), row.getCellText(j));}}dataMapList.add(rowMap);}return dataMapList;}}

4、写入 Excel

import org.apache.commons.lang3.StringUtils;
import org.dhatim.fastexcel.Color;
import org.dhatim.fastexcel.Workbook;
import org.dhatim.fastexcel.Worksheet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;public class FastExcelWrite {private static final Logger logger = LoggerFactory.getLogger(FastExcelWrite.class);/*** 写入Excel文件** @param file      Excel文件* @param sheetData Sheet数据*/public static void write(File file, SheetData sheetData) {try (OutputStream os = new FileOutputStream(file); Workbook wb = new Workbook(os, "MyApplication", "1.0")) {logger.info(">>>>>写入Excel文件:{}", file.getAbsolutePath());// 设置全局默认字体wb.setGlobalDefaultFont("宋体", 12);logger.info(">>>>>设置全局默认字体为宋体,字号12");if (StringUtils.isEmpty(sheetData.getSheetName())){sheetData.setSheetName("Sheet1");}Worksheet ws = wb.newWorksheet(sheetData.getSheetName());List<String> header = sheetData.getHeader();List<Map<String, String>> dataMapList = sheetData.getDataMapList();// 冻结第1行ws.freezePane(0, 1);logger.info(">>>>>冻结表头....");// 命名单元格区域(单元格区域的名称只能包含字母、数字和下划线)ws.range(0, 0, 0, header.size()).setName("header");// 在单元格区域设置样式ws.range(0, 0, 0, header.size()).style().horizontalAlignment("center").italic().set();// 设置字体颜色和加粗显示ws.range(0, 0, 0, header.size()).style().bold().fontColor(Color.RED).fillColor(Color.GREEN).set();logger.info(">>>>>设置表头样式....");//开启筛选ws.setAutoFilter(0, 0, header.size() - 1);logger.info(">>>>>开启筛选....");setWorksheetData(ws, header, dataMapList);} catch (Exception e) {logger.error("Error: ", e);}}/*** 给工作表写入数据** @param ws          Worksheet* @param header      表头* @param dataMapList 行数据*/private static void setWorksheetData(Worksheet ws, List<String> header, List<Map<String, String>> dataMapList) {logger.info(">>>>>写入表头....");// 第一行为表头for (int j = 0; j < header.size(); j++) {ws.value(0, j, header.get(j));}logger.info(">>>>>写入表头完成....");logger.info(">>>>>写入数据行....");//第二行开始为数据for (int i = 1; i < dataMapList.size(); i++) {for (int j = 0; j < header.size(); j++) {ws.value(i, j, dataMapList.get(i).get(header.get(j)));}}logger.info(">>>>>写入数据行完成....");}/*** 同一个Excel文件写入多个Sheet* 每个工作表由不同的线程生成** @param file          Excel文件* @param sheetDataList Sheet数据*/public static void writeMultipleSheet(File file, List<SheetData> sheetDataList) {try (OutputStream os = new FileOutputStream(file); Workbook wb = new Workbook(os, "MyApplication", "1.0")) {logger.info(">>>>>写入Excel文件:{}", file.getAbsolutePath());// 设置全局默认字体wb.setGlobalDefaultFont("宋体", 12);logger.info(">>>>>设置全局默认字体为宋体,字号12");List<CompletableFuture<Void>> futureList = new ArrayList<>(sheetDataList.size());int sheetIndex = 1;for (SheetData sheetData : sheetDataList) {if (StringUtils.isEmpty(sheetData.getSheetName())){sheetData.setSheetName("Sheet" + sheetIndex);}sheetIndex++;Worksheet ws = wb.newWorksheet(sheetData.getSheetName());CompletableFuture<Void> cf = CompletableFuture.runAsync(() -> {List<String> header = sheetData.getHeader();List<Map<String, String>> dataMapList = sheetData.getDataMapList();// 冻结第1行ws.freezePane(0, 1);logger.info(">>>>>冻结表头....");// 命名单元格区域(单元格区域的名称只能包含字母、数字和下划线)ws.range(0, 0, 0, header.size()).setName("header");// 在单元格区域设置样式ws.range(0, 0, 0, header.size()).style().horizontalAlignment("center").italic().set();// 设置字体颜色和加粗显示ws.range(0, 0, 0, header.size()).style().bold().fontColor(Color.RED).fillColor(Color.GREEN).set();logger.info(">>>>>设置表头样式....");//开启筛选ws.setAutoFilter(0, 0, header.size() - 1);logger.info(">>>>>开启筛选....");setWorksheetData(ws, header, dataMapList);});futureList.add(cf);}// 等待所有线程完成CompletableFuture.allOf(futureList.toArray(new CompletableFuture[0])).get();} catch (Exception e) {logger.error("Error: ", e);}}
}

相关文章:

Dhatim FastExcel 读写 Excel 文件

Dhatim FastExcel 读写 Excel 文件 一、说明1、主要特点2、应用场景 二、使用方法1、引入依赖2、Sheet 数据3、读取 Excel4、写入 Excel 一、说明 Github 地址&#xff1a;Dhatim FastExcel Dhatim FastExcel是一个高性能、轻量级的Java库&#xff0c;专门用于读取和写入Exce…...

YOLO11全解析:从原理到实战,全流程体验下一代目标检测

前言 一、模型介绍 二、网络结构 1.主干网络&#xff08;Backbone&#xff09; 2.颈部网络&#xff08;Neck&#xff09; 3.头部网络&#xff08;Head&#xff09; 三、算法改进 1.增强的特征提取 2.优化的效率和速度 3.更高的准确性与更少的参数 4.环境适应性强 5.…...

深度学习领域的主要神经网络架构综述

阅读本文前请先按照顺序阅读&#xff1a; Coursera吴恩达《神经网络与深度学习》课程笔记&#xff08;1&#xff09;-- 深度学习概述_吴恩达深度学习课程-CSDN博客 https://blog.csdn.net/red_stone1/article/details/77799014 完结篇 | 吴恩达deeplearning.ai专项课程精炼笔…...

【Nginx系列】---Nginx配置tcp转发

参考 Nginx 配置文件&#xff1a; error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid;events {worker_connections 1024; }stream {# 第一个服务转发upstream mysqltest {server 172.16.187.142:9000;}server {listen 9000;proxy_pass mysqltest;}…...

Java抽象工厂+单例模式

在前端时间开发过程中,有这样一个业务场景:A;B两家厂商设备进行设备信息的同步功能。 根据实际场景,做了抽象工厂+单例模式实现调用工厂时,生成不同的具体业务引用对象,实现方法的调用。 概念: 抽象工厂模式通过接口或抽象类来创建一系列相关或依赖对象。它定义了一组工…...

后端接口设计

一、基本规范 1.URL设计 应遵循RESTful风格&#xff0c;使用动词名词的方式描述接口的功能。应简洁明了&#xff0c;易于理解和记忆。 2.请求协议及方法 使用HTTPS协议进行数据传输&#xff0c;保证数据在传输过程中的安全性。如无特殊情况&#xff0c;统一使用post方法。 …...

Docker部署Sentinel

一、简介 是什么&#xff1a;面向分布式、多语言异构化服务架构的流量治理组件 能干嘛&#xff1a;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性 官网地址&#xff1a;https://sentinelguard.io/zh-c…...

真实环境下实车运行,新能源汽车锂离子电池数据集

引言 锂离子电池(Lithium-ion Batteries,LiBs&#xff09;已经作为电动汽车核心动力源&#xff0c;其性能直接关系到系统的性能和使用安全。为确保锂电池的安全使用&#xff0c;需要对锂电池的状态进行精确的估计&#xff0c;包括荷电状态(State of Charge, soC)、健康状态(St…...

【求职面试】驾照的种类

大型客车 A1 大型载客汽车 A3、B1、B2、C1、C2、C3、C4、M 牵引车 A2 重型、中型全挂、半挂汽车列车 B1、B2、C1、C2、C3、C4、M 城市公交车 A3 核载10人以上的城市公共汽车 C1、C2、C3、C4 中型客车 B1 中型载客汽车&#xff08;10人以上、19人以下&#xff09; C1、C2、C3…...

centos权限大集合,覆盖多种权限类型,解惑权限后有“. + t s”问题!

在 CentOS 系统中&#xff0c;权限管理是操作系统的核心功能之一&#xff0c;确保不同用户和进程对文件、目录以及设备的访问被合理控制。 权限系统主要包括传统的 Unix 权限模型、特殊权限&#xff08;SetUID、SetGID、Sticky 位&#xff09;和更精细的访问控制列表&#xff…...

AI Agent案例全解析:百度营销智能体(8/30)

引言&#xff1a;在当今这个科技飞速发展的时代&#xff0c;AI技术呈现出爆发式的增长&#xff0c;正以前所未有的态势改变着众多行业的发展轨迹&#xff0c;营销领域也不例外。随着市场竞争的日益激烈&#xff0c;传统营销模式逐渐显露出疲态&#xff0c;对于变革的需求愈发迫…...

hive常用函数有哪些

Hive是一个基于Hadoop的数据仓库工具&#xff0c;它提供了类似于SQL的接口&#xff0c;用于数据查询和分析。Hive提供了许多内置函数&#xff0c;这些函数可以分为几种类型&#xff0c;包括&#xff1a; • 字符串函数&#xff1a;用于处理字符串数据。 • concat()&#xff1…...

【Python高级353】python实现多线程版本的TCP服务器

前面学了了套接字编程、tcp服务端客户端开发、面向对象版的服务端客户端、带有端口复用的服务端。 这里使用多线程开发多任务版的服务端 多任务版本的TCP服务器 来一个客户&#xff0c;就为其创建一个线程 import socket import threadingclass WebServer:# 3、定义一个__ini…...

分布式调度框架学习笔记

一、分布式调度框架的基本设计 二、线程池线程数量设置的基本逻辑 cpu是分时复用的方法&#xff0c;线程是cpu调度的最小单元 如果当前cpu核数是n&#xff0c;计算密集型线程数一般设为n&#xff0c;io密集型(包括磁盘io和网络io)线程数一般设置为2n. 计算密集型线程数一般设…...

SpringCloudAlibaba技术栈-Nacos

1、什么是Nacos&#xff1f; Nacos是个服务中心&#xff0c;就是你项目每个功能模块都会有个名字&#xff0c;比如支付模块,我们先给这个模块起个名字就叫paymentService,然后将这个名字和这个模块的配置放到Nacos中&#xff0c;其他模块也是这样的。好处是这样能更好地管理项…...

Redis篇--常见问题篇4--大Key(Big Key,什么是大Key,影响及使用建议)

1、概述 大Key&#xff1a;通常是指值&#xff08;Value&#xff09;的长度非常大&#xff0c;实际上键&#xff08;Key&#xff09;长度很大也算。通常来说&#xff0c;键本身不会很长&#xff0c;占用的内存较少&#xff0c;因此判断一个键是否为bigKey主要看它对应的值的大…...

谷歌浏览器 Chrome 提示:此扩展程序可能很快将不再受支持

问题现象 在Chrome 高版本上的扩展管理页面&#xff08;地址栏输入chrome://extensions/或者从界面进入&#xff09;&#xff1a; &#xff0c; 可以查看到扩展的情况。 问题现象大致如图: 问题原因 出现此问题的根本原因在于&#xff1a;谷歌浏览器本身的扩展机制发生了…...

WebRTC服务质量(10)- Pacer机制(02) RoundRobinPacketQueue

WebRTC服务质量&#xff08;01&#xff09;- Qos概述 WebRTC服务质量&#xff08;02&#xff09;- RTP协议 WebRTC服务质量&#xff08;03&#xff09;- RTCP协议 WebRTC服务质量&#xff08;04&#xff09;- 重传机制&#xff08;01) RTX NACK概述 WebRTC服务质量&#xff08;…...

数据库的数据被清除了,该如何恢复?

当数据库的数据被清除时&#xff0c;恢复数据的难度和可能性取决于多种因素&#xff0c;包括数据清除的方式、数据库的类型、是否有备份等。以下是一些常见的数据库数据恢复方法&#xff1a; 一、基于备份的恢复 使用备份文件&#xff1a; 如果数据库有定期的备份&#xff0c…...

【西安电子科技大学考研】25官方复试专业课参考书目汇总

初试已经顺利考完啦、成绩已经公布&#xff0c;现在已经有很多同学来问学长学姐&#xff0c;复试参考书有哪些&#xff0c;复试应该做好哪些准备。故此学长学姐给大家整理好了西安电子科技大学各个学院的复试参考书目录&#xff0c;有需要的同学可以参考一下哈。大家可以结合本…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...