Spring Boot 与 EasyExcel 携手:复杂 Excel 表格高效导入导出实战

数据的并行导出与压缩下载:EasyExcel:实现大规模数据的并行导出与压缩下载

构建高效排队导出:解决多人同时导出Excel导致的服务器崩溃

SpringBoot集成EasyExcel 3.x:

前言

在企业级应用开发中,常常需要处理复杂的 Excel 表格数据。本方案将 Spring Boot 强大的后端框架与 EasyExcel 这一高效的 Excel 处理工具进行整合,实现了复杂 Excel 表格的导入与导出功能。

对于导入功能,能够轻松应对包含多种数据类型、复杂结构以及大量数据的 Excel 文件。通过合理的配置和处理流程,确保数据的准确性和完整性,将 Excel 中的数据快速导入到系统中,为后续的数据处理和业务逻辑提供有力支持。

在导出方面,能够根据系统中的数据生成结构复杂、格式规范的 Excel 表格。可以自定义表头、样式、格式等,满足不同业务场景下对 Excel 报表的需求。无论是生成详细的业务数据报表,还是复杂的统计分析结果,都能通过这个整合方案轻松实现。

组件介绍

EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。

Alibaba EasyExcel的核心类是EasyExcel类。

案例

1、简单的读操作

/**
 * 最简单的读
 * 1. 创建excel对应的实体对象 参照{@link DemoData}
 * 2. 由于默认一行行的读取excel,所以需要创建excel一行一行的回调监听器,参照{@link DemoDataListener}
 * 3. 直接读即可
 */
@Test
public void simpleRead() {
    String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
    // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
    EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();
}

2、简单的写操作

/**
 * 最简单的写
 * 1. 创建excel对应的实体对象 参照{@link com.alibaba.easyexcel.test.demo.write.DemoData}
 * 2. 直接写即可
 */
@Test
public void simpleWrite() {
    String fileName = TestFileUtil.getPath() + "write" + System.currentTimeMillis() + ".xlsx";
    // 这里 需要指定写用哪个class去读,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
    // 如果这里想使用03 则 传入excelType参数即可
    EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data());
}

项目基本信息

一、单个sheet&表头合并

1、添加pom.xml依赖
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>SpringBoot-easyexcel</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>SpringBoot-easyexcel</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>

        <!-- Web组件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- easyexcel -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.1.1</version>
        </dependency>

        <!-- commons-lang3 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.8.1</version>
        </dependency>

        <!-- lombok插件 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
2. 创建数据模型

创建一个数据模型类,用于表示Excel中的一行数据。例如,我们有一个包含用户信息的复杂Excel表格:

import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.metadata.data.WriteCellData;
import lombok.Builder;
import lombok.Data;

import java.util.Date;

@Data
@Builder
public class UserData{

    @ExcelProperty(value = "用户ID", index = 0)
    @ColumnWidth(10)
    private Long userId;

    @ExcelProperty(value = "用户名称", index = 1)
    @ColumnWidth(10)
    private String userName;

    @ExcelProperty(value = {"基本信息", "手机号码"}, index = 2)
    @ColumnWidth(20)
    private String userPhone;

    @ExcelProperty(value = {"基本信息", "电子邮箱"}, index = 3)
    @ColumnWidth(20)
    private String userEmail;

    @ExcelProperty(value = {"基本信息", "地址"}, index = 4)
    @ColumnWidth(20)
    private String userAddress;

    @ExcelProperty(value = "注册时间", index = 5)
    @ColumnWidth(20)
    private Date registerTime;

    @ExcelProperty(value = "性别,男:红色/女:绿色")
    @ColumnWidth(30)
    private WriteCellData<String> gender;

    /**
     * 忽略这个字段
     */
    @ExcelIgnore
    private Integer age;
}
3. 创建导出服务

创建一个服务类,用于实现Excel的导出功能:

import com.alibaba.excel.EasyExcel;  
import org.springframework.stereotype.Service;  
  
import javax.servlet.http.HttpServletResponse;  
import java.io.IOException;  
import java.net.URLEncoder;  
import java.util.List;  
  
@Service  
public class ExcelExportService {  
  
    public void exportUsers(List<UserData> userDataList, HttpServletResponse response) throws IOException {  
        // 设置响应类型
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        // 设置编码格式
        response.setCharacterEncoding("utf-8");
        // 设置URLEncoder.encode 防止中文乱码
        String fileName = URLEncoder.encode("信息表", "UTF-8").replaceAll("\\+", "%20");
        // 设置响应头
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");

        EasyExcel.write(response.getOutputStream(), UserData.class).inMemory(true)
            .sheet("用户信息表")
            .doWrite(userDataList);
    }


    private static WriteCellData<String> buildCellData(String gender) {
        // 设置单个单元格多种样式
        WriteCellData<String> cellData = new WriteCellData<>();
        // 设置单个单元格的填充类型
        cellData.setType(CellDataTypeEnum.RICH_TEXT_STRING);
        
        RichTextStringData richTextStringData = new RichTextStringData();
        cellData.setRichTextStringDataValue(richTextStringData);
        richTextStringData.setTextString(gender);
        WriteFont writeFont = new WriteFont();
        if ("男".equalsIgnoreCase(gender)) {
         //设置颜色为红色
            writeFont.setColor(IndexedColors.RED.getIndex());
        } else if ("女".equalsIgnoreCase(gender)) {
         //设置颜色为绿色
            writeFont.setColor(IndexedColors.GREEN.getIndex());
        }
        //应用颜色字体
        richTextStringData.applyFont(writeFont);
        return cellData;
    }  
}
4. 创建导入服务

导入的数据模型

import java.util.Date;

import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.metadata.data.WriteCellData;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Data
@Builder
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class UserData {
    private Long userId;

    private String userName;

    private Integer age;

    private String userPhone;

    private String userEmail;

    private String userAddress;

    private Date registerTime;

    private String gender;
}

创建一个服务类,用于实现Excel的导入功能:

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.util.ListUtils;
import com.alibaba.excel.util.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.regex.Pattern;

@Slf4j
@Service
public class ExcelImportService {

    /**
     * 每隔一定数量的数据存储到数据库,可根据实际情况调整。
     */
    private static final int BATCH_COUNT = 100;

    /**
     * 手机号正则表达式校验。
     */
    private static final Pattern PHONE_REGEX = Pattern.compile("^1[0-9]{10}$");

    /**
     * 缓存要导入的数据列表。
     */
    private List<UserData> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);

    /**
     * 错误信息列表。
     */
    private final List<String> errorMsgList = new ArrayList<>();

    // 假设这里有一个数据访问层的接口引用
    private UserDataRepository userDataRepository;

    public ExcelImportService(UserDataRepository userDataRepository) {
        this.userDataRepository = userDataRepository;
    }

    /**
     * 导入 Excel 文件并保存数据到数据库。
     *
     * @param excelFilePath Excel 文件路径。
     */
    public void importExcel(String excelFilePath) {
        EasyExcel.read(excelFilePath, UserData.class, new CustomAnalysisEventListener()).sheet().doRead();
    }

    class CustomAnalysisEventListener extends AnalysisEventListener<UserData> {

        @Override
        public void invoke(UserData userData, AnalysisContext analysisContext) {
            log.info("解析到一条数据:{}", userData);
            int rowIndex = analysisContext.readRowHolder().getRowIndex();
            String name = userData.getUserName();
            String phone = userData.getUserPhone();
            String gender = userData.getGender();
            String email = userData.getUserEmail();
            Integer age = userData.getAge();
            String address = userData.getUserAddress();
            // 只有全部校验通过的对象才能被添加到下一步
            if (nameValid(rowIndex, name) && phoneValid(rowIndex, phone) && genderValid(rowIndex, gender) &&
                    emailValid(rowIndex, email) && ageValid(rowIndex, age) && addressValid(rowIndex, address)) {
                cachedDataList.add(userData);
            }
            // 达到 BATCH_COUNT 了,存储到数据库并清理列表
            if (cachedDataList.size() >= BATCH_COUNT) {
                saveDataToDatabase();
                cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
            }
        }

        @Override
        public void doAfterAllAnalysed(AnalysisContext analysisContext) {
            log.info("所有数据解析完成!全部校验通过的数据有{}条", cachedDataList.size());
            // 保存剩余数据到数据库
            saveDataToDatabase();
        }

        @Override
        public void onException(Exception exception, AnalysisContext context) throws Exception {
            if (exception instanceof RuntimeException) {
                throw exception;
            }
            int index = context.readRowHolder().getRowIndex() + 1;
            errorMsgList.add("第" + index + "行解析错误");
        }

        @Override
        public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
            int totalRows = context.readSheetHolder().getApproximateTotalRowNumber() - 1;
            int maxNum = 2000;
            if (totalRows > maxNum) {
                errorMsgList.add("数据量过大,单次最多上传2000条");
                throw new RuntimeException("数据量过大,单次最多上传2000条");
            }
        }
    }

    /**
     * 将缓存的数据保存到数据库。
     */
    private void saveDataToDatabase() {
        userDataRepository.saveAll(cachedDataList);
    }

    public List<String> getErrorMsgList() {
        return errorMsgList;
    }

    /**
     * 名称的校验。
     *
     * @param rowIndex 行数。
     * @param name     名称。
     */
    private Boolean nameValid(Integer rowIndex, String name) {
        if (StringUtils.isBlank(name)) {
            errorMsgList.add("第" + rowIndex + "行,'姓名'不能为空");
            return false;
        }
        return true;
    }

    /**
     * 手机号的校验。
     *
     * @param rowIndex 行数。
     * @param phone    手机号。
     */
    private Boolean phoneValid(int rowIndex, String phone) {
        if (StringUtils.isBlank(phone)) {
            errorMsgList.add("第" + rowIndex + "行,'手机号'不能为空");
            return false;
        }
        return true;
    }

    /**
     * 性别的校验。
     *
     * @param rowIndex 行数。
     * @param gender   性别。
     */
    private Boolean genderValid(int rowIndex, String gender) {
        if (StringUtils.isBlank(gender)) {
            errorMsgList.add("第" + rowIndex + "行,'性别'不能为空");
            return false;
        }
        return true;
    }

    /**
     * 地址的校验。
     *
     * @param rowIndex 行数。
     * @param address  地址。
     */
    private Boolean addressValid(int rowIndex, String address) {
        // 校验地址是否为空
        if (StringUtils.isBlank(address)) {
            errorMsgList.add("第 " + rowIndex + " 行,'地址'不能为空");
            return false;
        }
        return true;
    }

    /**
     * 年龄的校验。
     *
     * @param rowIndex 行数。
     * @param age      年龄。
     */
    private Boolean ageValid(int rowIndex, Integer age) {
        // 校验年龄是否为空
        if (Objects.isNull(age)) {
            errorMsgList.add("第 " + rowIndex + " 行'年龄'不能为空");
            return false;
        }
        return true;
    }

    /**
     * 邮箱的校验。
     *
     * @param rowIndex 行数。
     * @param email    邮箱。
     */
    private Boolean emailValid(int rowIndex, String email) {
        // 校验邮箱是否为空
        if (StringUtils.isBlank(email)) {
            errorMsgList.add("第 " + rowIndex + " 行'邮箱'不能为空");
            return false;
        }
        return true;
    }
}
5. 创建控制器

创建一个控制器类,用于处理Excel的导入与导出请求:

import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.web.bind.annotation.*;  
import org.springframework.web.multipart.MultipartFile;  
  
import javax.servlet.http.HttpServletResponse;  
import java.io.IOException;  
import java.util.List;  
  
@RestController  
@RequestMapping("/excel")  
public class ExcelController {  
  
    @Autowired  
    private ExcelExportService excelExportService;  
  
    @Autowired  
    private ExcelImportService excelImportService;

    @Autowired  
    private UserService userService;  
  
    
    @GetMapping("/export")  
    public void exportUsers(HttpServletResponse response,  
                            @RequestParam(value = "data", required = false) List<UserData> userDataList) throws IOException { 

        // 判断userDataList是否为空,为空就去数据库查询数据,后执行导出操作 
        if (userDataList == null || userDataList.isEmpty()) {  
            // 从数据库或其他地方获取数据  
            userDataList = userService.findAll();
            for (UserData userData: userDataList) {
                // 修改性别单元格的样式
                excelExportService.buildCellData(userData.getGender)
            }  
        }
  
        excelExportService.exportUsers(userDataList, response);  
    }  
  
    @PostMapping("/import")  
    public String importUsers(@RequestParam("file") MultipartFile file) {  
        try {  
            String filePath = "/path/to/upload/" + file.getOriginalFilename();  
            file.transferTo(new java.io.File(filePath));  
            excelImportService.importExcel(filePath);  
            return "导入成功";  
        } catch (Exception e) {  
            e.printStackTrace();  
            return "导入失败";  
        }  
    }  
}
6. 运行项目并测试

启动Spring Boot项目,然后你可以通过以下URL进行测试:

  • 导出Excel文件http://localhost:8080/excel/export(可以传递一个data参数,包含要导出的用户数据)

  • 导入Excel文件http://localhost:8080/excel/import(上传一个Excel文件)‘

二、多个sheet导出

1、创建数据模型

城市实体类

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class City{

    @ExcelProperty(value = "城市名称", index = 0)
    @ColumnWidth(10)
    private String cityName;

    @ExcelProperty(value = "城市介绍", index = 1)
    @ColumnWidth(60)
    private String cityDesc;
}

公司实体类

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class Company{
    @ExcelProperty(value = "公司名称", index = 0)
    @ColumnWidth(10)
    private String companyName;

    @ExcelProperty(value = "公司创始人", index = 1)
    @ColumnWidth(10)
    private String companyBoss;

    @ExcelProperty(value = "公司总基地", index = 2)
    @ColumnWidth(10)
    private String companyBase;

    @ExcelProperty(value = "公司简介", index = 3)
    @ColumnWidth(50)
    private String companyDesc;
}
2、创建导出服务

创建一个服务类,用于实现Excel的导出功能:

import com.alibaba.excel.EasyExcel;  
import org.springframework.stereotype.Service;  
  
import javax.servlet.http.HttpServletResponse;  
import java.io.IOException;  
import java.net.URLEncoder;  
import java.util.List;  
  
@Service  
public class ExcelExportAllService {  

        public void exportUsers(List<UserData> userDataList,List<CityList> cityList,List<CompanyList> companyList, HttpServletResponse response) throws IOException {  

            // 设置响应类型
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            // 设置编码格式
            response.setCharacterEncoding("utf-8");
            // 设置URLEncoder.encode 防止中文乱码
            String fileName = URLEncoder.encode("信息表", "UTF-8").replaceAll("\\+", "%20");
            // 设置响应头
            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
            // 多个sheet的输出需要使用ExcelWriter类,这里想要下载成功,需要输出到OutputStream中
            try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).inMemory(true).build()) {

                // 创建用户信息表的sheet,写入用户信息数据,1代表sheet的位置是第一个
                WriteSheet userInfoSheet = EasyExcel.writerSheet(0, "用户信息表").head(UserData.class).build();
                excelWriter.write(userDataList, userInfoSheet);

                // 创建城市信息表的sheet,写入城市信息数据,2代表sheet的位置是第二个
                WriteSheet cityInfoSheet = EasyExcel.writerSheet(1, "城市信息表").head(City.class).build();
                excelWriter.write(cityList, cityInfoSheet);

                // 创建公司信息表的sheet,写入公司信息数据,3代表sheet的位置是第三个
                WriteSheet companyInfoSheet = EasyExcel.writerSheet(2, "公司信息表").head(Company.class).build();
                excelWriter.write(companyList, companyInfoSheet);
           }
        }
}
3、创建控制器

创建一个控制器类,用于处理Excel的导入与导出请求

import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.web.bind.annotation.*;  
import org.springframework.web.multipart.MultipartFile;  
  
import javax.servlet.http.HttpServletResponse;  
import java.io.IOException;  
import java.util.List;  
  
@RestController  
@RequestMapping("/excelAll")  
public class ExcelAllController {  
  
    @Autowired  
    private ExcelExportAllService excelExportAllService;  

    @Autowired  
    private UserDataService userService;

    @Autowired  
    private CompanyService companyService;  

    @Autowired  
    private CityService cityService;  
  
    
    @GetMapping("/export")  
    public void exportUsers(HttpServletResponse response,  
                            @RequestParam(value = "userDataList", required = false) List<UserData> userDataList,
                            @RequestParam(value = "companyList", required = false) List<Company> companyList,
                            @RequestParam(value = "cityList", required = false) List<City> cityList
                            ) throws IOException { 

        // 判断userDataList是否为空,为空就去数据库查询数据,后执行导出操作 
        if (userDataList == null || userDataList.isEmpty()) {  
            // 从数据库或其他地方获取数据  
            userDataList = userService.findAll(); 
        }

        if (companyList== null || companyList.isEmpty()) {  
            // 从数据库或其他地方获取数据  
            companyList= companyService.findAll(); 
        }

        if (cityList== null || cityList.isEmpty()) {  
            // 从数据库或其他地方获取数据  
            cityList= cityService.findAll(); 
        }
  
        excelExportAllService.exportUsers(userDataList,cityList,companyList, response);  
    }  
  
}
4. 运行项目并测试

启动Spring Boot项目,然后你可以通过以下URL进行测试:

  • 导出Excel文件http://localhost:8080/excelAll/export

多个sheet导出

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/906263.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【网络篇】计算机网络——链路层详述(笔记)

目录 一、链路层 1. 概述 2. 链路层提供的服务 &#xff08;1&#xff09;成帧&#xff08;framing&#xff09; &#xff08;2&#xff09;链路接入 &#xff08;3&#xff09;可靠交付 &#xff08;4&#xff09;差错检测和纠正 3. 链路层的实现 二、多路访问链路和…

Android——显式/隐式Intent

概述 在Android中&#xff0c;Intent是各个组件之间信息通信的桥梁&#xff0c;它用于Android各组件的通信。 Intent 的组成部分 一、显式 Intent 第一种方式 Intent intent new Intent(this, ActFinishActivity.class);startActivity(intent);第二种方式 Intent intent …

__init__.py __all__和 __name__的作用及其用法

__ init__.py 的作用及其用法&#xff1a; 包下的__init__.py 所在目录是一个模块包,本身也是一个模块,可用于定义模糊导入时要导入的内容。当我们导入一个包的时候&#xff0c;包下的__init__.py中的代码会自动执行&#xff0c;因此在某些大的项目被使用频率较高的模块&#x…

曹操出行借助 ApsaraMQ for Kafka Serverless 提升效率,成本节省超 20%

本文整理于 2024 年云栖大会主题演讲《云消息队列 ApsaraMQ Serverless 演进》&#xff0c;杭州优行科技有限公司消息中间件负责人王智洋分享 ApsaraMQ for Kafka Serverless 助力曹操出行实现成本优化和效率提升的实践经验。 曹操出行&#xff1a;科技驱动共享出行未来 曹操…

《探索 HarmonyOS NEXT(5.0):开启构建模块化项目架构奇幻之旅 —— Tabs底部导航栏》

简介 通过学习HarmonyOS Next&#xff0c;实战项目WanAndroid 鸿蒙版&#xff0c;API接口均来自WanAndroid 开源接口&#xff0c;我们一起来做个App吧。 玩Android 开放API&#xff1a;https://www.wanandroid.com/blog/show/2 效果图 创建每个模块下的各个目录 1、feature…

LinkedList 分析

LinkedList 简介 LinkedList 是一个基于双向链表实现的集合类&#xff0c;经常被拿来和 ArrayList 做比较。关于 LinkedList 和ArrayList的详细对比&#xff0c;我们 Java 集合常见面试题总结(上)有详细介绍到。 双向链表 不过&#xff0c;我们在项目中一般是不会使用到 Link…

MybatisPlus入门(六)MybatisPlus-null值处理

一、MybatisPlus-null值处理 1.1&#xff09;问题引入&#xff1a; 在查询中遇到如下情况&#xff0c;有部分筛选条件没有值&#xff0c;如商品价格有最大值和最小值&#xff0c;商品价格部分时候没有值。 1.2&#xff09;解决办法&#xff1a; 步骤一&#xff1a;新建查询实…

基于树莓派的安保巡逻机器人--(一、快速人脸录入与精准人脸识别)

目录 零、前言 一、人脸检测 二、人脸识别 1、采集人脸 2、训练人脸识别模型 3、人脸识别应用 零、前言 随着智能安防需求的增长&#xff0c;基于人工智能和物联网的安保系统逐渐成为趋势。树莓派因其低成本、高扩展性等特点&#xff0c;成为很多AI项目的理想平台。本文将为大…

网络编程项目之UDP聊天室

项目要求 利用UDP协议&#xff0c;实现一套聊天室软件。服务器端记录客户端的地址&#xff0c;客户端发送消息后&#xff0c;服务器群发给各个客户端软件。 问题思考 客户端会不会知道其它客户端地址&#xff1f; UDP客户端不会直接互连&#xff0c;所以不会获知其它客户端地址…

Java-String类

字符串这个词我想同学们并不陌生&#xff0c;但Java语言中的字符串和我们之前所学习的C语言字符串&#xff0c;差别可谓是非常之大&#xff0c;因为在C语言当中&#xff0c;想要表示一个字符串&#xff0c;就只能使用字符数组或字符指针&#xff0c;但是这种" 对数据进行细…

大学生网上面试注意事项,试试白瓜面试

在数字化时代&#xff0c;大学生网上面试已成为求职过程中的一个关键环节。为了在这个虚拟舞台上留下深刻印象&#xff0c;以下是一些针对大学生网上面试的注意事项&#xff0c;同时&#xff0c;我们将探讨如何利用“白瓜面试”这一AI面试助手来提升你的面试表现。 大学生网上…

SpringBoot【实用篇】- 热部署

文章目录 目标:1.手动启动热部署2.自动启动热部署4.禁用热部署 目标: 手动启动热部署自动启动热部署热部署范围配置关闭热部署 1.手动启动热部署 当我们没有热部署的时候&#xff0c;我们必须在代码修改完后再重启程序&#xff0c;程序才会同步你修改的信息。如果我们想快速查…

【源码+文档】基于SpringBoot+Vue旅游网站系统【提供源码+答辩PPT+参考文档+项目部署】

作者简介&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容&#xff1a;&#x1f31f;Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…

ES(2)(仅供自己参考)

Java代码的索引库&#xff1a; package cn.itcast.hotel;import lombok.AccessLevel; import org.apache.http.HttpHost; import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest; import org.elasticsearch.client.RequestOptions; import org.elasticsea…

《ToDesk云电脑vs青椒云性能测试,谁更能实现游戏自由?》

ToDesk云电脑vs青椒云性能测试 【前言】【使用云电脑的意义】【实测软件】【性能参数对比】1. 硬件配置2.游戏兼容性3. 延迟、流畅度与画面清晰度4. 用户体验5. 价格对比6. 附加功能 【游戏性能测试】《游戏一 黑悟空》《游戏二 赛博朋克 2077》《游戏三 CS反恐精英》 【本文小…

HarmonyOS开发5.0 net 启动界面设置

第一步、创建我们界面 第二步&#xff0c; 在EntryAbility中配置启动页面&#xff0c;在entry/src/main/ets/entryability/EntryAbility.ets中配置启动页面 配置如下 至此大功告成

python--函数详解二

一、作用域&#xff1a; 一个标识符的可见范围&#xff0c;这就是标识符的作用域&#xff0c;一般说的是变量的作用域 1.1、全局作用域 运行结果 在整个程序运行环境中可见。可以被多个函数重复多次使用 1.2、局部作用域 运行结果 这里调用a&#xff0c;显示未定义&#xff…

Etsy又被封号了!这次我终于搞懂了原因...

你是否真的了解在Etsy开店有哪些红线不能踩&#xff1f;你是否真的知道Etsy被封号后如何解决&#xff1f;本文我将探讨Etsy账号被封的常见原因&#xff0c;以及卖家可以采取的应对策略&#xff0c;以期减轻对跨境业务的伤害程度&#xff0c;感兴趣的商家速速码住&#xff0c;不…

大舍传媒:海外发稿的卓越选择——老挝新闻网报道及海外媒体发布服务

大舍传媒&#xff1a;海外发稿的卓越选择——老挝新闻网报道及海外媒体发布服务 在当今全球化的时代&#xff0c;信息的传播速度和范围至关重要。对于企业、组织和个人而言&#xff0c;能够在海外媒体上发布稿件&#xff0c;实现有效的宣传和推广&#xff0c;无疑是提升知名度…

如何找到网上爆款内容,快速复制扩大品牌声量

社媒内容爆款复制是现代营销中的一个重要策略&#xff0c;它对于提升品牌声量、曝光度和知名度具有显著效果。 首先什么是爆款&#xff1f; 爆款内容指的是在社交媒体或其他在线平台上迅速获得大量关注、分享和讨论的内容。 准确、及时找到这部分品牌相关的爆款内容&#xf…