基于easyexcel实现导出excel,包括导出图片以及导出下拉框

news2024/11/15 14:04:02

基于easyexcel实现导出excel,包括导出图片以及导出下拉框

1.最基本的导出excel

1.引入maven

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

2.写一个样式工具类

package com.electronic.web.controller.studyEasyExcelExport;

import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;

/**
 * 导出excel样式罢了
 */
public class ExcelStyleUtils {
    public static HorizontalCellStyleStrategy getStyle() {
        // 头的策略
        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
        WriteFont headWriteFont = new WriteFont();
        headWriteFont.setFontHeightInPoints((short) 15);
        headWriteCellStyle.setWriteFont(headWriteFont);
        // 内容的策略
        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
        WriteFont contentWriteFont = new WriteFont();
        // 字体大小
        contentWriteFont.setFontHeightInPoints((short) 13);
        contentWriteCellStyle.setWriteFont(contentWriteFont);
        // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
        contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        //导出数据水平居中
        contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
        contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);
        contentWriteCellStyle.setBorderTop(BorderStyle.THIN);
        contentWriteCellStyle.setBorderRight(BorderStyle.THIN);
        contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);
        return new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
    }
}

3.写一个导出的实体

package com.electronic.web.controller.studyEasyExcelExport;

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.HeadFontStyle;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;


@Getter
@Setter
@ToString
@HeadFontStyle(fontHeightInPoints = 10)
@HeadRowHeight(20)
public class WorkOrderExcelExportVO {

    @ExcelProperty(value = "派单时间",order = 2)
    @ColumnWidth(22)
    private String orderTime;

    @ExcelProperty(value = "标题",order = 1)
    @ColumnWidth(25)
    private String title;

    @ExcelProperty(value = "工单编号",order = 0)
    @ColumnWidth(25)
    private String orderNo;

    @ExcelProperty(value = "分类",order = 4)
    @ColumnWidth(15)
    private String eventTypeName;

    @ExcelProperty(value = "事件内容",order = 6)
    @ColumnWidth(25)
    private String content;

    @ExcelProperty(value = "事件地址",order = 7)
    @ColumnWidth(25)
    private String address;

    @ExcelProperty(value = "类型",order = 5)
    @ColumnWidth(15)
    private String appealTypeName;

    @ExcelProperty(value = "承办单位",order = 8)
    @ColumnWidth(20)
    private String deptName;

    @ExcelProperty(value = "承办状态",order = 9)
    @ColumnWidth(20)
    private String mainState;

    @ExcelProperty(value = "办理期限",order = 3)
    @ColumnWidth(22)
    private String handleTime;
}

4.写控制层

import org.springframework.core.io.InputStreamResource;
import org.springframework.http.ContentDisposition;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.CollectionUtils;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;


@RestController
@RequestMapping("/easyexcel/test")
@Slf4j
public class TestEasyExcelController {

    @PostMapping("export/xlsx")
    public ResponseEntity<InputStreamResource> exportXlsx() {
        final Path tempWordPath = exportExcel();
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        headers.setContentDisposition(
                ContentDisposition
                        .attachment()
                        .filename("***汇总表.xlsx", StandardCharsets.UTF_8)
                        .build());
        try {
            final InputStream in = Files.newInputStream(tempWordPath, StandardOpenOption.DELETE_ON_CLOSE);
            return new ResponseEntity<>(new InputStreamResource(in, "***汇总表.xlsx"), headers, HttpStatus.OK);
        } catch (IOException e) {
            throw new IllegalStateException("文件导出失败..", e);
        }
    }
}

5.写业务层

也就是上面的exportExcel();这个方法

   //下面可以理解为业务层的东西 应该是放在业务层去写的
    public Path exportExcel() {
        //根据条件查询指定数据 注释掉的知识业务罢了
//        Set<Long> orderIdSet;
//        if (null != commandPageParam.getMainDeptId()) if (!DEPT_OPT_SECTION.equals(commandPageParam.getMainDeptId()))
//            orderIdSet = workOrderInfoRepository.selectOrderIdSetByDeptId(commandPageParam.getMainDeptId(), Boolean.TRUE);
//        else
//            orderIdSet = workOrderInfoRepository.selectOrderIdSetByDeptId(commandPageParam.getMainDeptId(), Boolean.FALSE);
//        else
//            orderIdSet = workOrderInfoRepository.selectOrderIdSetByDeptId(commandPageParam.getCurrentDeptId(), Boolean.FALSE);
//        commandPageParam.setOrderIdSet(orderIdSet);
        //        final List<WorkOrderExcelExportVO> exportList = workOrderInfoRepository.selectExcelExportData(commandPageParam);
        // 创建一个包含十行假数据的 List   模拟查出来数据
        List<WorkOrderExcelExportVO> exportList = new ArrayList<>();

        // 添加十行假数据到 exportList
        for (int i = 1; i <= 10; i++) {
            WorkOrderExcelExportVO workOrder = new WorkOrderExcelExportVO();
            workOrder.setOrderTime("2023-07-19");
            workOrder.setTitle("标题" + i);
            workOrder.setOrderNo("工单编号" + i);
            workOrder.setEventTypeName("分类" + i);
            workOrder.setContent("事件内容" + i);
            workOrder.setAddress("事件地址" + i);
            workOrder.setAppealTypeName("类型" + i);
            workOrder.setDeptName("承办单位" + i);
            workOrder.setMainState("承办状态" + i);
            workOrder.setHandleTime("办理期限" + i);
            exportList.add(workOrder);
        }

        log.info("当前共有{}条数据", exportList.size());
        final Path tempPath;
        HorizontalCellStyleStrategy horizontalCellStyleStrategy = ExcelStyleUtils.getStyle();
        try {
            tempPath = Files.createTempFile("workorder", ".xlsx");
            EasyExcel.write(tempPath.toFile(), WorkOrderExcelExportVO.class)
                    .registerWriteHandler(horizontalCellStyleStrategy)
                    .sheet("***派单汇总表66")
                    .doWrite(exportList);
        } catch (IOException e) {
            throw new IllegalStateException("文件导出失败, 可能为磁盘空间不足", e);
        }
        return tempPath;
    }

6.自测通过(截图)

在这里插入图片描述

2. 在1基础上导出带图片的excel

1.实体的改动

@Getter
@Setter
@ToString(callSuper = true)
@ContentRowHeight(120)
public class RoadCheckExcelExportVO {

    //查出来的图片url
    @ExcelProperty(value="附件图片",converter = SxjgUrlImageConverter.class, order=11)
    @ColumnWidth(30)
    private String disposeUrl;
    @ExcelProperty(value = "序号",order = 0)
    @ColumnWidth(15)
    private Integer index;

2.自定义的图片转换器 SxjgUrlImageConverter

package com.safesoft.domain.check.vo;

import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import com.alibaba.excel.util.IoUtils;
import org.springframework.util.ObjectUtils;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.FileSystems;
import java.nio.file.Path;

/**
 * [自定义 图片 转换器,根据图片的url将图片导入到表格中。]
 *
 * @author Kevin.Wan
 * @date 2024/1/19
 **/
public class SxjgUrlImageConverter implements Converter<String> {


    @Override
    public Class<?> supportJavaTypeKey() {
        return String.class;
    }

    @Override
    public WriteCellData<?> convertToExcelData(String value, ExcelContentProperty contentProperty,
                                               GlobalConfiguration globalConfiguration) throws IOException {
        InputStream inputStream = null;
        try {
            if (ObjectUtils.isEmpty(value)) {
                return new WriteCellData<>("图片链接为空");
            }

            // Assuming the value is a relative path
            String absolutePath = getAbsolutePath(value);
            File file = new File(absolutePath);

            if (!file.exists()) {
                return new WriteCellData<>("图片文件不存在");
            }

            inputStream = new FileInputStream(file);
            byte[] bytes = IoUtils.toByteArray(inputStream);
            return new WriteCellData<>(bytes);
        } catch (Exception e) {
            return new WriteCellData<>("图片获取异常");
        } finally {
            if (inputStream != null) {
                inputStream.close();
            }
        }
    }

    /**
     * 获取图片的真实路径
     *  
     * @param relativePath 图片路径
     * @return 真实路径
     */
    private String getAbsolutePath(String relativePath) {
        //因为我的图片 数据库存的地址 例如  store/af9227eaada9b744c950de869327adf7.jpg
        //实际上我存放的位置是在    当前项目的根目录,上一级attachments的下面 ,就是为了能找到图片
        final String fileBaseDir = "../attachments";
        final Path storeDirPath = FileSystems.getDefault().getPath(fileBaseDir);

        return storeDirPath.resolve(relativePath).toString();
    }
}

3.效果图

在这里插入图片描述

3. 在1基础上导出下拉框,并且下拉框进行数据校验

3.1 实体的改动

package com.safesoft.domain.keysupervisionvehicle.vo;

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.safesoft.domain.keysupervisionvehicle.impl.DepartmentConverter;
import com.safesoft.domain.keysupervisionvehicle.impl.PlateColorConverter;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

/**
 * [重点监测车辆导入模板实体]
 *
 * @author Kevin.Wan
 * @date 2024/1/11
 **/
@Getter
@Setter
@ToString
public class KeySupervisionVehicleExport {

  
    /**
     * 车牌号
     */
    @ExcelProperty(value = "车牌号",order = 1)
    @ColumnWidth(25)
    private String plateNum;

    /**
     * 车牌颜色
     *  车牌颜色只能是order = 2  如果这里修改,KeySupervisionVehicleSheetWriteHandler这个类的车牌颜色下拉框也要修改
     */
    @ExcelProperty(value = "车牌颜色",converter = PlateColorConverter.class,order = 2)
    @ColumnWidth(25)
    private String plateColor;

    /**
     * 挂车车牌
     */
    @ExcelProperty(value = "挂车车牌",order = 3)
    @ColumnWidth(25)
    private String trailerPlateNum;

    /**
     * 挂车车牌颜色
     *  车牌颜色只能是order = 4  如果这里修改,KeySupervisionVehicleSheetWriteHandler这个类的车牌颜色下拉框也要修改
     */
    @ExcelProperty(value = "挂车车牌颜色",converter = PlateColorConverter.class,order = 4)
    @ColumnWidth(25)
    private String trailerPlateColor;

3.2 车牌颜色的转换器PlateColorConverter

package com.safesoft.domain.keysupervisionvehicle.impl;

import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.converters.ReadConverterContext;
import com.alibaba.excel.converters.WriteConverterContext;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.safesoft.domain.keysupervisionvehicle.entity.PlateColorEnum;

/**
 * [自定义 Excel 转换器,用于将车牌颜色的标识转换为对应的参数表plate-color的code。]
 *
 * @author Kevin.Wan
 * @date 2024/1/17
 **/
public class PlateColorConverter implements Converter<String> {

    /**
     * 返回支持的 Java 类型
     *
     * @return Java 类型
     */
    @Override
    public Class<String> supportJavaTypeKey() {
        return String.class;
    }

    /**
     * 返回支持的 Excel 类型
     *
     * @return Excel 类型
     */
    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return CellDataTypeEnum.STRING;
    }


    /**
     * 将 Excel 数据转换为 Java 数据 (将车牌颜色名称转换为车牌颜色code)
     *
     * @param context 转换上下文
     * @return Java 数据
     */
    @Override
    public String convertToJavaData(ReadConverterContext<?> context) {
        return PlateColorEnum.getPlateColorCode(context.getReadCellData().getStringValue());
    }

    /**
     * 将 Java 数据转换为 Excel 数据 (将车牌颜色code转换为车牌颜色名称)
     *
     * @param context 转换上下文
     * @return Excel 数据
     */
    @Override
    public WriteCellData<?> convertToExcelData(WriteConverterContext<String> context) {
        return new WriteCellData<>(PlateColorEnum.getPlateColorName(context.getValue()));
    }

}

3.3 业务层的改动

public Path downloadTemplate() {
    LOGGER.info("导入模板下载");

    final List<KeySupervisionVehicleExport> keySupervisionVehicleExportList = Collections.emptyList();

    final Path tempPath;
    HorizontalCellStyleStrategy horizontalCellStyleStrategy = ExcelStyleUtils.getStyle();
    try {
        tempPath = Files.createTempFile("keySupervisionVehicleExport", ".xlsx");
        EasyExcelFactory.write(tempPath.toFile(), KeySupervisionVehicleExport.class)
                .registerWriteHandler(horizontalCellStyleStrategy)
                //添加头     *****************改动点******************
                .head(KeySupervisionVehicleExport.class)
                //派单中队下拉框数据校验处理器 *****************改动点******************
                .registerWriteHandler(new KeySupervisionVehicleSheetWriteHandler())
                .sheet("****导入模板表")
                .doWrite(keySupervisionVehicleExportList);
    } catch (IOException e) {
        throw new IllegalStateException("文件导出失败, 可能为磁盘空间不足", e);
    }
    return tempPath;
}

3.4 下拉框数据校验处理器KeySupervisionVehicleSheetWriteHandler

package com.safesoft.domain.keysupervisionvehicle.impl;


import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import org.apache.poi.ss.usermodel.DataValidation;
import org.apache.poi.ss.usermodel.DataValidationConstraint;
import org.apache.poi.ss.usermodel.DataValidationHelper;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddressList;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * [自定义的SheetWriteHandler实现类,用于在Excel中添加下拉框,并进行数据验证]
 *
 * @author Kevin.Wan
 * @date 2024/1/12
 **/
public class KeySupervisionVehicleSheetWriteHandler implements SheetWriteHandler {

    private static final Logger LOGGER = LoggerFactory.getLogger(KeySupervisionVehicleSheetWriteHandler.class);

    /**
     * 派单中队下拉框开始列的索引
     */
    private static final Integer DEPARTMENT_SELECT_FIRST_COL = 9;

    /**
     * 派单中队下拉框结束列的索引
     */
    private static final Integer DEPARTMENT_SELECT_LAST_COL = 9;

    /**
     * 重点监测车辆导入模板-派单中队下拉框(客户需求,只能是这四个大队)
     */
    private final String[] departmentIdOptions = {"一中队", "二中队", "三中队", "四中队"};

    /**
     * 车牌颜色的下拉框选项列表(客户需求,这个对应sys_parameter表的plate-color类型)
     */
    private final String[] plateColorOptions = {"黄牌", "蓝牌", "绿牌"};


    /**
     * 在创建Sheet后调用,用于设置下拉框和样式
     *
     * @param writeWorkbookHolder WriteWorkbookHolder
     * @param writeSheetHolder    WriteSheetHolder
     */
    @Override
    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
        // 获取当前Sheet
        final Sheet sheet = writeSheetHolder.getSheet();
        // 获取数据验证的帮助类
        final DataValidationHelper helper = sheet.getDataValidationHelper();

        LOGGER.info("当前派单中队的列为选择项,添加下拉框,设置数据有效性");
        // 设置下拉框范围,此例中是第10列(索引从0开始)的第1行到第10000行
        final CellRangeAddressList optionCellRange = new CellRangeAddressList(0, 9999, DEPARTMENT_SELECT_FIRST_COL, DEPARTMENT_SELECT_LAST_COL);

        // 创建数据验证约束,使用传入的选项列表
        final DataValidationConstraint optionConstraint =
                helper.createExplicitListConstraint(departmentIdOptions);

        // 创建数据验证对象,将约束应用于指定的单元格范围
        final DataValidation validation = helper.createValidation(optionConstraint, optionCellRange);
        // 设置验证失败时的错误提示框
        validation.createErrorBox("输入错误", "请选择下拉框之中内容");
        // 设置是否显示错误提示框
        validation.setShowErrorBox(true);
        // 将数据验证添加到Sheet中
        sheet.addValidationData(validation);

        LOGGER.info("当前车牌颜色的列为选择项,添加下拉框,设置数据有效性");
        for (int colIndex : new int[]{2, 4}) {
            // 设置第2列的车牌颜色下拉框范围
            final CellRangeAddressList plateColorOptionCellRange = new CellRangeAddressList(0, 9999, colIndex, colIndex);
            // 创建数据验证约束,使用车牌颜色选项列表
            final DataValidationConstraint plateColorOptionConstraint = helper.createExplicitListConstraint(plateColorOptions);
            // 创建数据验证对象,将约束应用于指定的单元格范围
            final DataValidation plateColorValidation = helper.createValidation(plateColorOptionConstraint, plateColorOptionCellRange);
            // 设置验证失败时的错误提示框
            plateColorValidation.createErrorBox("输入错误", "请选择正确的车牌颜色");
            // 设置是否显示错误提示框
            plateColorValidation.setShowErrorBox(true);
            // 将数据验证添加到Sheet中
            sheet.addValidationData(plateColorValidation);
        }
    }
}

3.5 效果图

![![外

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL复合查询解析

&#x1f388;行百里者半九十&#x1f388; &#x1f388;目录&#x1f388; 概念多表查询自连接子查询单行子查询多行子查询in关键字all关键字any关键字 多列子查询在from中使用子查询合并查询unionunion all 总结 概念 之前我们很多的查询都只是对于单表进行查询&#xff0c…

DMA技术在STM32中优化UART、SPI和I2C通信性能的研究与实现

DMA&#xff08;Direct Memory Access&#xff0c;直接存储器访问&#xff09;技术可以在STM32微控制器上优化UART、SPI和I2C等通信性能。DMA可以实现数据的高速传输&#xff0c;减轻CPU的负担&#xff0c;提高系统性能。在本篇文章中&#xff0c;我将探讨DMA技术在STM32中优化…

【C语言基础篇】结构控制(中)循环结构

文章目录 一、循环结构 1. while语句 2. for语句 3. do while语句 4. 循环结构总结 C语⾔是结构化的程序设计语⾔&#xff0c;这⾥的结构指的是顺序结构、选择结构、循环结构。也就是说在C语言所有的代码都是这三种结构。 本篇文章将会着重讲解循环结构 顺序结构和选…

数据结构图算法

算法就要多练,我在国庆节放假的时间编写了图的算法题,写完让我受益匪浅,希望可以帮助到大家. 文章目录 前言 一、图的数据结构 1.图的邻接表数据结构定义 2.图的邻接矩阵的存储形式 二、邻接表建立图代码 三、邻接表删除边(基本操作考试不考) 四、邻接表删除顶点及销毁整…

【MySQL进阶】索引

索引机制 索引介绍 MySQL 官方对索引的定义为&#xff1a;索引&#xff08;index&#xff09;是帮助 MySQL 高效获取数据的一种数据结构&#xff0c;**本质是排好序的快速查找数据结构。**在表数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff0c;这…

用el-image-viewer实现全局预览图片

背景 在后台管理系统中&#xff0c;一些预览图片的场景&#xff0c;通常都是使用 el-image-viewer 去实现&#xff0c;但是如果多个地方都需要预览图片&#xff0c;又要重复的去写 el-image-viewer 以及一些重复的和预览相关的代码。 可以把预览图片的组件放在根文件&#x…

洛谷P2615 [NOIP2015 提高组] 神奇的幻方(C语言)

这普及题太水了&#xff0c;你按照他给的条件来列判断语句。 按题目一步一步模拟 首先将1写在第一行的中间。 若K-1在第一行但不在最后一列&#xff0c;则将K填在最后一行&#xff0c;K-1所在列的右一列&#xff1b; 若K-1在最后一列但不在第一行&#xff0c;则将K填在第一…

深入解析与实践:Ajax异步请求在Web开发中的应用指南

一、概述 1、定义 ​ Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;异步请求是现代Web开发中不可或缺的技术组件&#xff0c;它允许网页在不刷新整个页面的情况下从服务器获取并更新数据&#xff0c;从而实现动态、流畅的交互体验。 2、异步和同步 浏览器访…

【NVIDIA】Jetson Orin Nano系列:安装 Qt6、firefox、jtop、flameshot

1、使用命令安装 sudo apt install qtcreator sudo apt install qt6-* sudo apt install libqt6* sudo apt install qml-qt6 sudo apt install qmlscene-qt6 sudo apt install assistant-qt6 sudo apt install designer-qt62、启动 qtcreator 3、常用工具安装 sudo apt in…

计算机找不到msvcp120.dll的修复方法,总结五种可靠的方法

在计算机使用过程中&#xff0c;遭遇“找不到msvcp120.dll”这一问题的困扰是许多用户都可能遇到的情况。这一特定的系统文件msvcp120.dll&#xff0c;作为Microsoft Visual C Redistributable Package的重要组成部分&#xff0c;对于运行某些应用程序至关重要。当系统提示无法…

如何在 Element Plus 中使用自定义 icon 组件 (非组件库内置icon)

先说原理就是将 svg 文件以 vue 组件文件的方式使用 需求&#xff1a;我想要在 Element Plus 得评分组件中使用自定义得图标。 el-rate v-model"value1" /> 组件本身是支持自定义图标的&#xff0c;但是教程中只说明了如何使用 element-plus/icons-vue 图标库内置…

学习Spring的第八天

先对自定义类使用MyComponet的注解&#xff0c;在设置这个MyComponet的的属性(一个 interface接口)&#xff0c;然后&#xff0c;扫描(BaseClassScanUtils.java执行,这文件不重要)当前包下是否有这个注解的类&#xff0c;再用MyComponentBeanFactoryPostProcessor.java(后工厂…

蓝桥杯真题(Python)每日练Day1

说明&#xff1a;在CSP认证的基础上&#xff08;可以看看本人CSP打卡系列的博客&#xff09;备赛2024蓝桥杯&#xff08;Python&#xff09;&#xff0c;本人专业&#xff1a;大数据与数据科学 因此对python要求熟练掌握&#xff0c;通过练习蓝桥杯既能熟悉语法又能锻炼算法和思…

vulnhub-dc2靶场

DC2 配置环境vmware17 nat网络配置 下载地址:DC and Five86 Series Challenges - DC-1 &#xff08;似乎从2024/1/18左右找不到这个资源了&#xff09; 攻击机kali与其在同一网段下 ip:192.168.52.130 信息收集 arp-scan -l #内网探测&#xff0c;扫描目标ip发现目标ip1…

内网穿透Neutrino-Proxy, 中微子代理

中微子代理&#xff08;neutrino-proxy&#xff09;是一个基于netty的、开源的java内网穿透项目。技术栈&#xff1a;Solon、MybatisPlus、Netty遵循MIT许可&#xff0c;因此您可以对它进行复制、修改、传播并用于任何个人或商业行为。官网地址1&#xff1a;https://neutrino-p…

鸿蒙开发环境配置-Windows

背景 入局鸿蒙开发&#xff0c;发现在 Windows 下面配置安装相关环境并没有像 Mac 一样简单&#xff0c;过程中遇到了一些问题记录一下。 Devceo Studio 下载安装 目前鸿蒙的 IDE 最新版是 4.0&#xff0c;通过这个连接可以下载&#xff0c;鸿蒙4.0下载连接。选择符合我们电…

关于前端面试中forEach方法的灵魂7问?

目录 前言 一、forEach方法支持处理异步函数吗&#xff1f; 二、forEach方法在循环过程中能中断吗&#xff1f; 三、forEach 在删除自己的元素后能重置索引吗&#xff1f; 四、forEach 的性能相比for循环哪个好&#xff1f; 五、使用 forEach 会不会改变原来的数组&#…

智能驾驶新浪潮:SSD与UFS存储技术如何破浪前行?-UFS篇

如果说SSD是赛道上的超级跑车&#xff0c;那UFS更像是专为智能汽车定制的高性能轻量化赛车。UFS采用串行接口技术&#xff0c;像是闪电侠一样&#xff0c;将数据传输的速度推向新高&#xff0c;大幅缩短了系统启动时间和应用程序加载时间&#xff0c;这对追求即时反应的ADAS系统…

【从零开始学习Java重要知识 | 第三篇】暴打ReentrantLock底层源码

目录 前言&#xff1a; 前置知识&#xff1a; 什么是公平锁与非公平锁&#xff1f; 尝试自己构造一把锁&#xff1a; ReentrantLock源码&#xff1a; 加锁&#xff1a; 解锁&#xff1a; 总结&#xff1a; 前言&#xff1a; 在并发编程中&#xff0c;线程安全是一个重…

【轮式平衡机器人】——软硬件配置/准备

本系列以轮式平衡移动机器人为例&#xff0c;将使用基于模型设计&#xff08;MBD&#xff09;方法进行介绍&#xff0c;涉及基础硬件、软件、控制算法等多方面内容&#xff0c;结合MATLAB/Simulink的强大仿真能力和代码生成能力辅助设计&#xff01;在此过程中可以系统了解开发…