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

EasyExcel

概述

GitHub - alibaba/easyexcel: 快速、简洁、解决大文件内存溢出的java处理Excel工具

EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel

EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。 他能让你在不用考虑性能、内存的等因素的情况下,快速完成Excel的读、写等功能。

Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。 easyexcel重写了poi对07版Excel的解析,一个3M的excel用POI sax解析依然需要100M左右内存,改用easyexcel可以降低到几M,并且再大的excel也不会出现内存溢出;03版依赖POI的sax模式,在上层做了模型转换的封装,让使用者更加简单方便

EasyExcel

快速入门

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.2.1</version>
</dependency>
<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version>
</dependency>
这个错误通常是由于您的项目使用了 SLF4J 日志框架(Simple Logging Facade for Java),但无法找到对应的日志实现。
SLF4J 只是一个日志框架,它并不提供具体的日志实现。
要解决这个问题,您需要添加一个 SLF4J 的日志实现,例如 Logback 或 Log4j。
这些实现可以将 SLF4J 的 API 转换为特定的日志系统的 API,并提供日志记录功能。
如果使用的是 Maven,则可以通过以上方式添加 Logback 日志实现:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {@ExcelProperty("序号")private Integer id;@ExcelProperty("姓名")private String name;@ExcelProperty("年龄")private Integer age;@ExcelProperty("生日")private Date birthday;
}

写操作

方式一

@Testvoid test1() {List<User> userList = new ArrayList<>();// 添加用户信息userList.add(new User(1, "张三", 23, new Date()));userList.add(new User(2, "李四", 24, new Date()));userList.add(new User(3, "王五", 25, new Date()));userList.add(new User(4, "赵六", 26, new Date()));// 输出目录String fileName = "/Users/whitecamellia/Desktop/test/用户信息表1.xlsx";EasyExcel.write(fileName,User.class).sheet("用户信息1").doWrite(userList);}

方式二

 @Testvoid test2() {List<User> userList = new ArrayList<>();// 添加用户信息userList.add(new User(1, "张三", 23, new Date()));userList.add(new User(2, "李四", 24, new Date()));userList.add(new User(3, "王五", 25, new Date()));userList.add(new User(4, "赵六", 26, new Date()));// 输出目录String fileName = "/Users/whitecamellia/Desktop/test/用户信息表2.xlsx";// 创建excelWriter对象ExcelWriter excelWriter = EasyExcel.write(fileName, User.class).build();// 创建writeSheet对象WriteSheet writeSheet = EasyExcel.writerSheet("用户信息2").build();// 写入数据excelWriter.write(userList,writeSheet);// 关闭流操作excelWriter.finish();}

排除写入的字段

 @Testvoid test3() {List<User> userList = new ArrayList<>();// 添加用户信息userList.add(new User(1, "张三", 23, new Date()));userList.add(new User(2, "李四", 24, new Date()));userList.add(new User(3, "王五", 25, new Date()));userList.add(new User(4, "赵六", 26, new Date()));// 输出目录String fileName = "/Users/whitecamellia/Desktop/test/用户信息表3.xlsx";
​Set<String> set =  new HashSet<>();set.add("age");set.add("birthday");
​EasyExcel.write(fileName,User.class)// 排除列.excludeColumnFieldNames(set).sheet("用户信息3").doWrite(userList);}
​

允许写入的字段

 @Testvoid test4() {List<User> userList = new ArrayList<>();// 添加用户信息userList.add(new User(1, "张三", 23, new Date()));userList.add(new User(2, "李四", 24, new Date()));userList.add(new User(3, "王五", 25, new Date()));userList.add(new User(4, "赵六", 26, new Date()));// 输出目录String fileName = "/Users/whitecamellia/Desktop/test/用户信息表4.xlsx";
​Set<String> set =  new HashSet<>();set.add("age");set.add("birthday");
​EasyExcel.write(fileName,User.class)// 指定列.includeColumnFieldNames(set).sheet("用户信息4").doWrite(userList);}

对Excel列排序

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {@ExcelProperty(value = "序号",index = 0)private Integer id;@ExcelProperty(value = "姓名",index = 1)private String name;@ExcelProperty(value = "年龄",index = 3)private Integer age;@ExcelProperty(value = "生日",index = 2)private Date birthday;
}

复杂头数据写入

image-20230414151925086

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Emp {@ExcelProperty({"基本信息","编号"})private Integer id;@ExcelProperty({"基本信息","姓名"})private String name;@ExcelProperty({"基本信息","年龄"})private Integer age;@ExcelProperty({"日期","入职"})private Date entry;@ExcelProperty({"日期","离职"})private Date leave;
}
​
​@Testvoid test5() {List<Emp> empList = new ArrayList<>();// 添加用户信息empList.add(new Emp(1, "张三", 23, new Date(),new Date()));empList.add(new Emp(2, "李四", 24, new Date(),new Date()));empList.add(new Emp(3, "王五", 25, new Date(),new Date()));empList.add(new Emp(4, "赵六", 26, new Date(),new Date()));// 输出目录String fileName = "/Users/whitecamellia/Desktop/test/员工信息表1.xlsx";EasyExcel.write(fileName,Emp.class).sheet("员工信息表1").doWrite(empList);}

重复多次写入

写到单个Sheet
 @Testvoid test6 () {List<User> userList = new ArrayList<>();// 添加用户信息userList.add(new User(1, "张三", 23, new Date()));userList.add(new User(2, "李四", 24, new Date()));userList.add(new User(3, "王五", 25, new Date()));userList.add(new User(4, "赵六", 26, new Date()));// 输出目录String fileName = "/Users/whitecamellia/Desktop/test/用户信息表5.xlsx";// 创建excelWriter对象ExcelWriter excelWriter = EasyExcel.write(fileName, User.class).build();// 创建writeSheet对象WriteSheet writeSheet = EasyExcel.writerSheet("用户信息5").build();// 写10次for (int i = 0; i < 10; i++) {excelWriter.write(userList,writeSheet);}// 关闭流excelWriter.finish();}
写到多个Sheet
@Testvoid test7 () {List<User> userList = new ArrayList<>();// 添加用户信息userList.add(new User(1, "张三", 23, new Date()));userList.add(new User(2, "李四", 24, new Date()));userList.add(new User(3, "王五", 25, new Date()));userList.add(new User(4, "赵六", 26, new Date()));// 输出目录String fileName = "/Users/whitecamellia/Desktop/test/用户信息表6.xlsx";// 创建excelWriter对象ExcelWriter excelWriter = EasyExcel.write(fileName, User.class).build();// 写10次for (int i = 1; i <= 10; i++) {// 创建writeSheet对象WriteSheet writeSheet = EasyExcel.writerSheet("用户信息"+i).build();excelWriter.write(userList,writeSheet);}// 关闭流excelWriter.finish();}

日期、数字或者自定义格式转换

@NumberFormat("#.##")
@ExcelProperty("薪资")    
日期格式化
@DateTimeFormat("yyyy年MM月dd日")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Emp {@ExcelProperty({"基本信息","编号"})private Integer id;@ExcelProperty({"基本信息","姓名"})private String name;@ExcelProperty({"基本信息","年龄"})private Integer age;@DateTimeFormat("yyyy年MM月dd日")@ExcelProperty({"日期","入职"})private Date entry;@DateTimeFormat("yyyy年MM月dd日")@ExcelProperty({"日期","离职"})private Date leave;@NumberFormat("#.##")@ExcelProperty({"薪资"})private Double salary;
}
​@Testvoid test8() {List<Emp> empList = new ArrayList<>();// 添加用户信息empList.add(new Emp(1, "张三", 23, new Date(),new Date(),8234.333));empList.add(new Emp(2, "李四", 24, new Date(),new Date(),8234.333));empList.add(new Emp(3, "王五", 25, new Date(),new Date(),8234.333));empList.add(new Emp(4, "赵六", 26, new Date(),new Date(),8234.333));// 输出目录String fileName = "/Users/whitecamellia/Desktop/test/员工信息表2.xlsx";EasyExcel.write(fileName,Emp.class).sheet("员工信息表2").doWrite(empList);}

图片导出

ImageData

@Data
public class ImageData {// 抽象文件表示图片@ExcelProperty(value = "图1")private File file;// 输入流表示一个图片@ExcelProperty(value = "图2")private InputStream inputStream;/** 如果string类型保存一个图片,必须使用StringImageConverter转换器*/@ExcelProperty(converter = StringImageConverter.class,value = "图3")private String string;// 二进制数组表示图片@ExcelProperty(value = "图4")private byte[] byteArray;// 网络链接表示图片 */@ExcelProperty(value = "图5")private URL url;
}@Testvoid test9 () throws Exception {String fileName = "/Users/whitecamellia/Desktop/test/xxx.xlsx";String imageLocalUrl = "/Users/whitecamellia/资料/xx/xxx/xxxx .jpg";String imageUrl = "https://www.mianfeiwendang.com/pic/1da74e363276b769ac770539/4-810-jpg_6-1080-0-0-1080.jpg";List<ImageData> list = new ArrayList<>();ImageData imageData = new ImageData();imageData.setFile(new File(imageLocalUrl));imageData.setInputStream(new FileInputStream(imageLocalUrl));imageData.setString(imageLocalUrl);byte[] b = new byte[(int) new File(imageLocalUrl).length()];FileInputStream fileInputStream = new FileInputStream(imageLocalUrl);fileInputStream.read(b);imageData.setByteArray(b);imageData.setUrl(new URL(imageUrl));list.add(imageData);EasyExcel.write(fileName, ImageData.class).sheet("图片").doWrite(list);}

列宽行高设置

@ContentRowHeight(2000)//设置内容高度
@HeadRowHeight(50)//设置标题高度
@ColumnWidth(45)//设置列宽
@Data
public class ImageData {// 抽象文件表示图片@ColumnWidth(255)//设置列宽@ExcelProperty(value = "图1")private File file;....
}@Testvoid test9 () {.....}

样式

StyleDate

@HeadRowHeight(50) //设置标题高度
// 头背景设置为红色(10)  enum IndexedColors
@HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND,fillForegroundColor = 10)
// 头字体 设置为40
@HeadFontStyle(fontHeightInPoints = 40)
// 内容背景设置为红色(10)
@ContentStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND,fillForegroundColor = 14)
// 内容字体 设置为30
@ContentFontStyle(fontHeightInPoints = 30)
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Emp {@ExcelProperty({"基本信息","编号"})private Integer id;@ExcelProperty({"基本信息","姓名"})private String name;@ExcelProperty({"基本信息","年龄"})private Integer age;@DateTimeFormat("yyyy年MM月dd日")@ExcelProperty({"日期","入职"})private Date entry;@DateTimeFormat("yyyy年MM月dd日")@ExcelProperty({"日期","离职"})private Date leave;@NumberFormat("#.##")@ExcelProperty({"薪资"})private Double salary;
}
​@Testvoid test8 () {.....}

合并单元格

@OnceAbsoluteMerge(firstRowIndex = 2, lastRowIndex = 3, firstColumnIndex = 2, lastColumnIndex = 3)
public class Emp {@ExcelProperty({"基本信息","编号"})private Integer id;@ExcelProperty({"基本信息","姓名"}).....
}@Testvoid test8 () {.....}

读操作

方式一

 @Testvoid test1 () {String fileName = "/Users/whitecamellia/Desktop/test/用户信息表1.xlsx";EasyExcel.read(fileName, User.class, new AnalysisEventListener<User>() {@Overridepublic void invoke(User user, AnalysisContext analysisContext) {// 每读一行 执行一次 ,可以在这里执行db操作,这里读取时尽量不要在User上加indexSystem.out.println("读取到的数据是:" + user);}
​@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {// 读完数据 最后做一次System.out.println("全部读取完毕!");
​}}).sheet().doRead();}

DemoData

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {private Integer id;private String name;private Integer age;private Date birthday;
}

方式二

 @Testvoid test2 () {String fileName = "/Users/whitecamellia/Desktop/test/用户信息表1.xlsx";ExcelReader excelReader = EasyExcel.read(fileName, User.class, new AnalysisEventListener<User>() {
​@Overridepublic void invoke(User user, AnalysisContext analysisContext) {// 每读一行 执行一次 ,可以在这里执行db操作,这里读取时尽量不要在User上加indexSystem.out.println("读取到的数据是:" + user);}
​@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {// 读完数据 最后做一次System.out.println("全部读取完毕!");}}).build();
​ReadSheet readSheet = EasyExcel.readSheet(0).build();excelReader.read(readSheet);//关闭流资源,在读取文件时,会创建临时文件,如果不关闭,磁盘会挂掉。excelReader.finish();}

通过名称读取列

通过名称或者下标读取列

image-20230423192702864

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {@ExcelProperty(value = "年龄")private Integer age;@ExcelProperty(value = "生日")private Date birthday;@ExcelProperty(value = "序号")private Integer id;@ExcelProperty(value = "姓名")private String name;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {@ExcelProperty(index = 2)private Integer age;@ExcelProperty(index = 3)private Date birthday;@ExcelProperty(index = 0)private Integer id;@ExcelProperty(index = 1)private String name;
}

数据格式化

image-20230423195046998

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {@ExcelProperty(index = 2)private Integer age;@ExcelProperty(index = 3)@DateTimeFormat("yyyy年MM月dd日  HH:mm:ss")private Date birthday;@ExcelProperty(index = 0)private Integer id;@ExcelProperty(index = 1)private String name;@ExcelProperty(index = 4)@NumberFormat("#.##") //小数点后保留2位,注意,必须用String类型,不可以用Double类型private String salary;
}

读取全部或者多个Sheet

image-20230423225358258

image-20230423225412748

doReadAll();

sheet(0).doRead();

 @Testvoid test4 () {String fileName = "/Users/whitecamellia/Desktop/test/用户信息表1.xlsx";EasyExcel.read(fileName, User.class, new AnalysisEventListener<User>() {@Overridepublic void invoke(User user, AnalysisContext analysisContext) {// 每读一行 执行一次 ,可以在这里执行db操作,这里读取时尽量不要在User上加indexSystem.out.println("读取到的数据是:" + user);}
​@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {// 读完数据 最后做一次System.out.println("全部读取完毕!");
​}}).doReadAll();}
​
​@Testvoid test5 () {String fileName = "/Users/whitecamellia/Desktop/test/用户信息表1.xlsx";// 读取文件ExcelReader excelReader = EasyExcel.read(fileName).build();// 构建sheet0ReadSheet sheet0 = EasyExcel.readSheet(0).head(User.class).registerReadListener(new AnalysisEventListener<User>() {@Overridepublic void invoke(User user, AnalysisContext analysisContext) {System.out.println("sheet0读取到的数据是:" + user);}
​@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {System.out.println("sheet0全部读取完毕!");}}).build();
​// 构建sheet1ReadSheet sheet1 = EasyExcel.readSheet(1).head(User.class).registerReadListener(new AnalysisEventListener<User>() {@Overridepublic void invoke(User user, AnalysisContext analysisContext) {System.out.println("sheet1读取到的数据是:" + user);}
​@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {System.out.println("sheet1全部读取完毕!");}}).build();// 读取sheet0,sheet1excelReader.read(sheet0,sheet1);//关闭流资源,在读取文件时,会创建临时文件,如果不关闭,磁盘会挂掉。excelReader.finish();}

填充Excel

填充类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class FillData {private String name;private Integer age;private String clazz;private double score;private String desc;
}

简单填充

  @Testvoid test6 () {// 1.根据哪个模版进行填充String templateName = "/Users/whitecamellia/Desktop/test/template.xlsx";// 2.填充完成之后的ExcelString fullFileName = "/Users/whitecamellia/Desktop/test/fullFileName.xlsx";// 3.构建填充数据FillData fillData = new FillData("小明",20,"3年2班",85.5,"这次没考好!");// 4.进行填充EasyExcel.write(fullFileName).withTemplate(templateName).sheet().doFill(fillData);}
 

列表填充

image-20230423234350301

 @Testvoid test7 () {// 1.根据哪个模版进行填充String templateName = "/Users/whitecamellia/Desktop/test/template.xlsx";// 2.填充完成之后的ExcelString fullFileName = "/Users/whitecamellia/Desktop/test/fullFileName.xlsx";// 3.构建填充数据FillData fillData1 = new FillData("小明",20,"3年2班",85.5,"这次没考好!");FillData fillData2 = new FillData("小红",21,"3年3班",99.5,"这次还不错!");List<FillData> list = new ArrayList<>();list.add(fillData1);list.add(fillData2);// 4.进行填充EasyExcel.write(fullFileName).withTemplate(templateName).sheet(0).doFill(list);}

相关文章:

EasyExcel

概述 GitHub - alibaba/easyexcel: 快速、简洁、解决大文件内存溢出的java处理Excel工具 EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。 他能让你在不用考虑性能、内存的等因素的…...

java 探针两种模式实战

分为两种 程序运行前的agent&#xff1a;premain 程序运行中的agent&#xff1a;agentmain 在程序运行前的agent javaagent是java命令的一个参数&#xff0c;所以需要通过-javaagent 来指定一个jar包&#xff08;就是我们要做的代理包&#xff09;能够实现在主程序运行前来执行…...

uniGUI之MASK遮罩

在页面进行后台数据库操作的时候&#xff0c;不想 用户再进行 页面上的 其他操作&#xff0c;这时候就要 将页面 遮罩。例如UniDBGrid有LoadMask属性。 1]使用ScreenMask函数 2]JS调用 3]一个控件控制遮罩另一个控件(如Button遮罩UniDBGrid) //很简单&#xff0c;本例子就是告…...

DevOps云原生创建devops流水线(微服务项目上传git,打包镜像,部署k8s)

开发和运维人员的解决方案 一、中间件的部署&#xff08;Sentinel/MongoDB/MySQL&#xff09; 二、创建DevOps工程 邀请成员 三、创建流水线 四、编辑流水线 ①、拉取代码&#xff08;若失败&#xff0c;则将制定容器改为maven&#xff09; 若失败&#xff0c;则将命令改…...

【vim 学习系列文章 13.1 -- 自动命令autocmd 根据文件类型设置vim参数】

文章目录 autocmd 根据文件类型配置vim参数vim 文本类型 autocmd 根据文件类型配置vim参数 在 Vim 中&#xff0c;你可以使用 autocmd &#xff08;自动命令&#xff09;来根据文件类型自动执行特定的函数。首先&#xff0c;你需要定义这些函数&#xff0c;然后使用 autocmd 与…...

算法基础概念之数据结构

邻接表 每个点作为头节点接一条链表 链表中元素均为该头节点指向的点 优先队列 参数: ①储存元素类型 ②底层使用的存储结构(一般为vector) ③比较方式(默认小于)...

解决ES伪慢查询

一、问题现象 服务现象 服务接口的TP99性能降低 ES现象 YGC&#xff1a;耗时极其不正常, 峰值200次&#xff0c;耗时7sFULL GC&#xff1a;不正常,次数为1但是频繁&#xff0c;STW 5s慢查询&#xff1a;存在慢查询5 二 解决过程 1、去除干扰因素 从现象上看应用是由于某种…...

关于Ubuntu22.04恢复误删文件的记录

挂载在Ubuntu22.04下的固态盘有文件被误删了&#xff0c;该固态盘是ntfs格式的。 在网上找了很多教程&#xff0c;最后决定用TestDisk工具进行恢复。 现记录如下&#xff1a; Ubuntu安装testdisk sudo apt-get install testdisk运行testdisk sudo testdisk得到 我选择的是…...

Docker笔记:Docker Swarm, Consul, Gateway, Microservices 集群部署

关于 Consul 服务 Consul是Go语言写的开源的服务发现软件Consul具有服务发现、健康检查、 服务治理、微服务熔断处理等功能 Consul 部署方式1: 直接在linux 上面部署 consul 集群 1 &#xff09;下载 在各个服务器上 下载 consul 后解压并将其目录配置到环境变量中&#xff…...

浅析AI视频分析与视频管理系统EasyCVR平台及场景应用

人工智能的战略重要性导致对视频智能分析的需求不断增加。鉴于人工智能视觉技术的巨大潜力&#xff0c;人们的注意力正在从传统的视频监控转移到计算机视觉的监控过程自动化。 1、什么是视频分析&#xff1f; 视频分析或视频识别技术&#xff0c;是指从视频片段中提取有用信息…...

跨站点分布式多活存储建设方案概述

1-伴随着私有云、海量非结构数据的爆炸性增长&#xff0c;软件定义存储已经成为用户构建“敏捷IT” 架构的数据基石&#xff0c;同时越来越多的关键业务接入“敏捷IT” 架构。在分布式软件定义存储的产品架构下&#xff0c;怎样既保证对爆炸数据量的平稳承接&#xff0c;又能对…...

Github 2023-12-16开源项目日报Top10

根据Github Trendings的统计&#xff0c;今日(2023-12-16统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目2非开发语言项目2TypeScript项目1Jupyter Notebook项目1Go项目1PHP项目1JavaScript项目1C#项目1 精…...

c++ 中多线程的相关概念与多线程类的使用

1、多线程相关概念 1.1 并发、并行、串行 并发&#xff08;Concurrent&#xff09;&#xff1a;并发是指两个或多个事件在同一时间间隔内运行。在操作系统中&#xff0c;是指一个时间段中有几个程序都处于已启动运行到运行完毕之间&#xff0c;且这几个程序都是在同一个处理机…...

深入理解 hash 和 history:网页导航的基础(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…...

腾讯文档助力CRM集成:无代码连接电商与广告

腾讯文档API的简介与优势 腾讯文档API是一个强大的工具&#xff0c;它允许企业通过简单的无代码开发来实现与电商平台和客服系统的智能连接。这种连接不仅提高了工作效率&#xff0c;还优化了数据管理。使用腾讯文档智能表&#xff0c;商家可以享受多样的列类型、多维视图展示…...

学习使用echarts漏斗图的参数配置和应用场景

学习使用echarts漏斗图的参数配置和应用场景 前言什么是漏斗图漏斗图的特点及应用场景漏斗图的特点漏斗图常见的的应用场景&#xff1a; echarts中漏斗的常用属性echart漏斗代码美化漏斗图样式1、设置标题字体大小2、设置标签样式3、设置漏斗图为渐变颜色4、设置高亮效果5、设置…...

npm ,yarn 更换使用国内镜像源,阿里源,清华大学源

在平时开发当中&#xff0c;我们经常会使用 Npm&#xff0c;yarn 来构建 web 项目。但是npm默认的源的服务器是在国外的&#xff0c;如果没有梯子的话。会感觉特别特别慢&#xff0c;所以&#xff0c;使用国内的源是非常有必要的。 在这里插入图片描述 Nnpm&#xff0c; yarn …...

vue+react题集整理

1.Typescript中 interface 和 type 的差别是什么&#xff1f; interface只能用来描述对象类型 type可以描述任何类型组合 type后边需要有 interface后边没有 当多次使用相同名称定义一个 interface 时&#xff0c;它们会自动合并为一个接口。同名属性的不能进行类型覆盖修改&am…...

线程池ThreadPoolExecutor详解

线程池ThreadPoolExecutor详解 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;让我们深入研究Java中线程池的强大工具——ThreadPoolExecutor&#xff0c;解析它的工作原理、配置参数…...

elasticsearch|大数据|kibana的安装(https+密码)

前言&#xff1a; kibana是比较好安装的&#xff0c;但https密码就比较麻烦一些了&#xff0c;下面将就如何安装一个可在生产使用的kibana做一个简单的讲述 一&#xff0c; kibana版本和下载地址 这里我想还是强调一下&#xff0c;kibana的版本需要和elasticsearch的版本一…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会

在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...

华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)

题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...

Axure 下拉框联动

实现选省、选完省之后选对应省份下的市区...

Spring Boot + MyBatis 集成支付宝支付流程

Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例&#xff08;电脑网站支付&#xff09; 1. 添加依赖 <!…...