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 地址:Dhatim FastExcel Dhatim FastExcel是一个高性能、轻量级的Java库,专门用于读取和写入Exce…...
精读 84页华为BLM战略规划方法论
这篇文档主要介绍了华为的BLM战略规划方法论,该方法论旨在帮助企业制定战略规划,并确保战略规划的可执行性和有效性。以下是该文档的核心知识点和重点需要关注的内容: 战略规划的定义:战略规划是企业依据企业外部环境和企业自身的…...
如何评估并持续优化AI呼入机器人的使用效果
如何评估并持续优化AI呼入机器人的使用效果 作者:开源呼叫中心FreeIPCC 随着人工智能技术的快速发展,AI呼入机器人在客户服务、技术支持等多个领域得到了广泛应用。这些智能系统不仅提高了工作效率,降低了运营成本,还显著改善了…...
基于.NetCore 的 AI 识别系统的设计与实现
目录 项目背景与概述 技术架构与选型 后端技术 前端技术 系统功能模块 登录注册 数据大屏 练题系统 AI模块 工具箱 个人中心 项目背景与概述 在当今数字化快速发展的时代,人工智能(AI)技术正逐渐渗透到各个领域,展现出…...
java list 和数组互相转换的一些方法
在Java中,List 和 数组(Array) 之间的转换是一个常见的操作。由于它们是不同的数据结构,Java提供了一些方法来在它们之间进行转换。我们会从List到数组和数组到List两种情况分别讨论。 1. List 转 数组 假设你有一个 List 类型的…...
【WiFi】WiFi6 5G 802.11ax 最大速率对应表
5GHz 频段 1x1 MIMO 速率 20MHz 信道宽度 MCS 0: 8.6 MbpsMCS 1: 17.2 MbpsMCS 2: 25.8 MbpsMCS 3: 34.4 MbpsMCS 4: 51.6 MbpsMCS 5: 68.8 MbpsMCS 6: 77.4 MbpsMCS 7: 86.0 MbpsMCS 8: 103.2 MbpsMCS 9: 114.7 MbpsMCS 10: 129.0 MbpsMCS 11: 143.4 Mbps 40MHz 信道宽度 …...
智能座舱进阶-应用框架层-Handler分析
首先明确, handler是为了解决单进程内的线程之间的通信问题的。我也需要理解Android系统中进程和线程的概念, APP启动后,会有三四个线程启动起来,其中,有一条mainUITread的线程,专门用来处理UI事件…...
颜色空间之RGB和HSV互转
参考文档: https://blog.csdn.net/shandianfengfan/article/details/120600453 定点化实现: #define FRAC_BIT 10 // 小数精度 #define MIN3(x,y,z)int min3(int a, int b, int c) {int ret_val a < b ? (a < c ? a : c) : (b < c ? b :…...
程序员之路:编程语言面向过程的特征
以下是面向过程编程语言所具有的一些典型特征: 一、以过程(函数、子程序)为核心组织代码 强调函数的作用: 在面向过程编程中,函数(或子程序等不同语言中的类似概念)是代码组织的关键单元。程序…...
matlab的一些时间函数【转】
看到就记下来,感觉挺好玩的。 原文:MATLAB-一些时间函数 - 简书 (jianshu.com) 注明出处了,原文是公开的,应该不算侵权。若有侵权请告知删除谢谢。...
OpenGL —— 2.6.1、绘制一个正方体并贴图渲染颜色(附源码,glfw+glad)
源码效果 C++源码 纹理图片 需下载stb_image.h这个解码图片的库,该库只有一个头文件。 具体代码: vertexShader.glsl #version...
【ETCD】【源码阅读】深入解析 EtcdServer.applyEntries方法
applyEntries方法的主要作用是接收待应用的 Raft 日志条目,并按顺序将其应用到系统中;确保条目的索引连续,避免丢失或重复应用条目。 一、函数完整代码 func (s *EtcdServer) applyEntries(ep *etcdProgress, apply *apply) {if len(apply.…...
【数据分析】数据分析流程优化:从数据采集到可视化的全面指南
目录 引言一、数据采集:高质量数据的起点1.1 数据采集的目标1.2 数据采集的常用方法1.3 数据采集的注意事项 二、数据清洗:确保数据质量2.1 数据清洗的重要性2.2 常见的数据清洗步骤 三、数据分析:从数据中挖掘有价值的洞察3.1 数据分析的目的…...
【华为OD-E卷-字符串重新排序 字符串重新排列 100分(python、java、c++、js、c)】
【华为OD-E卷-字符串重新排序 字符串重新排列 100分(python、java、c、js、c)】 题目 给定一个字符串s,s包括以空格分隔的若干个单词,请对s进行如下处理后输出: 1、单词内部调整:对每个单词字母重新按字典…...
Mybatis二级缓存
一、二级缓存的概念 MyBatis 的二级缓存是基于命名空间(namespace)的缓存,它可以被多个 SqlSession 共享。当开启二级缓存后,在一个 SqlSession 中执行的查询结果会被缓存起来,其他 SqlSession 在查询相同的语句&…...
C语言中的宏定义:无参宏与带参宏的详细解析
C语言中的宏定义:无参宏与带参宏的详细解析 在C语言中,宏定义是一种非常强大的预处理功能,通过#define指令可以定义一些常量或者代码片段,用来减少代码重复,提高可读性。本文将详细讲解无参宏与带参宏的使用方法&…...
unity 最小后监听键盘输入
当Untiy最小化后,游戏窗口不会立刻失去焦点,此时依然可以使用Input来获取按键,但是点击其他窗口后,就会失去焦点,此时系统会把按键输入分配到其他窗口里,此时要用windowsAPI获取按键输入,应对两…...
python使用Flask框架创建一个简单的动态日历
0. 运行效果 运行代码,然后在浏览器中访问 http://127.0.0.1:5000/,将看到一个动态日历,能够通过点击按钮切换月份。 1. 安装 Flask 首先,确保你已经安装了Flask。如果没有,可以使用以下命令安装: pip i…...
力扣438-找到字符串中所有字母异位词
力扣438-找到字符串中所有字母异位词 力扣438-找到字符串中所有字母异位词原题地址:https://leetcode.cn/problems/find-all-anagrams-in-a-string/description/ 题目描述: 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词的子串&#x…...
七、网络安全-企业数据脱敏
文章目录 前言一、数据脱敏方法二、企业脱敏方案1. 数据库脱敏方案2. 历史数据脱敏3. 具体实现 三、日志脱敏方案四、输出脱敏 前言 数据脱敏 随着用户对个人隐私数据的重视和法律法规的完善,数据安全显得愈发重要。一方面可以加强权限管理,减少能够接…...
电子应用设计方案-62:智能鞋柜系统方案设计
智能鞋柜系统方案设计 一、引言 随着人们生活水平的提高,对家居用品的智能化需求也日益增加。智能鞋柜作为一种创新的家居产品,能够有效地解决鞋子的收纳、消毒、除臭和保养等问题,为用户提供更加便捷和健康的生活体验。 二、系统概述 1. 系…...
C++ 引用的基本用法
通过使用引用,可以创建该对象的另一个名字,而不会引入额外的内存开销。引用在函数参数传递、返回值以及避免拷贝大型对象时特别有用。 引用的基本用法 创建引用: 引用必须在创建时被初始化,且一旦被绑定到一个对象后࿰…...
全面解析 Golang Gin 框架
1. 引言 在现代 Web 开发中,随着需求日益增加,开发者需要选择合适的工具来高效地构建应用程序。对于 Go 语言(Golang)开发者来说,Gin 是一个备受青睐的 Web 框架。它轻量、性能高、易于使用,并且具备丰富的…...
element plus的table组件,点击table的数据是,会出现一个黑色边框
在使用 Element Plus 的 Table 组件时,如果你点击表格数据后出现了一个黑色边框,这通常是因为浏览器默认的焦点样式(outline)被触发了。如图: 你可以通过自定义 CSS 来隐藏这个黑色边框,代码如下࿱…...
三种国产大语言模型Python免费调用
基础三大模型,需要先去官方注册获得key;后续可以使用下列代码调用 1.腾讯 安装: pip install -i https://mirrors.tencent.com/pypi/simple/ --upgrade tencentcloud-sdk-python 实例: import jsonimport typesfrom tencentcl…...
Ansible playbook 详解与实战操作
一、概述 playbook 与 ad-hoc 相比,是一种完全不同的运用 ansible 的方式,类似与 saltstack 的 state 状态文件。ad-hoc 无法持久使用,playbook 可以持久使用。 playbook 是由一个或多个 play 组成的列表,play 的主要功能在于将事先归并为一…...
linux普通用户使用sudo不需要输密码
1.root用户如果没有密码,先给root用户设置密码 sudo passwd root #设置密码 2.修改visudo配置 su #切换到root用户下 sudo visudo #修改visudo配置文件 用户名 ALL(ALL) NOPASSWD: ALL #下图所示处新增一行配置 用户名需要输入自己当前主机的用户名...
linux-----数据库
Linux下数据库概述 数据库类型: 关系型数据库(RDBMS):如MySQL、PostgreSQL、Oracle等。这些数据库以表格的形式存储数据,表格之间通过关系(如主键 - 外键关系)相互关联。关系型数据库支持复杂的…...
【Linux进程】进程间的通信
目录 1. 进程间通信 1.1 进程间通信的目的 2. 管道 2.1 什么是管道 2.2. 匿名管道 匿名管道的特性 管道的4种情况 联系shell中的管道 2.3. 命名管道 代码级建立命名管道 2.4. 小结 总结 1. 进程间通信 进程间通信(Inter-Process Communication,IPC&…...
面试题整理4----lvs,nginx,haproxy区别和使用场景
LVS、Nginx、HAProxy:区别与使用场景 1. LVS(Linux Virtual Server)1.1 介绍1.2 特点1.3 使用场景 2. Nginx2.1 介绍2.2 特点2.3 使用场景 3. HAProxy3.1 介绍3.2 特点3.3 使用场景 4. 总结对比 在构建高可用、高性能的网络服务时,…...
开放词汇目标检测(Open-Vocabulary Object Detection, OVOD)综述
定义 开放词汇目标检测(Open-Vocabulary Object Detection, OVOD)是一种目标检测任务,旨在检测和识别那些未在训练集中明确标注的物体类别。传统的目标检测模型通常只能识别有限数量的预定义类别,而OVOD模型则具有识别“开放词汇…...
Python读写JSON文件
import jsondef writeJSONFile(self):with open(g_updateFilePath, "w" encodingutf-8) as fiel:json.dump(dictData, fiel, indent4, ensure_asciiFalse)fiel.close()def readJsonToDict(file):with open(file, r, encodingutf-8) as f: # 确保文件以 UTF-8 编码打…...
使用Python开发高级游戏:创建一个3D射击游戏
在这篇文章中,我们将深入介绍如何使用Python开发一个简单的3D射击游戏。我们将使用Pygame库来创建2D游戏界面,并结合PyOpenGL来进行3D渲染。这个项目的目标是帮助你理解如何将2D和3D图形结合起来,创建更复杂的游戏机制,包括玩家控制、敌人AI、碰撞检测和声音效果。 一、开…...
springboot 配置Kafka 关闭自启动连接
这里写自定义目录标题 springboot 配置Kafka 关闭自启动连接方法一:使用 ConditionalOnProperty方法二:手动管理Kafka监听器容器方法三:使用 autoStartupfalse结语 springboot 配置Kafka 关闭自启动连接 在Spring Boot应用程序中,…...
Jenkins中添加节点实战
Jenkins是一个开源的自动化服务器,用于持续集成和持续交付(CI/CD)。为了提高构建和测试的效率,我们可以在Jenkins中添加节点(也称为代理或从属节点)。本文将详细介绍如何在Jenkins中添加节点,包括安装Java 11、Git、设置凭证、多种配置Jenkins Agent的方法以及验证。 …...
DL作业11 LSTM
习题6-4 推导LSTM网络中参数的梯度, 并分析其避免梯度消失的效果 LSTM(长短期记忆网络)是一种特殊的循环神经网络(RNN),旨在解决普通 RNN 在处理长序列时遇到的梯度消失和梯度爆炸问题。它通过设计多个门…...
用 Python 实现井字棋游戏
一、引言 井字棋(Tic-Tac-Toe)是一款经典的两人棋类游戏。在这个游戏中,玩家轮流在 3x3 的棋盘上放置自己的标记,通常是 “X” 和 “O”,第一个在棋盘上连成一线(横、竖或斜)的玩家即为获胜者。…...
构建MacOS应用小白教程(打包 签名 公证 上架)
打包 在package.json中,dependencies会被打进 Electron 应用的包里,而devDependencies则不会,所以必要的依赖需要放到dependencies中。files中定义自己需要被打进 Electron 包里的文件。以下是一个完整的 mac electron-builder的配置文件。 …...
如何高效使用 Facebook Business Manager (商务管理平台)
在数字营销的浪潮中,Facebook Business Manager(商务管理平台)已成为众多企业管理社交广告活动、品牌资产和团队协作的核心工具。无论你是刚刚进入社交广告领域的小型企业主,还是经验丰富的大型品牌经理,掌握 Facebook…...
每天学习一个思维模型 - 损失规避
定义 损失规避(Loss aversion),又称损失厌恶,指人们面对同样数量的利益和损失时,认为损失更加令他们难以忍受。损失带来的负效用为收益正效用的2至2.5倍。损失厌恶反映了人们的风险偏好并不是一致的,当涉及…...
Python知识分享第三十一天-Numpy和Pnadas入门
NumPy Numpy介绍 Numpy是Python中科学计算的基础包,它是一个Python库提供多维数组对象 各种派生对象(如掩码数组和矩阵),以及用于对数组进行快速的各种例程,包括数学 ,逻辑, 形状操作,排序,选择,I/O,离散傅里叶变换,基本线性代数,基本统计运算,随机模拟等等(Numpy的核心是nda…...
mlr3超参数Hyperparameter 自动寻找auto
底层还是根据你本来在R跑单独那一个机器学习的函数,例如randomForest::randomForest(),里面可以填入什么,然后跟你的实际数据取值范围去设个范围。然后用auto_tuner()函数对学习器的超参数自动调参 随机森林randomforest learner_rf <- …...
双臂机器人
目录 一、双臂机器人简介 二、双臂机器人系统的组成 三、双臂机器人面临的主要挑战 3.1 协调与协同控制问题 3.2 力控制与柔顺性问题 3.3 路径规划与轨迹优化问题 3.4 感知与环境交互 3.5 人机协作问题 3.6 能源与效率问题 3.7 稳定性与可靠性问题 四、双臂机器人…...
MATLAB中cvx工具箱的使用
CVX 是 MATLAB 中一个用于解决凸优化问题的建模工具箱。它使得定义、求解和分析凸优化问题变得简单。CVX 允许用户用类似数学表达的方式编写凸优化问题,而不需要过多关注底层的优化算法。CVX 的核心功能是将一个简单的数学问题转化为 MATLAB 可以理解并求解的标准形…...
EGO Swarm翻译
目录 摘要 Ⅰ 介绍 Ⅱ 相关工作 A . 单四旋翼局部规划 B . 拓扑规划 C. 分布式无人机集群 Ⅲ 基于梯度的局部规划隐式拓扑轨迹生成 A.无需ESDF梯度的局部路径规划 B.隐式拓扑轨迹生成 Ⅳ 无人机集群导航 A 机间避碰 B. 定位漂移补偿 C. 从深度图像中去除agent Ⅴ …...
Webpack简单介绍及安装
一、介绍 Webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。它将应用程序中的所有依赖项(JavaScript、图片、CSS 等)打包成一个或多个 bundle。这样做的主要目的是减少加载时间和提高应用程序的加载性能…...
如何在Anaconda的虚拟环境中下载Python包
一、首先查看conda下的虚拟环境 使用conda info -e查看当前conda下的虚拟环境: conda info -e 二、激活要添加Python包的虚拟环境 其中base是基础环境,这里我们选择conda_env这个虚拟环境 conda activate conda_env 三、使用conda命令安装需要的Pyth…...
React 事件机制和原生 DOM 事件流有什么区别
发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【宝藏入口】。 React 的事件机制与原生 DOM 事件流在设计和实现上有一些显著的区别。了解这些区别有助于我们更好地理解 React 是如何管理事件的…...
React 底部加载组件(基于antd)
底部加载组件的意义在于提供一种流畅的用户体验,以便在用户滚动到页面底部时自动加载更多内容。这样可以让用户无需离开当前页面,就能够无缝地浏览更多的内容.通过底部加载组件,可以分批加载页面内容,减少一次性加载大量数据对页面…...
Redis应用—7.大Value处理方案
1.⽅案设计 步骤一:首先需要配置一个crontab定时调度shell脚本,然后该脚本每天凌晨会通过rdbtools⼯具解析Redis的RDB⽂件,接着对解析出的内容进行过滤,把RDB⽂件中的⼤key导出到CSV⽂件。 步骤二:使⽤SQL导⼊CSV⽂件到…...