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

Spring Boot中Excel处理完全指南

文章目录

    • 1. Excel处理基础知识
      • 1.1 为什么需要在应用中处理Excel文件?
      • 1.2 Java中的Excel处理库介绍
        • 1.2.1 Apache POI
        • 1.2.2 EasyExcel
        • 1.2.3 JExcel
        • 1.2.4 Apache POI SXSSF
      • 1.3 Spring Boot中集成Excel处理
    • 2. 在Spring Boot中集成Excel处理库
      • 2.1 集成Apache POI
        • 2.1.1 添加依赖
        • 2.1.2 创建基本配置类
      • 2.2 集成EasyExcel
        • 2.2.1 添加依赖
        • 2.2.2 创建配置类
    • 3. 使用Apache POI读取Excel文件
      • 3.1 创建数据模型
      • 3.2 创建Excel读取服务
      • 3.3 创建Controller处理Excel上传
      • 3.4 创建HTML上传页面
      • 3.5 处理更复杂的Excel结构
    • 4. 使用Apache POI创建和导出Excel文件
      • 4.1 创建基本Excel文件
      • 4.2 创建导出控制器
      • 4.3 创建导出页面
      • 4.4 创建复杂的Excel文件
      • 4.5 使用模板导出Excel
    • 5. 使用EasyExcel处理Excel文件
      • 5.1 使用EasyExcel读取Excel
        • 5.1.1 创建数据模型
        • 5.1.2 创建读取监听器
        • 5.1.3 创建Excel读取服务
        • 5.1.4 创建Controller
      • 5.2 使用EasyExcel导出Excel
        • 5.2.1 简单导出示例
        • 5.2.2 创建Controller
    • 6. 处理大型Excel文件的策略
      • 6.1 使用Apache POI SXSSF模式
      • 6.2 使用EasyExcel处理大文件
      • 6.3 使用CSV代替Excel
      • 6.4 分页导出大型数据集
    • 7. 实际应用场景和最佳实践
      • 7.1 动态列导出
      • 7.2 Excel模板填充
      • 7.3 Excel文件校验
      • 7.4 统一异常处理
    • 8. 性能优化和注意事项
      • 8.1 性能优化建议
      • 8.2 注意事项
    • 9. 总结

1. Excel处理基础知识

1.1 为什么需要在应用中处理Excel文件?

在企业应用开发中,Excel文件处理是一个非常常见的需求,主要用于以下场景:

  • 数据导入:允许用户通过Excel上传批量数据到系统
  • 数据导出:将系统数据导出为Excel供用户下载分析
  • 报表生成:生成复杂的报表并格式化为Excel
  • 数据交换:作为不同系统间交换数据的媒介
  • 批量数据处理:处理大量结构化数据

1.2 Java中的Excel处理库介绍

Java中处理Excel文件的主要库有以下几种:

1.2.1 Apache POI

Apache POI是Java中使用最广泛的Excel处理库,提供了全面的API来创建、读取和修改Office文档。

优点

  • 功能全面,支持Excel所有功能
  • 支持.xls (HSSF - Excel 97-2003)和.xlsx (XSSF - Excel 2007+)格式
  • 社区活跃,文档丰富
  • 支持公式计算、图表、合并单元格等高级功能

缺点

  • API相对复杂
  • 处理大文件时内存消耗大(尤其是XSSF)
1.2.2 EasyExcel

EasyExcel是阿里巴巴开源的Excel处理库,基于POI,但做了大量优化。

优点

  • 内存占用低,使用SAX模式读取,避免OOM
  • API简单易用,注解驱动
  • 读写速度快
  • 适合处理大型Excel文件

缺点

  • 功能不如POI全面
  • 灵活性相对较低
1.2.3 JExcel

JExcel是另一个处理Excel的Java库。

优点

  • API较简单
  • 速度较快

缺点

  • 仅支持旧版Excel (.xls)格式
  • 不再积极维护
  • 功能有限
1.2.4 Apache POI SXSSF

SXSSF是POI提供的一种流式处理模式,专为处理大型Excel文件设计。

优点

  • 大大降低内存占用
  • 适合生成大型Excel文件

缺点

  • 仅支持写入操作,不支持读取
  • 功能比XSSF受限

1.3 Spring Boot中集成Excel处理

Spring Boot本身不提供Excel处理功能,但可以轻松集成上述各种Excel处理库。本指南将主要介绍:

  1. 如何在Spring Boot项目中集成Apache POI和EasyExcel
  2. 如何实现Excel导入导出的常见功能
  3. 如何处理常见问题和优化性能

2. 在Spring Boot中集成Excel处理库

2.1 集成Apache POI

2.1.1 添加依赖

pom.xml文件中添加以下依赖:

<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.3</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version>
</dependency>

如果使用Gradle,在build.gradle中添加:

implementation 'org.apache.poi:poi:5.2.3'
implementation 'org.apache.poi:poi-ooxml:5.2.3'
2.1.2 创建基本配置类

创建一个配置类来处理Excel相关的配置:

package com.example.excel.config;import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;@Configuration
public class ExcelConfig {@Beanpublic MultipartResolver multipartResolver() {CommonsMultipartResolver resolver = new CommonsMultipartResolver();resolver.setMaxUploadSize(10485760); // 设置上传文件最大为10MBreturn resolver;}
}

2.2 集成EasyExcel

2.2.1 添加依赖

pom.xml文件中添加以下依赖:

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.2.1</version>
</dependency>

如果使用Gradle,在build.gradle中添加:

implementation 'com.alibaba:easyexcel:3.2.1'
2.2.2 创建配置类
package com.example.excel.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;@Configuration
public class EasyExcelConfig {@Beanpublic MultipartResolver multipartResolver() {CommonsMultipartResolver resolver = new CommonsMultipartResolver();resolver.setMaxUploadSize(10485760); // 设置上传文件最大为10MBreturn resolver;}
}

3. 使用Apache POI读取Excel文件

3.1 创建数据模型

首先,创建一个模型类来映射Excel中的数据:

package com.example.excel.model;import lombok.Data;@Data
public class User {private Long id;private String name;private Integer age;private String email;private String department;
}

3.2 创建Excel读取服务

创建一个服务类来处理Excel文件读取:

package com.example.excel.service;import com.example.excel.model.User;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;@Service
public class ExcelService {public List<User> readUsersFromExcel(MultipartFile file) throws IOException {List<User> userList = new ArrayList<>();// 获取工作簿try (InputStream inputStream = file.getInputStream()) {Workbook workbook = WorkbookFactory.create(inputStream);// 获取第一个工作表Sheet sheet = workbook.getSheetAt(0);// 跳过标题行Iterator<Row> rowIterator = sheet.rowIterator();if (rowIterator.hasNext()) {rowIterator.next(); // 跳过标题行}// 遍历数据行while (rowIterator.hasNext()) {Row row = rowIterator.next();User user = new User();// 读取单元格数据user.setId((long) row.getCell(0, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK).getNumericCellValue());user.setName(getCellValueAsString(row.getCell(1)));user.setAge((int) row.getCell(2, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK).getNumericCellValue());user.setEmail(getCellValueAsString(row.getCell(3)));user.setDepartment(getCellValueAsString(row.getCell(4)));userList.add(user);}workbook.close();}return userList;}// 获取单元格的字符串值private String getCellValueAsString(Cell cell) {if (cell == null) {return "";}switch (cell.getCellType()) {case STRING:return cell.getStringCellValue();case NUMERIC:if (DateUtil.isCellDateFormatted(cell)) {return cell.getDateCellValue().toString();} else {return String.valueOf((int) cell.getNumericCellValue());}case BOOLEAN:return String.valueOf(cell.getBooleanCellValue());case FORMULA:return cell.getCellFormula();default:return "";}}
}

3.3 创建Controller处理Excel上传

创建一个Controller来处理Excel文件上传:

package com.example.excel.controller;import com.example.excel.model.User;
import com.example.excel.service.ExcelService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.util.List;@RestController
@RequestMapping("/api/excel")
public class ExcelController {@Autowiredprivate ExcelService excelService;@PostMapping("/upload")public ResponseEntity<List<User>> uploadExcel(@RequestParam("file") MultipartFile file) {try {List<User> users = excelService.readUsersFromExcel(file);return ResponseEntity.ok(users);} catch (IOException e) {e.printStackTrace();return ResponseEntity.badRequest().build();}}
}

3.4 创建HTML上传页面

src/main/resources/templates目录下创建upload.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>Excel上传</title><link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
</head>
<body><div class="container mt-5"><div class="card"><div class="card-header"><h3>上传Excel文件</h3></div><div class="card-body"><form id="uploadForm" enctype="multipart/form-data"><div class="form-group"><label for="file">选择Excel文件:</label><input type="file" class="form-control-file" id="file" name="file" accept=".xls,.xlsx"></div><button type="button" class="btn btn-primary" onclick="uploadExcel()">上传</button></form><div class="mt-4"><h4>上传结果:</h4><div id="resultContainer"></div></div></div></div></div><script src="https://code.jquery.com/jquery-3.5.1.min.js"></script><script>function uploadExcel() {var formData = new FormData(document.getElementById('uploadForm'));$.ajax({url: '/api/excel/upload',type: 'POST',data: formData,processData: false,contentType: false,success: function(response) {var resultHtml = '<table class="table table-striped">' +'<thead><tr><th>ID</th><th>姓名</th><th>年龄</th><th>邮箱</th><th>部门</th></tr></thead>' +'<tbody>';for (var i = 0; i < response.length; i++) {var user = response[i];resultHtml += '<tr>' +'<td>' + user.id + '</td>' +'<td>' + user.name + '</td>' +'<td>' + user.age + '</td>' +'<td>' + user.email + '</td>' +'<td>' + user.department + '</td>' +'</tr>';}resultHtml += '</tbody></table>';$('#resultContainer').html(resultHtml);},error: function(error) {$('#resultContainer').html('<div class="alert alert-danger">上传失败: ' + error.responseText + '</div>');}});}</script>
</body>
</html>

3.5 处理更复杂的Excel结构

在实际应用中,Excel结构可能更复杂,如多个工作表、合并单元格、公式等。以下是处理这些情况的示例:

public List<Department> readComplexExcel(MultipartFile file) throws IOException {List<Department> departments = new ArrayList<>();try (InputStream inputStream = file.getInputStream()) {Workbook workbook = WorkbookFactory.create(inputStream);// 读取部门信息(第一个工作表)Sheet departmentSheet = workbook.getSheetAt(0);for (int i = 1; i <= departmentSheet.getLastRowNum(); i++) {Row row = departmentSheet.getRow(i);if (row == null) continue;Department department = new Department();department.setId((long) row.getCell(0).getNumericCellValue());department.setName(row.getCell(1).getStringCellValue());department.setManager(row.getCell(2).getStringCellValue());department.setEmployees(new ArrayList<>());departments.add(department);}// 读取员工信息(第二个工作表)Sheet employeeSheet = workbook.getSheetAt(1);for (int i = 1; i <= employeeSheet.getLastRowNum(); i++) {Row row = employeeSheet.getRow(i);if (row == null) continue;User employee = new User();employee.setId((long) row.getCell(0).getNumericCellValue());employee.setName(row.getCell(1).getStringCellValue());employee.setAge((int) row.getCell(2).getNumericCellValue());employee.setEmail(row.getCell(3).getStringCellValue());// 获取部门ID并关联到相应部门long departmentId = (long) row.getCell(4).getNumericCellValue();for (Department dept : departments) {if (dept.getId() == departmentId) {dept.getEmployees().add(employee);break;}}}workbook.close();}return departments;
}

4. 使用Apache POI创建和导出Excel文件

4.1 创建基本Excel文件

以下是一个创建简单Excel文件的示例:

package com.example.excel.service;import com.example.excel.model.User;
import org.apache.poi.ss.usermodel.*

相关文章:

Spring Boot中Excel处理完全指南

文章目录 1. Excel处理基础知识1.1 为什么需要在应用中处理Excel文件?1.2 Java中的Excel处理库介绍1.2.1 Apache POI1.2.2 EasyExcel1.2.3 JExcel1.2.4 Apache POI SXSSF1.3 Spring Boot中集成Excel处理2. 在Spring Boot中集成Excel处理库2.1 集成Apache POI2.1.1 添加依赖2.1…...

洛谷P1312 [NOIP 2011 提高组] Mayan 游戏

题目 #算法/进阶搜索 思路: 根据题意,我们可以知道,这题只能枚举,剪枝,因此,我们考虑如何枚举,剪枝. 首先,我们要定义下降函数down(),使得小木块右移时,能够下降到最低处,其次,我们还需要写出判断函数,判断矩阵内是否有小木块没被消除.另外,我们还需要消除函数,将矩阵内三个相连…...

c++ (异常)

1.异常的概念及使用 1.1异常的概念 异常处理机制允许程序中独立开发的部分能够在运行时就出现的问题进行通信并做出相应的处理&#xff0c; 异常使得我们能够将问题的检测与解决问题的过程分开&#xff0c;程序的一部分负责检测问题的出现&#xff0c;然后 解决问题的任务传…...

MySQL如何实现行行比较

概述 在MySQL中实现行行比较通常涉及比较同一表或不同表中不同行的数据。以下是几种常见的方法及示例&#xff1a; 1. 自连接&#xff08;Self-Join&#xff09; 通过将表与自身连接&#xff0c;比较不同行的数据。 场景示例&#xff1a;比较同一用户相邻订单的金额差异。 …...

springboot2.X创建maven多模块工程

因为需要&#xff0c;所以付出。 好长时间没有搭建新的框架了&#xff0c;最近在搭建微服务的多模块maven工程&#xff0c;现在就将创建的过程记录下来&#xff0c;方便自学的小伙伴找寻资料&#xff0c;少走弯路。好了下面直接开干。 开发工具 &#xff1a;idea 、springboo…...

八股文---Redis(1)

目录 1.Redis-使用场景 1.我看你做的项目中&#xff0c;都用到了redis&#xff0c;你在最近的项目中哪些场景使用了redis呢&#xff1f; 2.缓存三兄弟可以我看我另一个文章&#xff08;穿透&#xff0c;雪崩&#xff0c;击穿&#xff09; 3.redis做为缓存&#xff0c;mysql…...

QT聊天项目DAY06

1.从git上同步项目 编译测试&#xff0c;编译通过 Post请求测试 测试成功 2. email is 打印有问题&#xff0c;检查 解析结果是存储在jsonResult中的&#xff0c;修改 3. 客户端实现Post验证码请求 3.1 同步Qt客户端项目 检查QT版本&#xff0c;由于我在公司用的还是QT5.12.9…...

python(八)-数据类型转换

#数据类型转换 #转换为整型int #字符串str--》整数int #纯数字的字符串可以转换&#xff0c;否则会报错 s 2025 n int(s) print(type(s),type(n)) print(n)#浮点数float--》整数int s1 2.23 print(int(s1))#bool-->整数int s2,s3 True,False print(int(s2),int(s3))#转…...

JavaScript 变量命名规范

在编写JavaScript代码时&#xff0c;遵循良好的变量命名规范对于提高代码的可读性、可维护性和协作效率至关重要。一个清晰且一致的命名习惯不仅有助于开发者自己理解代码&#xff0c;也能让其他团队成员更容易上手和维护项目。本文将详细介绍JavaScript中常见的变量命名规则和…...

2025年渗透测试面试题总结-拷打题库05(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 2025年渗透测试面试题总结-拷打题库05 1. 病毒和蠕虫的区别 2. DNS欺骗&#xff08;DNS Spoofing&…...

【排队论】Probabilistic Forecasts of Bike-Sharing Systems for Journey Planning

Probabilistic Forecasts of Bike-Sharing Systems forJourney Planning abstract 我们研究了对共享单车系统&#xff08;BSS&#xff09;车站未来自行车可用性进行预测的问题。这是相关的&#xff0c;以便提出建议&#xff0c;保证用户能够进行旅行的概率足够高。为此&#x…...

Redis 的持久化机制(RDB, AOF)对微服务的数据一致性和恢复性有何影响?如何选择?

Redis 的持久化机制&#xff08;RDB 和 AOF&#xff09;对于保证 Redis 服务重启或崩溃后数据的恢复至关重要&#xff0c;这直接影响到依赖 Redis 的微服务的数据一致性和恢复能力。 1. RDB (Redis Database Backup) 机制: 在指定的时间间隔内&#xff0c;将 Redis 在内存中的…...

手撕LLM(四):从源码出发,探索大模型的预训练(pretrain)过程

前面我们基于Minimind项目介绍了大模型的推理、LoRa加载、Moe结构&#xff0c; 大家对大模型的整体结构应该有一个比较清晰的认识&#xff1b;从该篇博客开始&#xff0c;我们通过代码剖析大模型的训练过程&#xff0c;今天的主题是大模型的预训练。 那大模型的预训练是一个什么…...

Linux系统:进程终止的概念与相关接口函数(_exit,exit,atexit)

本节目标 理解进程终止的概念理解退出状态码的概念以及使用方法掌握_exit与exit函数的用法以及区别atexit函数注册终止时执行的函数相关宏 一、进程终止 进程终止&#xff08;Process Termination&#xff09;是指操作系统结束一个进程的执行&#xff0c;回收其占用的资源&a…...

keil5 µVision 升级为V5.40.0.0:增加了对STM32CubeMX作为全局生成器的支持,主要有哪些好处?

在Keil5 μVision V5.40.0.0版本中,增加了对STM32CubeMX作为全局生成器的支持,这一更新主要带来了以下三方面的提升: 开发流程整合STM32CubeMX原本就支持生成Keil项目代码,但新版本将这一集成升级为“全局生成器”级别,意味着STM32CubeMX生成的代码能直接成为Keil项目的核…...

C 语言联合与枚举:自定义类型的核心解析

上篇博客中&#xff0c;我们通过学习了解了C语言中一种自定义类型结构体的相关知识&#xff0c;那么该语言中是否还拥有相似的自定义类型呢&#xff1f;这将是我们今天学习的目标。 1.联合体 联合体其实跟结构体类似&#xff0c;也是由一个或多个成员构成&#xff0c;这些成员…...

P1113 杂务-拓扑排序

拓扑排序 P1113 杂务 题目来源-洛谷 题意 求出完成所有任务的最短时间 思路 要求完成所有任务的最短时间&#xff0c;即每个任务尽可能最短&#xff0c;所以再求完成所有任务中的最大值&#xff08;需要最长时间的任务都完成了才叫全部完成&#xff09; 问题化解&#xf…...

Flink介绍——实时计算核心论文之Kafka论文总结

引入 大数据系统中的数据来源 在开始深入探讨Kafka之前&#xff0c;我们得先搞清楚一个问题&#xff1a;大数据系统中的数据究竟是从哪里来的呢&#xff1f;其实&#xff0c;这些数据大部分都是由各种应用系统或者业务系统产生的“日志”。 比如&#xff0c;互联网公司的广告…...

模拟投资大师思维:AI对冲基金开源项目详解

这里写目录标题 引言项目概述核心功能详解多样化的AI投资智能体灵活的运行模式透明的决策过程 安装和使用教程环境要求安装步骤基本使用方法运行对冲基金模式运行回测模式 应用场景和实际价值教育和研究价值潜在的商业应用与现有解决方案的对比局限性与发展方向 结论 引言 随着…...

DAY4:数据库对象与高级查询深度解析:从视图到多表关联实战

一、数据库对象精要指南 1.1 视图&#xff08;View&#xff09;的进阶应用 视图是存储在数据库中的虚拟表&#xff0c;本质是预编译的SQL查询语句。通过视图可以简化复杂查询、实现数据安全隔离、保持业务逻辑一致性。 创建语法示例&#xff1a; CREATE VIEW sales_summary…...

【Matlab】中国东海阴影立体感地图

【Matlab】中国东海阴影立体感地图 【Matlab】中国东海阴影立体感地图 【Matlab】中国东海阴影图立体感画法 以前分享过一次&#xff0c;链接如下&#xff1a; 中国海域地形图 但是以前还是有些小问题&#xff0c;这次修改了。 另外&#xff0c;增加了新的画法&#xff1a; 另…...

python文件类操作:json/ini配置文件、logging日志统计、excel表格数据读写、os操作库

文章目录 一、with open文件操作二、csv表格数据读写三、Excel表格数据读写四、json配置文件读写五、ini配置文件读写六、logging日志统计七、os操作库&#xff08;文件拼接、创建、判断等&#xff09; 打开文件使用不同参数有着不同的含义&#xff0c;比如只读、只写、二进制读…...

VSCode安装与环境配置(Mac环境)

20250419 - 概述 大概是非常久之前了&#xff0c;装了VSCode&#xff0c;估计都得21的时候了&#xff0c;电脑上也没更新过。当时安装也直接装上就完事了。这次把版本更新一下&#xff0c;同时记录一下这个安装过程。 安装 mac下安装非常简单&#xff0c;直接从官网下载&am…...

【信息系统项目管理师】高分论文:论信息系统项目的采购管理(“营业工单系统”项目)

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文1、规划采购管理2、实施采购3、控制采购论文 2018年1月,我参加了 XX运营商集团公司某省分公司的“营业工单系统”的信息化建设项目,我有幸担任项目经理。该项目投资1000万元人民币,建设工期为12个月。该…...

XCVU13P-2FHGA2104I Xilinx Virtex UltraScale+ FPGA

XCVU13P-2FHGA2104I 是 Xilinx&#xff08;现为 AMD&#xff09;Virtex UltraScale™ FPGA 系列中的高端 Premium 器件&#xff0c;基于 16nm FinFET 工艺并采用 3D IC 堆叠硅互连&#xff08;SSI&#xff09;技术&#xff0c;提供业内顶级的计算密度和带宽​。该芯片集成约 3,…...

@Validated与@Valid的正确使用姿势

验证代码 Validated RestController public class A {PostMappingpublic void test(Min(value 1) Integer count) {} // 校验规则生效 }RestController public class A {PostMappingpublic void test(Validated Min(value 1) Integer count) {} // 校验规则不生效 }RestCont…...

Ubuntu20.04下Docker方案实现多平台SDK编译

0 前言 熟悉嵌入式平台Linux SDK编译流程的小伙伴都知道,假如平台a要求必须在Ubuntu18.04下编译,平台b要求要Ubuntu22.04的环境,那我只有Ubuntu20.04,或者说我的电脑硬件配置最高只能支持Ubuntu20.04怎么办?强行在Ubuntu20.04下编译,编又编不过,换到旧版本我又不愿意,…...

树莓派超全系列教程文档--(34)树莓派配置GPIO

配置GPIO GPIO控制gpio 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 GPIO控制 gpio 通过 gpio 指令&#xff0c;可以在启动时将 GPIO 引脚设置为特定模式和值&#xff0c;而以前需要自定义 dt-blob.bin 文件。每一行都对一组引脚应用相同的设…...

C语言 数组(下)

目录 1.二维数组的创建 2.二位数组的初始化 3.二维数组的使用 4.二维数组在内存中的储存 1.二维数组的创建 1.1二维数组的概念 前面学习的数组被称为一维数组&#xff0c;数组的元素都是内置类型的&#xff0c;如果我们把一维数组做为数组的元 素&#xff0c;这时候就是…...

opencv图像旋转(单点旋转的原理)

首先我们以最简单的一个点的旋转为例子&#xff0c;且以最简单的情况举例&#xff0c;令旋转中心为坐标系中心O&#xff08;0&#xff0c;0&#xff09;&#xff0c;假设有一点P_{0}(x_{0},y_{0})&#xff0c;P_{0}离旋转中心O的距离为r&#xff0c;OP_{0}与坐标轴x轴的夹角为\…...

针对MCP认证考试中的常见技术难题进行实战分析与解决方案分享

一、身份与权限管理类难题 场景1&#xff1a;Active Directory组策略&#xff08;GPO&#xff09;不生效 问题现象&#xff1a;客户端计算机未应用新建的组策略。排查步骤&#xff1a; 检查GPO链接顺序&#xff1a;使用gpresult /r查看策略优先级&#xff0c;确保目标OU的GPO…...

systemctl管理指令

今天我们来继续学习服务管理指令,接下来才是重头戏-systemctl,那么话不多说,直接开始吧. systemctl管理指令 1.基本语法: systemctl [start | stop | restart | status]服务 注&#xff1a;systemctl指令管理的服务在/usr/lib/ systemd/system查看 2.systemctl设置服务的自…...

DataWhale AI春训营 问题汇总

1.没用下载训练集导致出错&#xff0c;爆错如下。 这个时候需要去比赛官网下载对应的初赛训练集 unzip -d /mnt/workspace/sais_third_new_energy_baseline/data /mnt/workspace/sais_third_new_energy_baseline/初赛训练集.zip 在命令行执行这个命令解压 2.没定义测试集 te…...

当算力遇上马拉松:一场科技与肉身的极限碰撞

目录 一、从"肉身苦修"到"科技修仙" 二、马拉松的"新大陆战争" 三、肉身会被算法"优化"吗? 马拉松的下一站是"人机共生"时代 当AI能预测你的马拉松成绩,算法能规划最佳补给方案,智能装备让训练效率翻倍——你还会用传…...

n8n 中文系列教程_02. 自动化平台深度解析:核心优势与场景适配指南

在低代码与AI技术深度融合的今天&#xff0c;n8n作为开源自动化平台正成为开发者提效的新利器。本文深度剖析其四大核心技术优势——极简部署、服务集成、AI工作流与混合开发模式&#xff0c;并基于真实场景测试数据&#xff0c;厘清其在C端高并发、多媒体处理等场景的边界。 一…...

Macvlan 网络类型详解:特点、优势与局限性

一、Macvlan 网络类型的基本概念 1. 什么是 Macvlan Macvlan 是 Linux 内核提供的一种网络虚拟化技术&#xff0c;允许在单个物理接口&#xff08;例如 enp0s3&#xff09;上创建多个虚拟网络接口。每个虚拟接口拥有独立的 MAC 地址&#xff0c;表现得像物理网络中的独立设备…...

tigase源码学习杂记-AbstractMessageReceiver

前言 废话&#xff0c;最近把工作中用的基于XMPP协议的经典开源框架又读了一遍&#xff0c;整理一下其优秀的源码学习记录。 概述 AbstractMessageReceiver是tigase核心组件MessageRouter、SessionManager的抽象父类&#xff0c;是tigase消息接收器的抽象。AbstractMessageR…...

C#.net core部署IIS

Windows IIS 部署 .NET 应用详细指南 本文档提供了在 Windows Server 上使用 IIS 部署 .NET 应用&#xff08;包括 .NET Core 和传统 WebForms&#xff09;的完整步骤和最佳实践。 目录 概述环境准备.NET Core 应用部署 应用准备发布应用在 IIS 中配置应用池配置高级配置 .N…...

sql学习

Name 列中选取唯一不同的值 插入 更新 删除 筛选固定的行数 模糊查询 包含 范围 name的别名是n 两个表交集 左边包含全部 右边包含全部 重复的展示一条 重复的都会展示 创建一个新表&#xff0c;把字段复制近期 创建数据库 约束 创建索引 删除 函数 聚合函数...

OSPF实验

实验要求&#xff1a; 1.R5为ISP&#xff0c;其上只能配置IP地址&#xff1b;R4作为企业边界路由器&#xff0c; 出口公网地址需要通过PPP协议获取&#xff0c;并进行chap认证 &#xff08;上面这个不会做&#xff09; 2.整个OSPF环境IP基于172.16.0.0/16划分&#xff1b; 3.所…...

洛谷题目:P8624 [蓝桥杯 2015 省 AB] 垒骰子 题解 (本题简)

题目传送门: P8624 [蓝桥杯 2015 省 AB] 垒骰子 - 洛谷 (luogu.com.cn) 前言: 这道题要求我们计算将 个骰子垒成柱体且满足某些面不能紧贴的不同垒骰字方式的数量,并且结果需要对 取模。下面小亦来带大家逐步分析解题思路: #基本概念理解: 1、骰子特性: 一直骰子的…...

简单线段树的讲解(一点点的心得体会)

目录 一、初识线段树 图例&#xff1a; ​编辑 数组存储&#xff1a; 指针存储&#xff1a; 理由&#xff1a; build函数建树 二、线段树的区间修改维护 区间修改维护&#xff1a; 区间修改的操作&#xff1a; 递归更新过程&#xff1a; 区间修改update&#xff1a…...

在 Node.js 中使用原生 `http` 模块,获取请求的各个部分:**请求行、请求头、请求体、请求路径、查询字符串** 等内容

在 Node.js 中使用原生 http 模块&#xff0c;可以通过 req 对象来获取请求的各个部分&#xff1a;请求行、请求头、请求体、请求路径、查询字符串 等内容。 ✅ 一、基础结构 const http require(http); const url require(url);const server http.createServer((req, res)…...

深度学习--mnist数据集实现卷积神经网络的手写数字识别

文章目录 一、卷积神经网络CNN1、什么是CNN2、核心3、构造 二、案例1、下载数据集&#xff08;训练、测试集&#xff09;并展示画布2、打包数据图片3、判断系统使用的是CPU还是GPU4、定义CNN神经网络5、训练和测试模型 一、卷积神经网络CNN 1、什么是CNN 卷积神经网络是一种深…...

python基础知识点(1)

python语句 一行写一条语句 一行内写多行语句&#xff0c;使用分号分隔建议每行写一句&#xff0c;且结束时不写分号写在[ ]、{ }内的跨行语句&#xff0c;被视为一行语句\ 是续行符,实现分行书写功能 反斜杠表示下一行和本行是同一行 代码块与缩进 代码块复合语句&#xf…...

详解反射型 XSS 的后续利用方式:从基础窃取到高级组合拳攻击链

在网络安全领域&#xff0c;反射型跨站脚本攻击&#xff08;Reflected Cross-Site Scripting&#xff0c;简称反射型 XSS&#xff09;因其短暂的生命周期和临时性&#xff0c;常被视为“低危”漏洞&#xff0c;威胁性不如存储型或 DOM 型 XSS。然而&#xff0c;这种看法低估了它…...

【问题笔记】解决python虚拟环境运行脚本无法激活问题

【问题笔记】解决python虚拟环境运行脚本无法激活问题 错误提示问题所在解决方法**方法 1&#xff1a;临时更改执行策略****方法 2&#xff1a;永久更改执行策略** **完整流程示例** 错误提示 PS F:\PythonProject\0419graphrag-local-ollama-main> venv1\Scripts\activate…...

CF148D Bag of mice

题目传送门 思路 状态设计 设 d p i , j dp_{i, j} dpi,j​ 表示袋中有 i i i 个白鼠和 j j j 个黑鼠时&#xff0c; A A A 能赢的概率。 状态转移 现在考虑抓鼠情况&#xff1a; A A A 抓到白鼠&#xff1a;直接判 A A A 赢&#xff0c;概率是 i i j \frac{i}{i j}…...

精益数据分析(6/126):深入理解精益分析的核心要点

精益数据分析&#xff08;6/126&#xff09;&#xff1a;深入理解精益分析的核心要点 在创业和数据驱动的时代浪潮中&#xff0c;我们都在不断探索如何更好地利用数据推动业务发展。我希望通过和大家分享对《精益数据分析》的学习心得&#xff0c;一起在这个充满挑战和机遇的领…...

package.json ^、~、>、>=、* 详解

package.json ^、~、>、>、* 详解 在 Vue 项目中&#xff0c;package.json 文件的依赖项&#xff08;dependencies&#xff09;和开发依赖项&#xff08;devDependencies&#xff09;中&#xff0c;版本号前可能会带有一些特殊符号&#xff0c;例如 ^、~、>、<、&g…...