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

java每日精进 5.19【Excel 导入导出】

基于 EasyExcel 实现 Excel 的读写操作,可用于实现最常见的 Excel 导入导出等功能。

Excel 导入导出功能涉及前后端协作,后端处理数据查询、文件生成和解析,前端提供用户交互和文件下载/上传界面。以下是全流程解析,分为导出流程和导入流程。

1.1 导出流程解析
1.1.1 后端导出(PostController.java)

代码

@GetMapping("/export")
@Operation(summary = "岗位管理")
@PreAuthorize("@ss.hasPermission('system:post:export')")
@ApiAccessLog(operateType = EXPORT)
public void export(HttpServletResponse response, @Validated PostPageReqVO reqVO) throws IOException {// ① 查询数据reqVO.setPageSize(PageParam.PAGE_SIZE_NONE);List<PostDO> list = postService.getPostPage(reqVO).getList();// ② 导出 ExcelExcelUtils.write(response, "岗位数据.xls", "岗位列表", PostRespVO.class,BeanUtils.toBean(list, PostRespVO.class));
}

解析

  • 功能:导出岗位数据为 Excel 文件,供前端下载。
  • 步骤
    1. 查询数据
      • reqVO.setPageSize(PageParam.PAGE_SIZE_NONE):禁用分页,获取所有符合条件的数据。
      • postService.getPostPage(reqVO):调用服务层查询岗位数据,返回 PageResult<PostDO>。
      • getList():提取数据列表(List<PostDO>)。
    2. 数据转换
      • BeanUtils.toBean(list, PostRespVO.class):将 PostDO 列表转换为 PostRespVO 列表,适配 Excel 导出格式。
    3. 导出 Excel
      • ExcelUtils.write:将数据写入 Excel 文件,设置文件名(岗位数据.xls)、Sheet 名(岗位列表)和响应头。
  • 权限控制
    • @PreAuthorize("@ss.hasPermission('system:post:export')"):确保用户有导出权限。
  • 日志记录
    • @ApiAccessLog(operateType = EXPORT):记录导出操作日志。
1.1.2 VO 类(PostRespVO.java)

代码

@Schema(description = "管理后台 - 岗位信息 Response VO")
@Data
@ExcelIgnoreUnannotated
public class PostRespVO {@Schema(description = "岗位序号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")@ExcelProperty("岗位序号")private Long id;@Schema(description = "岗位名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "小土豆")@ExcelProperty("岗位名称")private String name;@Schema(description = "岗位编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "yudao")@ExcelProperty("岗位编码")private String code;@Schema(description = "显示顺序不能为空", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")@ExcelProperty("岗位排序")private Integer sort;@Schema(description = "状态,参见 CommonStatusEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")@ExcelProperty(value = "状态", converter = DictConvert.class)@DictFormat(DictTypeConstants.COMMON_STATUS)private Integer status;@Schema(description = "备注", example = "快乐的备注")private String remark;@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)private LocalDateTime createTime;
}

解析

  • 功能:定义 Excel 导出的数据结构和格式。
  • 注解
    • @ExcelIgnoreUnannotated:忽略未标注 @ExcelProperty 的字段(如 remark、createTime),不导出到 Excel。
    • @ExcelProperty:指定 Excel 列名(如 岗位序号、岗位名称)。
    • @ExcelProperty(value = "状态", converter = DictConvert.class):使用 DictConvert 转换器,将 status(如 1)转换为文字(如 开启)。
    • @DictFormat(DictTypeConstants.COMMON_STATUS):指定字典类型,映射 status 值(0=禁用, 1=开启)。
  • 作用:确保导出的 Excel 列名和数据格式符合预期,字段值经过转换(如状态从数字转为文字)。
1.1.3 工具类(ExcelUtils.java - 导出部分)

代码

public static <T> void write(HttpServletResponse response, String filename, String sheetName,Class<T> head, List<T> data) throws IOException {EasyExcel.write(response.getOutputStream(), head).autoCloseStream(false).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).registerWriteHandler(new SelectSheetWriteHandler(head)).registerConverter(new LongStringConverter()).sheet(sheetName).doWrite(data);response.addHeader("Content-Disposition", "attachment;filename=" + HttpUtils.encodeUtf8(filename));response.setContentType("application/vnd.ms-excel;charset=UTF-8");
}

解析

  • 功能:将数据列表写入 Excel 文件,返回给前端。
  • 步骤
    1. 初始化 EasyExcel
      • EasyExcel.write(response.getOutputStream(), head):使用 EasyExcel 写入响应流,指定 VO 类(如 PostRespVO)。
    2. 配置写入
      • autoCloseStream(false):不自动关闭流,由 Servlet 管理。
      • LongestMatchColumnWidthStyleStrategy:自动调整列宽。
      • SelectSheetWriteHandler:支持下拉框(基于 VO 注解)。
      • LongStringConverter:防止 Long 类型精度丢失。
    3. 写入数据
      • sheet(sheetName).doWrite(data):写入数据到指定 Sheet(如 岗位列表)。
    4. 设置响应头
      • Content-Disposition:指定文件名(如 岗位数据.xls)。
      • Content-Type:设置为 Excel 格式(application/vnd.ms-excel)。
  • 作用:将 PostRespVO 列表转换为 Excel 文件,自动生成表头和数据行。
1.1.4 前端导出(post/index.vue)

代码

handleExport() {const queryParams = this.queryParams;this.$modal.confirm('是否确认导出所有岗位数据项?').then(() => {this.exportLoading = true;return exportPost(queryParams);}).then(response => {this.$download.excel(response, '岗位数据.xls');}).finally(() => {this.exportLoading = false;});
}

解析

  • 功能:触发岗位数据导出,下载 Excel 文件。
  • 步骤
    1. 用户交互
      • 用户点击“导出”按钮,弹出确认框。
    2. 发送请求
      • exportPost(queryParams):调用后端 /admin-api/system/post/export,传递查询参数(如岗位名称、状态)。
    3. 处理响应
      • this.$download.excel(response, '岗位数据.xls'):将响应(Excel 文件流)保存为本地文件。
    4. 状态管理
      • exportLoading:控制加载状态,防止重复点击。
  • 作用:提供用户界面,触发导出请求,处理下载。
1.2 导入流程解析
1.2.1 后端导入(UserController.java)

代码

@PostMapping("/import")
@Operation(summary = "导入用户")
@Parameters({@Parameter(name = "file", description = "Excel 文件", required = true),@Parameter(name = "updateSupport", description = "是否支持更新,默认为 false", example = "true")
})
@PreAuthorize("@ss.hasPermission('system:user:import')")
public CommonResult<UserImportRespVO> importExcel(@RequestParam("file") MultipartFile file,@RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws Exception {List<UserImportExcelVO> list = ExcelUtils.read(file, UserImportExcelVO.class);return success(userService.importUserList(list, updateSupport));
}

解析

  • 功能:从 Excel 文件导入用户数据,保存到数据库。
  • 步骤
    1. 解析 Excel
      • ExcelUtils.read(file, UserImportExcelVO.class):读取 Excel 文件,转换为 List<UserImportExcelVO>。
    2. 处理数据
      • userService.importUserList(list, updateSupport):将解析的数据导入数据库,支持更新现有用户(updateSupport=true)。
    3. 返回结果
      • CommonResult<UserImportRespVO>:返回导入结果(如成功/失败记录数)。
  • 参数
    • file:上传的 Excel 文件(MultipartFile)。
    • updateSupport:是否更新已有用户(默认 false)。
  • 权限控制
    • @PreAuthorize("@ss.hasPermission('system:user:import')"):确保用户有导入权限。
1.2.2 VO 类(UserImportExcelVO.java)

code

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = false)
public class UserImportExcelVO {@ExcelProperty("登录名称")private String username;@ExcelProperty("用户名称")private String nickname;@ExcelProperty("部门编号")private Long deptId;@ExcelProperty("用户邮箱")private String email;@ExcelProperty("手机号码")private String mobile;@ExcelProperty(value = "用户性别", converter = DictConvert.class)@DictFormat(DictTypeConstants.USER_SEX)private Integer sex;@ExcelProperty(value = "账号状态", converter = DictConvert.class)@DictFormat(DictTypeConstants.COMMON_STATUS)private Integer status;
}

解析

  • 功能:定义 Excel 导入的数据结构。
  • 注解
    • @ExcelProperty:指定 Excel 列名(如 登录名称、用户名称)。
    • @ExcelProperty(value = "用户性别", converter = DictConvert.class):将文字(如 男)转换为数字(如 1),基于 USER_SEX 字典。
    • @DictFormat:指定字典类型(如 USER_SEX、COMMON_STATUS)。
    • @Accessors(chain = false):禁用链式 setter,防止导入时序列化问题。
  • 作用:映射 Excel 列到 Java 对象,确保导入数据正确解析。
1.2.3 工具类(ExcelUtils.java - 导入部分)

Code

public static <T> List<T> read(MultipartFile file, Class<T> head) throws IOException {return EasyExcel.read(file.getInputStream(), head, null).autoCloseStream(false).doReadAllSync();
}

解析

  • 功能:从 Excel 文件读取数据,转换为 Java 对象列表。
  • 步骤
    1. 初始化 EasyExcel
      • EasyExcel.read(file.getInputStream(), head, null):读取 Excel 文件,指定 VO 类(如 UserImportExcelVO)。
    2. 读取数据
      • doReadAllSync():同步读取所有数据,返回 List<T>。
    3. 流管理
      • autoCloseStream(false):不自动关闭流,由 Servlet 管理。
  • 作用:将 Excel 行转换为 UserImportExcelVO 对象,供后端处理。
1.2.4 前end导入(post/index.vue - 用户导入部分)

Code

<el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body><el-upload ref="upload" :limit="1" accept=".xlsx, .xls" :headers="upload.headers":action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading":on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag><i class="el-icon-upload"></i><div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div><div class="el-upload__tip text-center" slot="tip"><div class="el-upload__tip" slot="tip"><el-checkbox v-model="upload.updateSupport" /> 是否更新已经存在的用户数据</div><span>仅允许导入xls、xlsx格式文件。</span><el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;" @click="importTemplate">下载模板</el-link></div></el-upload><div slot="footer" class="dialog-footer"><el-button type="primary" @click="submitFileForm">确 定</el-button><el-button @click="upload.open = false">取 消</el-button></div>
</el-dialog>

解析

  • 功能:提供用户界面,上传 Excel 文件,触发导入。
  • 步骤
    1. 用户交互
      • 用户点击“导入”按钮,打开对话框,选择 Excel 文件(.xls 或 .xlsx)。
      • 勾选 updateSupport(是否更新现有用户)。
    2. 上传配置
      • accept=".xlsx, .xls":限制文件类型。
      • action="upload.url + '?updateSupport=' + upload.updateSupport":动态拼接 URL(如 /admin-api/system/user/import?updateSupport=true)。
      • headers:携带认证 token(Authorization: Bearer xxx)。
      • on-progress:显示上传进度。
      • on-success:处理导入结果,显示成功/失败信息。
    3. 触发上传
      • submitFileForm:调用 this.$refs.upload.submit(),发送 POST /admin-api/system/user/import 请求。
    4. 模板下载
      • importTemplate:下载 Excel 模板,引导用户按格式填写。
  • 作用:提供用户友好的导入界面,支持文件选择和上传。

Excel 全流程总结

导出流程

  1. 前端触发:用户在 post/index.vue 点击“导出”按钮,调用 handleExport,发送 GET /admin-api/system/post/export 请求。
  2. 后端查询:PostController 查询岗位数据(PostDO),转换为 PostRespVO。
  3. 后端生成 Excel:ExcelUtils.write 使用 EasyExcel 将 PostRespVO 列表写入 Excel,设置响应头。
  4. 前端下载:前端接收 Excel 文件流,调用 $download.excel 保存为 岗位数据.xls。

导入流程

  1. 前端触发:用户在 post/index.vue 打开导入对话框,选择 Excel 文件,设置 updateSupport,点击“确定”触发上传。
  2. 前端上传:<el-upload> 发送 POST /admin-api/system/user/import 请求,携带 Excel 文件和参数。
  3. 后端解析:UserController 使用 ExcelUtils.read 解析 Excel 为 List<UserImportExcelVO>。
  4. 后一致性:userService.importUserList 处理数据,保存到数据库,返回导入结果(UserImportRespVO)。
  5. 前端反馈:前端显示导入结果(如成功/失败记录数)。

字段转换原理解析

EasyExcel Converter 接口

  • EasyExcel 的 Converter 接口用于在 Excel 和 Java 对象之间进行字段值转换,处理数据格式不一致的情况(如 Excel 中的文字与 Java 中的数字)。
  • 核心方法
    1. convertToJavaData:将 Excel 单元格值转换为 Java 对象字段值。
      • 示例:Excel 的“开启”转换为 Java 的 status = 1。
    2. convertToExcelData:将 Java 对象字段值转换为 Excel 单元格值。
      • 示例:Java 的 status = 1转换为 Excel 的“开启”。

DictConvert 作用

  • DictConvert 是自定义转换器,基于字典框架(DictFrameworkUtils)实现字段值与字典标签的转换。
  • 用途:将数字(如 1)与文字(如 开启)相互映射,常用于状态、性别等枚举字段。

2. DictConvert 代码解析

以下是 DictConvert 的代码和逐行解析:

@Slf4j
public class DictConvert implements Converter<Object> {@Overridepublic Class<?> supportJavaTypeKey() {throw new UnsupportedOperationException("暂不支持,也不需要");}@Overridepublic CellDataTypeEnum supportExcelTypeKey() {throw new UnsupportedOperationException("暂不支持,也不需要");}@Overridepublic Object convertToJavaData(ReadCellData readCellData, ExcelContentProperty contentProperty,GlobalConfiguration globalConfiguration) {// 使用字典解析String type = getType(contentProperty);String label = readCellData.getStringValue();String value = DictFrameworkUtils.parseDictDataValue(type, label);if (value == null) {log.error("[convertToJavaData][type({}) 解析不掉 label({})]", type, label);return null;}// 将 String 的 value 转换成对应的属性Class<?> fieldClazz = contentProperty.getField().getType();return Convert.convert(fieldClazz, value);}@Overridepublic WriteCellData<String> convertToExcelData(Object object, ExcelContentProperty contentProperty,GlobalConfiguration globalConfiguration) {// 空时,返回空if (object == null) {return new WriteCellData<>("");}// 使用字典格式化String type = getType(contentProperty);String value = String.valueOf(object);String label = DictFrameworkUtils.getDictDataLabel(type, value);if (label == null) {log.error("[convertToExcelData][type({}) 转换不了 label({})]", type, value);return new WriteCellData<>("");}// 生成 Excel 小表格return new WriteCellData<>(label);}private static String getType(ExcelContentProperty contentProperty) {return contentProperty.getField().getAnnotation(DictFormat.class).value();}
}

解析

  • 接口实现
    • 实现 Converter<Object>,支持任意类型的字段转换。
    • supportJavaTypeKey 和 supportExcelTypeKey 未实现,表明 DictConvert 不限制字段类型,依靠注解动态处理。
  • convertToJavaData(Excel -> Java):
    1. 获取字典类型
      • getType(contentProperty):从字段的 @DictFormat 注解获取字典类型(如 COMMON_STATUS)。
    2. 读取 Excel 值
      • readCellData.getStringValue():获取 Excel 单元格的字符串值(如 开启)。
    3. 字典解析
      • DictFrameworkUtils.parseDictDataValue(type, label):将文字(如 开启)转换为字典值(如 1)。
      • 示例:COMMON_STATUS 字典可能定义 { "0": "禁用", "1": "开启" }。
    4. 类型转换
      • Convert.convert(fieldClazz, value):将字符串值(如 "1")转换为字段类型(如 Integer)。
    5. 错误处理
      • 如果 value 为 null(字典未找到对应值),记录错误日志,返回 null。
  • convertToExcelData(Java -> Excel):
    1. 空值处理
      • 如果 object 为 null,返回空字符串。
    2. 获取字典类型
      • 同上,通过 @DictFormat 获取 type。
    3. 字典转换
      • DictFrameworkUtils.getDictDataLabel(type, value):将 Java 值(如 1)转换为字典标签(如 开启)。
    4. 返回结果
      • WriteCellData<String>(label):将标签写入 Excel 单元格。
    5. 错误处理
      • 如果 label 为 null,记录错误,返回空字符串。
  • getType
    • 提取字段上的 @DictFormat 注解值(如 COMMON_STATUS),确定字典类型。

作用

  • 实现 Excel 和 Java 之间的双向转换,确保状态、性别等字段在导入导出时保持一致(如 1 <-> 开启)。
  • 依赖 DictFrameworkUtils 提供的字典数据(如 COMMON_STATUS、USER_SEX)。

4. EasyExcel 注解解析

以下是文档中提到的 EasyExcel 注解,结合代码和上下文说明其作用,并提供实例。

4.1 @ExcelProperty
  • 作用:指定 Excel 列名、序号或转换器。
  • 参数
    • value:列名(如 "岗位名称")。
    • index:列序号(与 value 二选一)。
    • converter:转换器(如 DictConvert.class)。
  • 示例

    @ExcelProperty("岗位名称") private String name;

    • 输出:Excel 列名为 岗位名称,值来自 name 字段。
4.2 @ColumnWidth
  • 作用:设置列宽(单位:字符)。
  • 示例

    @ColumnWidth(18) @ExcelProperty("岗位编码") private String code;

    • 输出:岗位编码 列宽为 18 个字符。
4.3 @ContentFontStyle
  • 作用:设置单元格字体样式。
  • 示例

    @ContentFontStyle(fontName = "Arial", fontHeightInPoints = 12, bold = true) @ExcelProperty("岗位名称") private String name;

    • 输出:岗位名称 列使用 Arial 字体,12 磅,加粗。
4.4 @ContentLoopMerge
  • 作用:合并单元格。
  • 示例

    @ContentLoopMerge(eachRow = 2) @ExcelProperty("部门") private String dept;

    • 输出:每 2 行合并 部门 列。
4.5 @ContentRowHeight
  • 作用:设置行高。
  • 示例

    @ContentRowHeight(20) @ExcelProperty("备注") private String remark;

    • 输出:备注 行高为 20。
4.6 @ContentStyle
  • 作用:设置单元格样式(如对齐、边框、背景色)。
  • 示例

    @ContentStyle(horizontalAlignment = HorizontalAlignment.CENTER, fillBackgroundColor = IndexedColors.YELLOW) @ExcelProperty("状态") private Integer status;

    • 输出:状态 列居中,黄色背景。
4.7 @HeadFontStyle
  • 作用:设置标题字体样式。
  • 示例

    @HeadFontStyle(fontName = "Calibri", bold = true) @ExcelProperty("岗位名称") private String name;

    • 输出:岗位名称 标题使用 Calibri 字体,加粗。
4.8 @HeadRowHeight
  • 作用:设置标题行高。
  • 示例

    @HeadRowHeight(25) @ExcelProperty("岗位编码") private String code;

    • 输出:标题行高为 25。
4.9 @HeadStyle
  • 作用:设置标题样式。
  • 示例

    @HeadStyle(fillForegroundColor = IndexedColors.BLUE) @ExcelProperty("状态") private Integer status;

    • 输出:状态 标题蓝色背景。
4.10 @ExcelIgnore
  • 作用:忽略字段,不导出到 Excel。
  • 示例

    @ExcelIgnore private String internalCode;

    • 输出:internalCode 不出现在 Excel 中。
4.11 @ExcelIgnoreUnannotated
  • 作用:忽略未标注 @ExcelProperty 的字段。
  • 示例

    @ExcelIgnoreUnannotated public class PostRespVO { @ExcelProperty("岗位名称") private String name; private String remark; // 未标注 }

    • 输出:remark 不导出。

相关文章:

java每日精进 5.19【Excel 导入导出】

基于 EasyExcel 实现 Excel 的读写操作&#xff0c;可用于实现最常见的 Excel 导入导出等功能。 Excel 导入导出功能涉及前后端协作&#xff0c;后端处理数据查询、文件生成和解析&#xff0c;前端提供用户交互和文件下载/上传界面。以下是全流程解析&#xff0c;分为导出流程…...

java基础(api)

包&#xff1a; 导包&#xff0c;不同包的程序名相同。 但是要用两个的话可以这样子写&#xff1a; String String概述 String的常用方法 String使用时的注意事项 String的应用案例...

CentOS7/Ubuntu SSH配置允许ROOT密码登录

CentOS7 打开SSHD配置文件 vim /etc/ssh/sshd_config 找到注释行&#xff0c;如果没有就添加。 #PermitRootLogin yes 把注释取消掉。 执行下述命令&#xff0c;重启SSHD服务即可。 systemctl restart sshd.service Ubuntu 先安装SSH服务器&#xff0c;CentOS7默认就安…...

C++ HTTP框架推荐

1. Crow 特点&#xff1a;高性能异步框架&#xff0c;支持Linux、macOS和Windows 优势&#xff1a; 轻量级&#xff1a;整个框架只有一个头文件&#xff0c;易于集成到项目中 简单易用&#xff1a;API设计简洁直观&#xff0c;学习曲线平缓 高性能&#xff1a;基于Boost.Asi…...

算法打卡第二天

5.爬楼梯(动态规划) 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2…...

VSCode推出开源Github Copilot:AI编程新纪元

文章目录 开源决策的背后GitHub Copilot的演进历程Copilot Chat核心功能解析1. 聊天界面集成2. 代码理解与生成3. 多文件编辑能力4. 智能代理模式 开源后的影响与展望对开发者的影响对AI编程工具市场的影响未来发展方向 如何开始使用GitHub Copilot结语相关学习资源 在AI编程助…...

Mujoco 学习系列(四)官方模型仓库 mujoco_menagerie

mujoco 官方在 Github 上发布了一个他们自己整理的高质量的模型仓库&#xff0c;这个仓库是一个持续维护的项目&#xff0c;里面包含了目前市面上常见的人形机器人、机械臂、底盘等模型&#xff0c;对于初学者而言是一个非常好的学习资料&#xff0c;无论是想在仿真环境中尝试还…...

代码走读 Go 语言 Map 的实现

序言 在日常的开发当中&#xff0c;我们一定离不开一个数据结构字典。不仅可以存储关联数据对&#xff0c;还可以在 O(1) 的时间复杂度进行查找。很久之前在 一篇文章带你实现 哈希表 介绍了相关的原理以及简单的实现。所以这篇文章中我们就不多赘述哈希表的原理&#xff0c;而…...

PostgreSQL14 +patroni+etcd+haproxy+keepalived 集群部署指南

使用postgresql etcd patroni haproxy keepalived可以实现PG的高可用集群&#xff0c;其中&#xff0c;以postgresql做数据库&#xff0c;Patroni监控本地的PostgreSQL状态&#xff0c;并将本地PostgreSQL信息/状态写入etcd来存储集群状态&#xff0c;所以&#xff0c;patr…...

数据结构知识点汇总

1、在数据结构中&#xff0c;随机访问是指能够直接访问任一元素&#xff0c;而不需要从特定的起始位置开始&#xff0c;也不需要按顺序访问其他元素。这种访问方式通常不涉及遍历。例如&#xff0c;数组&#xff08;array&#xff09;支持随机访问&#xff0c;你可以直接通过索…...

雅思英语考试基本介绍

考试分类 雅思&#xff08;国际英语语言测试系统&#xff0c;International English Language Testing System 即IELTS&#xff09;主要分为两大类&#xff1a; 学术类&#xff08;A类&#xff09; 这是我可能会选择的一种&#xff08;✓&#xff09;&#xff0c;专为申请大学…...

基于YOLO11深度学习的变压器漏油检测系统【Python源码+Pyqt5界面+数据集+安装使用教程+训练代码】【附下载链接】

文章目录 引言软件主界面源码目录文件说明一、环境安装(1)安装python(2)安装软件所需的依赖库 二、软件核心功能介绍及效果演示(1)软件核心功能(2)软件效果演示 三、模型的训练、评估与推理(1)数据集准备与训练(2)训练结果评估(3)使用训练好的模型识别 四、完整相关文件及源码下…...

线上 Linux 环境 MySQL 磁盘 IO 高负载深度排查与性能优化实战

目录 一、线上告警 二、问题诊断 1. 系统层面排查 2. 数据库层面分析 三、参数调优 1. sync_binlog 参数优化 2. innodb_flush_log_at_trx_commit 参数调整 四、其他优化建议 1. 日志文件位置调整 2. 生产环境核心参数配置模板 3. 突发 IO 高负载应急响应方案 五、…...

【洛谷 P9025】 [CCC2021 S3] Lunch Concert 题解

题目&#xff1a; 洛谷 P9025 分析&#xff1a; 为了解决这个问题&#xff0c;我们需要找到一个整数位置 c 来举办音乐会&#xff0c;使得所有人移动到能听到音乐会的位置的时间总和最小。每个人移动后的位置应该在其听力范围内&#xff0c;并且尽可能靠近自己的初始位置以减少…...

Python 包管理工具核心指令uvx解析

uvx 是 Python 包管理工具 uv 的重要组成部分&#xff0c;主要用于在隔离环境中快速运行 Python 命令行工具或脚本&#xff0c;无需永久安装工具包。以下是其核心功能和使用场景的详细解析&#xff1a; 一、uvx 的定位与核心功能 工具执行器的角色 uvx 是 uv tool run 的别名&a…...

苍穹外卖05 Redis常用命令在Java中操作Redis_Spring Data Redis使用方式店铺营业状态设置

2-8 Redis常用命令 02 02-Redis入门 ctrlc :快捷结束进程 配置密码&#xff1a; 以后再启动客户端的时候就需要进行密码的配置了。使用-a 在图形化界面中创建链接&#xff1a; 启动成功了。 03 03-Redis常用数据类型 04 04-Redis常用命令_字符串操作命令 05 05-Redis常用命令…...

AI工程师系列——面向copilot编程

前言 ​ 笔者已经使用copilot协助开发有一段时间了,但一直没有总结一个协助代码开发的案例,特别是怎么问copilot,按照什么顺序问,哪些方面可以高效的生成需要的代码,这一次,笔者以IP解析需求为例,沉淀一个实践案例,供大家参考 当然,其实也不局限于copilot本身,类似…...

【竖排繁体识别】如何将竖排繁体图片文字识别转横排繁体,转横排简体导出文本文档,基于WPF和腾讯OCR的实现方案

一、应用场景 在古籍数字化、繁体文档处理、两岸三地文化交流等场景中,经常需要将竖排繁体文字转换为横排文字。例如: 古籍研究人员需要将竖排繁体文献转换为现代横排简体格式以便编辑和研究出版行业需要将繁体竖排排版转换为简体横排格式两岸三地交流中需要将繁体竖排文档转…...

梳理Spring Boot中三种异常处理

在 Spring Boot 中处理异常确实有多个方式&#xff0c;比如使用 ControllerAdvice、 BasicErrorController、HandlerExceptionResolver等。不同方式适合不同的场景&#xff0c;下面是对这些方式的分析以及如何选择的建议&#xff1a; &#x1f9e9; 1. ControllerAdvice Exce…...

NFS服务器实验

实验要求 架设一台NFS服务器&#xff0c;并按照以下要求配置 1、开放/nfs/shared目录&#xff0c;供所有用户查询资料 2、开放/nfs/upload目录&#xff0c;为192.168.xxx.0/24网段主机可以上传目录&#xff0c;并将所有用户及所属的组映射为nfs-upload,其UID和GID均为210 3…...

ffmpeg 转换视频格式

使用FFmpeg将视频转换为MP4格式的常用命令&#xff1a; ffmpeg -i input.mov -c:v libx264 -crf 23 -c:a aac output.mp4 -i input.avi&#xff1a;指定输入文件 -c:v libx264&#xff1a;使用H.264视频编码器 -crf 23&#xff1a;控制视频质量&#xff08;范围18-28&#…...

Java进阶之新特性

Java新特性 参考 官网&#xff1a;https://docs.oracle.com/en/ JDK5新特性 1.自动装箱与拆箱 自动装箱的过程&#xff1a;每当需要一种类型的对象时&#xff0c;这种基本类型就自动地封装到与它相同类型的包装类中。 自动拆箱的过程&#xff1a;每当需要一个值时&#xf…...

Python基础学习-Day32

面对一个全新的官方库&#xff0c;是否可以借助官方文档的写法了解其如何使用。 我们以pdpbox这个机器学习解释性库来介绍如何使用官方文档。 大多数 Python 库都会有官方文档&#xff0c;里面包含了函数的详细说明、用法示例以及版本兼容性信息。 通常查询方式包含以下2种&…...

离线服务器算法部署环境配置

本文将详细记录我如何为一台全新的离线服务器配置必要的运行环境&#xff0c;包括基础编译工具、NVIDIA显卡驱动以及NVIDIA-Docker&#xff0c;以便顺利部署深度学习算法。 前提条件&#xff1a; 目标离线服务器已安装操作系统&#xff08;本文以Ubuntu 18.04为例&#xff09…...

AIGC工具平台-卡通图片2D转绘3D

本模块是一款智能化的2D转3D图像处理工具&#xff0c;能够将卡通风格的2D图片自动转换为高质量3D渲染模型&#xff0c;让平面图像焕发立体生机。借助先进的AI深度学习算法&#xff0c;该工具可以精准识别角色轮廓、光影关系、材质纹理等关键元素&#xff0c;自动生成逼真的3D形…...

docker 启动一个python环境的项目dockerfile版本

文件格式 /home/py/docker/ # 项目根目录 ├── Dockerfile # Docker 构建文件 ├── requirements.txt # Python 依赖清单 └── src/ # 项目代码目录└── api_mock.py # Flask 应用入口文件Dockerfile # 使用…...

Java虚拟机 -方法调用

方法调用 方法调用静态链接动态链接案例虚方法与非虚方法虚方法&#xff08;Virtual Method&#xff09;非虚方法&#xff08;Non-Virtual Method&#xff09; 方法返回地址 方法调用 我们编写Java程序的时候&#xff0c;我们自己写的类通常不仅仅是调用自己本类的方法。调用别…...

基于matlabcd7.x的无网格近似方法

无网格近似方法&#xff08;Meshless Methods&#xff09;是一类数值计算方法&#xff0c;用于解决偏微分方程&#xff08;PDEs&#xff09;问题&#xff0c;特别是在几何形状复杂或需要动态网格更新的场景中。与传统的有限元方法&#xff08;FEM&#xff09;相比&#xff0c;无…...

JMeter JDBC请求Query Type实测(金仓数据库版)

文章目的 在实际性能测试中&#xff0c;JMeter的JDBC Request组件常用于模拟数据库操作。但许多用户对Query Type参数的具体行为存在疑惑。 本文将以金仓数据库KingbaseES为例&#xff0c;通过实测验证每种Query Type的行为&#xff0c;帮助用户明确其使用场景和限制&#xff…...

【内部教程】ISOLAR-AB配置以太网栈|超详细实战版

目录 往期推荐 缩写与定义 关于系统描述&#xff08;System Description&#xff09; 1.1 EthCommunicationController 1.2 EthCommunicationConnector 1.2.1 Ports&#xff08;端口&#xff09; 1.3 EthPhysicalChannel&#xff08;以太网物理通道&#xff09; 1.3.1…...