Java 中实现 Excel 导入一些疑难杂症

在 Java 中实现 Excel 导入功能时,除了已讨论的字段映射、类型转换和内存管理外,还需注意以下关键问题,结合常见踩坑点和最佳实践总结如下:


⚙️ 一、文件与格式校验

  1. 文件类型与版本兼容性
    • 明确区分 .xls(HSSF)和 .xlsx(XSSF)格式。使用 Apache POI 时,需确保依赖版本兼容(如 poi-ooxml 支持 .xlsx)14。
    • 上传前校验文件类型(如通过 MIME 类型 application/vnd.openxmlformats-officedocument.spreadsheetml.sheet),避免解析非 Excel 文件15。
  1. 表头动态性与容错
    • 避免依赖固定列顺序,改用表头名称匹配(如 headMap 映射),防止列位置变动导致解析失败18。
    • 长表头或含特殊字符(如公式符号 *;)时,建议使用列索引(@ExcelProperty(index = N))或动态匹配策略4。

⚠️ 二、数据解析陷阱

  1. 数字与文本混淆
    • Excel 中数字可能被存储为文本格式(如身份证号),解析时触发 NumberFormatException。解决方案:
      • 使用 DataFormatter 统一按字符串读取,再手动转换类型17。
      • 预校验单元格格式:if (cell.getCellType() == CellType.STRING) { ... }3。
  1. 日期格式不一致
    • 不同区域设置可能导致日期解析失败(如 MM/dd/yyyy vs dd/MM/yyyy)。
      • 强制统一格式:CellDateUtil.getJavaDate(cell.getNumericCellValue()) 结合 SimpleDateFormat 转换13。
      • 使用 POI 的 DataFormatter 自动适配 Excel 日期格式8。
  1. 空值与特殊字符处理
    • 空单元格可能返回 null、空字符串或 Blank 类型,需统一处理(如替换为默认值)3。
    • 隐藏字符(如换行符 \n、不可见空格)可能破坏数据,用 String.trim()StringUtils.strip() 清理79。

⚡ 三、内存与性能优化

  1. 流式解析与分批次处理
    • 大文件必用流式 API
      • Apache POI 的 SXSSFWorkbook(写)或 StreamingReader(读)14。
      • EasyExcel 逐行解析(AnalysisEventListener),避免 OOM46。
    • 分批次入库:每读取 N 行(如 1000 行)批量写入数据库,减少事务开销5。
  1. 资源泄露预防

使用 try-with-resources 确保关闭流和 Workbook 对象:

    • java复制下载
try (Workbook workbook = WorkbookFactory.create(inputStream)) {// 解析逻辑
} // 自动关闭资源:cite[5]
    • SXSSFWorkbook 需额外调用 dispose() 清理临时文件5。

🧩 四、业务逻辑健壮性

  1. 数据有效性校验
    • 在解析层(非业务层)验证数据:
      • 数值范围(如销售额 ≥0)、枚举值合法性(如状态字段值在预设范围内)。
      • 连续空行或无效数据超阈值时,中断解析并报错57。
  1. 并发与限流控制
    • 限制同时处理的请求数(如 Semaphore 控制并发),避免高并发解析导致 Full GC5。
    • 动态设置文件大小(如 ≤10MB)和行数上限(如 ≤10万行),超出则拒绝5。

🛠️ 五、工具选型与扩展

  1. 库的选择建议
    • 开源推荐
      • 常规场景:Apache POI(功能全面,文档丰富)48。
      • 大数据量:EasyExcel(内存优化,API 简洁)46。
    • 收费场景
      • 复杂格式或离线转换:Spire.XLS(支持低版本 Excel 转换)4。
  1. 异常监控与日志
    • 捕获特定异常(如 EmptyFileExceptionEncryptedDocumentException),记录文件名、Sheet 名和行号,便于快速定位问题79。
    • 使用 AnalysisEventListeneronException 方法捕获解析期异常4。

💎 总结:关键检查清单

类别

必做项

文件校验

校验 MIME 类型 + 文件扩展名 + 大小/行数上限5

数据解析

使用 DataFormatter

处理格式 + 预清洗特殊字符 + 空值兜底13

内存管理

流式 API(EasyExcel/POI Streaming) + 分批次入库45

业务校验

字段合法性校验 + 连续错误中断机制57

资源释放

try-with-resources

+ workbook.dispose()

(SXSSF)5

实际开发中,结合日志监控 + 单元测试覆盖边界用例(如超大数据、含公式单元格)能显著提升稳定性。若遇性能瓶颈,可考虑异步任务 + 进度反馈机制5。

EasyExcel 中未使用 @ExcelIgnore 的影响分析

当导入接收对象中有字段未添加 @ExcelIgnore 注解时,可能会产生以下影响:

主要影响

  1. 数据映射错误(最常见问题)
    • EasyExcel 会尝试将 Excel 列映射到未忽略的字段
    • 如果 Excel 中没有对应列,字段会被设置为 null
    • 如果字段类型不匹配,会抛出类型转换异常
  1. 敏感数据泄露风险
    • 如果 DTO 中包含敏感字段(如密码、密钥等)
    • 攻击者可以在 Excel 中添加对应列来注入数据
    • 可能导致敏感信息被意外接收和处理
  1. 数据污染
    • 未忽略字段可能被意外设置值
    • 特别是当 Excel 中有相似名称的列时
    • 导致业务逻辑使用错误数据
  1. 性能影响
    • EasyExcel 会尝试为所有未忽略字段做映射和类型转换
    • 字段越多,性能开销越大(尤其大数据量导入时)

具体场景分析

场景1:DTO 包含额外业务字段

@Data
public class PerformanceDTO {@ExcelProperty("销售额")private BigDecimal sales;// 未忽略的业务状态字段private Integer status; // 未忽略的关联IDprivate Long userId;
}

风险

  • 攻击者可在 Excel 中添加 "status" 列注入非法状态
  • 可添加 "user_id" 列尝试越权关联其他用户数据

场景2:DTO 继承父类字段

j

@Data
public class BaseDTO {// 未忽略的审计字段private String createBy;private Date createTime;
}public class PerformanceDTO extends BaseDTO {@ExcelProperty("销售额")private BigDecimal sales;
}

风险

  • 攻击者可添加 "create_by" 列伪造创建人
  • 添加 "create_time" 列破坏时间戳逻辑

场景3:包含敏感信息字段

@Data
public class EmployeeDTO {@ExcelProperty("姓名")private String name;// 未忽略的敏感字段private String idCard; // 身份证号private String bankAccount; // 银行账号
}

风险:严重的数据泄露漏洞,攻击者可批量获取敏感信息

最佳实践解决方案

1. 显式忽略非 Excel 字段(推荐)

@Data
public class PerformanceDTO {@ExcelProperty("销售额")private BigDecimal sales;@ExcelIgnore // 明确忽略private Integer status;@ExcelIgnore // 明确忽略private Long userId;
}

2. 使用独立的导入DTO

// 专用于导入的DTO
@Data
public class PerformanceImportDTO {@ExcelProperty("销售额")private BigDecimal sales;@ExcelProperty("部门利润")private BigDecimal profit;
}// 在Service中转换到业务对象
public void importData(PerformanceImportDTO importDTO) {Performance entity = new Performance();entity.setSales(importDTO.getSales());entity.setProfit(importDTO.getProfit());// 设置其他业务字段...repository.save(entity);
}

3. 严格校验导入字段(防御性编程)

public class StrictImportListener extends AnalysisEventListener<PerformanceDTO> {private final Set<String> allowedHeaders = Set.of("销售额", "部门利润", "核算利润");@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {// 校验表头合法性for (String header : headMap.values()) {if (!allowedHeaders.contains(header)) {throw new ExcelAnalysisException("非法表头字段: " + header);}}}// ...
}

4. 使用白名单配置

@ExcelIgnoreUnannotated // 关键注解:忽略所有未显式标注@ExcelProperty的字段
@Data
public class SecureImportDTO {@ExcelProperty("销售额")private BigDecimal sales;// 以下字段自动被忽略private String internalCode;private Long auditUserId;private Integer status;
}

完整安全导入示例

// 1. 安全的导入DTO
@ExcelIgnoreUnannotated // 忽略所有未标注字段
@Data
public class PerformanceImportDTO {@ExcelProperty("销售额")private BigDecimal sales;@ExcelProperty("部门利润")private BigDecimal profit;@ExcelProperty("核算利润")private BigDecimal calculateProfit;
}// 2. 带校验的监听器
public class SafeImportListener extends AnalysisEventListener<PerformanceImportDTO> {private static final Set<String> ALLOWED_HEADERS = Set.of("销售额", "部门利润", "核算利润");@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {headMap.values().forEach(header -> {if (!ALLOWED_HEADERS.contains(header)) {throw new ExcelSecurityException("禁止的导入字段: " + header);}});}@Overridepublic void invoke(PerformanceImportDTO data, AnalysisContext context) {// 业务校验if (data.getSales() == null || data.getSales().compareTo(BigDecimal.ZERO) < 0) {throw new ExcelDataException("销售额数据不合法");}// 处理逻辑...}// ...
}// 3. 导入服务
public void importPerformance(MultipartFile file) {try (ExcelReader excelReader = EasyExcel.read(file.getInputStream()).registerReadListener(new SafeImportListener()).build()) {ReadSheet readSheet = EasyExcel.readSheet(0).head(PerformanceImportDTO.class).build();excelReader.read(readSheet);}
}

总结建议

  1. 始终使用 @ExcelIgnore:为所有非 Excel 源字段添加该注解
  2. 优先使用 @ExcelIgnoreUnannotated:自动忽略未标注字段,更安全
  3. 创建专用导入DTO:与业务实体分离,避免字段泄露
  4. 实施表头白名单校验:防止非法字段注入
  5. 定期安全审计:检查所有导入DTO是否有未忽略的敏感字段

安全提示:根据OWASP数据,约15%的数据泄露事件源于不当的导入/导出功能实现。合理的字段忽略策略是数据安全的重要防线。

对应返回字段bScore这种定义要设置@JsonProperty(value = "bScore")返回的json数据才是bScore,不然是bscore

@ApiModelProperty(value = "B绩效得分")
@JsonSerialize(using = CustomizeNumberSerialize.class)
@JsonProperty(value = "bScore")
private BigDecimal bScore;

您提到的关于 bScore 字段的 JSON 序列化问题非常关键,这涉及到 Java 对象到 JSON 的命名策略问题。以下是详细分析和解决方案:

问题原因分析

  1. 默认命名策略行为
    • Jackson(Spring Boot 默认 JSON 处理器)使用 LOWER_CAMEL_CASE 策略

对于 bScore 字段:

public class MyDTO {private Double bScore; // 未加注解
}
    • 默认序列化结果为:{"bscore": 95.5}(首字母小写)
  1. 特殊情况处理
    • 当字段名前两个字母连续大写时(如 BScore),Jackson 会保留原样
    • bScore 的首字母小写,第二个字母大写,被识别为驼峰命名

解决方案汇总

方案 1:使用 @JsonProperty(推荐)
public class MyDTO {@JsonProperty("bScore")private Double bScore;
}
  • ✅ 精确控制输出字段名
  • ✅ 兼容性好,适用于所有场景
方案 2:全局命名策略配置

application.properties 中:

# 使用小写字母+下划线策略(会转换为 b_score)
spring.jackson.property-naming-strategy=SNAKE_CASE# 或保持原样(不推荐,可能有副作用)
spring.jackson.property-naming-strategy=LOWER_CAMEL_CASE
方案 3:自定义命名策略(高级)
@Configuration
public class JacksonConfig {@Beanpublic Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {return builder -> {builder.propertyNamingStrategy(new PropertyNamingStrategy() {@Overridepublic String nameForField(MapperConfig<?> config, AnnotatedField field, String defaultName) {if (field.getName().equals("bScore")) {return "bScore"; // 特定字段处理}return super.nameForField(config, field, defaultName);}});};}
}

特殊情况处理

当字段名包含 连续大写字母 时:

public class SpecialCase {private String HTTPStatus; // 需要保持全大写private String bScore;     // 需要保持 bScore
}

使用组合方案:

public class SpecialCase {@JsonProperty("HTTPStatus")private String HTTPStatus;@JsonProperty("bScore")private String bScore;
}

最佳实践建议

前后端分离项目

  1. java复制下载
@Data
public class ApiResponse {@JsonProperty("responseCode")private String code;@JsonProperty("responseData")private Object data;
}

使用 Lombok 时的注意事项

  1. java复制下载
@Data
@JsonPropertyOrder({"bScore", "aValue"}) // 控制字段顺序
public class DTO {@JsonProperty("bScore")private Double bScore;@JsonProperty("aValue")private Integer aValue;
}

序列化测试用例

  1. java复制下载
@Test
void testSerialization() throws JsonProcessingException {MyDTO dto = new MyDTO(95.5);ObjectMapper mapper = new ObjectMapper();String json = mapper.writeValueAsString(dto);assertTrue(json.contains("\"bScore\":"));assertFalse(json.contains("\"bscore\":")); 
}

不同 JSON 库对比

库名称

默认行为

解决方案

Jackson

bScore

bscore

@JsonProperty("bScore")

Gson

bScore

b_score

@SerializedName("bScore")

Fastjson

bScore

bScore

默认保持原样

完整配置示例

@Data
@JsonIgnoreProperties(ignoreUnknown = true) // 忽略未知字段
public class FullConfigDTO {@JsonProperty("bScore")@JsonFormat(shape = JsonFormat.Shape.STRING) // 数字转字符串private Double bScore;@JsonProperty("createdAt")@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") // 日期格式化private LocalDateTime createTime;@JsonIgnore // 不序列化private String internalSecret;
}

总结关键点

  1. 始终使用 @JsonProperty 明确指定字段名,避免依赖默认行为
  2. 命名一致性原则:全项目统一命名风格(推荐小驼峰 bScore
  3. 边界情况测试:针对特殊字段名(如 bScoreHTTPStatus)编写专项测试

避免魔法值:在大型项目中,考虑使用常量管理字段名

  1. java复制下载
public interface JsonFields {String B_SCORE = "bScore";String HTTP_STATUS = "HTTPStatus";
}@JsonProperty(JsonFields.B_SCORE)
private Double bScore;

通过以上方案,您可以精确控制 JSON 字段命名,避免因命名策略导致的接口兼容性问题,特别是在前后端分离架构中尤为重要。

导出字段根据字段名称匹配的时候,无法匹配的时候,注意上面场景,如导出模版:

/*** B绩效系数*/@ExcelProperty(value = "B绩效系数")private BigDecimal bCoefficient;/*** C绩效得分*/@ExcelProperty(value = "C绩效得分")private BigDecimal cScore;/*** C绩效系数*/@ExcelProperty(value = "C绩效系数")private BigDecimal cCoefficient;

导出多行表格头方式,可以直接使用模版,也可以自己生成;

        try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).excelType(ExcelTypeEnum.XLSX).withTemplate(new URL(nacosConfig.getExportTemplateUrl()).openStream()).build()) {********copyProperties(employeeInfoVoMap, basicDTOList);WriteSheet writeSheet0 = EasyExcel.writerSheet("表格一").build();excelWriter.fill(basicDTOList, writeSheet0);}

自己生成表格头,如{"年份", "年份", "年份"},相同会自动合并;

@Data
public class ExcelModel {// 基础信息@ExcelProperty(value = {"年份", "年份", "年份"},index = 0)@ColumnWidth(15)private String cycleYear;@ExcelProperty(value = {"工号", "工号", "工号"},index = 1)@ColumnWidth(15)private String jobNumber;@ExcelProperty(value = {"姓名", "姓名", "姓名"},index = 2)@ColumnWidth(15)private String empName;@ExcelProperty(value = {"部门名称", "部门名称", "部门名称"},index = 3)@ColumnWidth(25)private String departmentName;@ExcelProperty(value = {"职务", "职务", "职务"},index = 4)@ColumnWidth(15)private String duty;// ================== 销售额部分 ==================@ExcelProperty(value = {"销售额", "目标合计", "目标合计"},index = 5, converter = CustomBigDecimalNumberConverter.class)@ColumnWidth(20)private BigDecimal salesTotalTarget;// 1月@ExcelProperty(value = {"销售额", "1月", "目标"},index = 6, converter = CustomBigDecimalNumberConverter.class)@ColumnWidth(15)private BigDecimal salesJanTarget;@ExcelProperty(value = {"销售额", "1月", "权重"},index = 7,converter = CustomBigDecimalNumberConverter.class)@ColumnWidth(15)private BigDecimal salesJanWeight;....... }

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

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

相关文章

修改Docker-compose使Uptime-Kuma支持IPV6

之前部署了一个Uptime-Kuma用来监控服务的运行&#xff0c;最近&#xff0c;在监控IPV6网络的时候出现了一点问题&#xff0c;Docker不支持IPV6网络&#xff1a; 解决方案&#xff1a; 修改/etc/docker/daemon.json文件 {"experimental": true,"fixed-cidr-v6&…

分布式存储架构的优势

分布式存储架构通过将数据分散存储在多个物理节点上&#xff0c;在性能、可靠性及成本效益方面展现显著优势&#xff0c;具体核心优势如下&#xff1a; 一、‌弹性扩展能力‌ 水平无缝扩容‌ 通过添加节点即可线性扩展存储容量与性能&#xff0c;支持EB级数据规模&#xff0…

【4目全景】基于海思3403平台开发4目360°全景拼接相机方案

此文主要介绍基于海思3403平台通过实时视频采集&拼接&融合&显示实现实时全景空间漫游体验&#xff0c;该模组将4路视频拼接成一幅360全景图&#xff0c;涉及到计算机视觉、计算机图形学、数字视频处理等技术。 基本开发步骤主要包括以下几个方面&#xff1a;4路视频…

element-plus 按钮 展开/隐藏

文章目录 1、小记2、页面3、typescript事件4、测试数据5、样式 1、小记 element-plus中el-table 的 expand,箭头控制子项显示&#xff0c;有点丑。 想实现类似bootstrap &#xff0c;用按钮 展开/隐藏子项的功能 2、页面 <!-- 表内容 --><el-table:data"tabl…

SSE(Server-Sent Events)、WebSocket和Polling的对比

1. 基本概念 协议通信模式协议层数据流向连接方式SSE服务器单向推送基于HTTP/HTTPS服务器→客户端&#xff08;单向&#xff09;持久化TCP连接WebSocket全双工通信独立协议&#xff08;基于TCP&#xff09;服务器↔客户端&#xff08;双向&#xff09;持久化TCP连接&#xff0…

不同类型的微型导轨精度降低速度有何差异?

微型导轨是一种高精度、小体积、轻量化的直线运动导轨系统&#xff0c;广泛应用于各种需要精密直线运动的领域。其精度等级是衡量其性能的重要指标&#xff0c;不同精度等级的导轨适用于不同的应用场景。那么&#xff0c;不同类型的微型导轨精度降低速度有何差异&#xff1f; 滚…

debian挂载新硬盘后不识别怎么办?

在实际服务器部署或本地系统扩容的过程中&#xff0c;为 Debian 系统添加新硬盘是常见操作。无论是物理服务器、云服务器还是虚拟机环境中&#xff0c;当添加一块新硬盘之后&#xff0c;我们的期望很简单——系统应立即识别并支持挂载使用。 但理想归理想&#xff0c;现实却常…

nt!MiFlushSectionInternal函数分析从nt!IoSynchronousPageWrite函数到Ntfs!NtfsFsdWrite函数

第一部分&#xff1a; while (TRUE) { KeClearEvent (&IoEvent); Status IoSynchronousPageWrite (FilePointer, Mdl, (PLARGE_INTEGER)&StartingOffset…

开发Qt程序时,为什么是CMake?

开发Qt程序时&#xff0c;为什么是CMake&#xff1f; 什么是CMake&#xff1f; CMake 是一个跨平台的构建工具&#xff0c;用来管理 C/C 项目的编译过程。它通过读取 CMakeLists.txt 配置文件&#xff0c;自动生成适合不同操作系统和编译器的构建脚本&#xff08;比如 Makefi…

web布局10

Grid 布局指的是 CSS Grid Layout &#xff0c;它和以往 CSS 框架&#xff08;CSS Framework&#xff09;中所说的网格系统&#xff08;Grid System&#xff09;有所不同。至今为止&#xff0c;它是唯一一个具有二维能力的布局系统&#xff0c;即&#xff0c;它是一个基于二维网…

Spring AI 项目实战(十二):Spring Boot +AI + DeepSeek + 百度OCR 公司发票智能处理系统的技术实践(附完整源码)

系列文章 序号文章名称1Spring AI 项目实战(一):Spring AI 核心模块入门2Spring AI 项目实战(二):Spring Boot + AI + DeepSeek 深度实战(附完整源码)3Spring AI 项目实战(三):Spring Boot + AI + DeepSeek 打造智能客服系统(附完整源码)4

【FR801xH】Ubuntu24.04搭建富芮坤FR801xH系列开发环境教程

00. 目录 文章目录 00. 目录01. FR801xH概述02. FR801xH特性03. gcc-arm-none-eabi-10.3-2021.10概述04. gcc-arm-none-eabi-10.3-2021.10下载05. gcc-arm-none-eabi-10.3-2021.10安装06. FR801xH-SDK编译07. 附录 01. FR801xH概述 FR801xH 系列芯片是面向 SOC&#xff08;片上…

Excel学习05

员工排班表 通过之前的学习&#xff0c;目前的我们已经具备了Excel的初步制作能力。接下来将从实际出发制作一个员工排班表。在制作排版表之前&#xff0c;先来看我们要用到的函数。 DATE函数 date函数是Excel中处理日期的核心函数之一&#xff0c;它能够将单独的年、月、日…

黑马JVM解析笔记(五):深入理解Java字节码执行机制

1.从字节码的角度分析i /** * 从字节码角度分析 a 相关题目 */ public class Demo3_2 {public static void main(String[] args) {int a 10;int b a a a--;System.out.println(a);System.out.println(b);} }a 和 a 实际上代表了两个不同的操作&#xff0c;它们分别对应自增…

从社交媒体到金融“超级应用”,马斯克X平台将上线投资交易服务

报道称&#xff0c;马斯克旗下的X平台将推出“超级App”&#xff0c;提供投资和交易服务&#xff0c;另外&#xff0c;X也在探索引入信用卡或借记卡。作为金融服务布局的第一步&#xff0c;X平台已宣布将推出X Money——一项数字钱包和点对点支付服务&#xff0c;Visa将成为其首…

【入门第2课】Splunk数据接入

前言 Splunk支持多种多样的数据源,比如它可以直接上传文件,可以监控本地的任何目录或文件,也可以配置通用转发器等方式来完成数据接入。Splunk所有的设置都可以通过Web页面、使用Splunk CLI命令,甚至是直接修改配置文件,以此来完成设置。 那么,如何接入数据呢?我们通过…

【数据挖掘】关联规则算法学习—Apriori

关联规则算法学习—Apriori Apriori算法是关联规则挖掘中的经典算法&#xff0c;用于发现数据集中的频繁项集和强关联规则。其核心思想基于先验性质&#xff1a;若一个项集是频繁的&#xff0c;则其所有子集也一定是频繁的。该算法通过逐层搜索的迭代方法高效挖掘关联规则。 要…

助力高考,利用python获取本专科专业选考科目要求

大家好&#xff0c;今天我们来利用python技术助力高考&#xff0c;获取网上的本专科专业选考科目要求&#xff0c;用到的Python模块有&#xff1a;Requests、Json、BeautifulSoup、Pandas &#xff0c;主要思路是Requests获取接口请求&#xff0c;利用BeautifulSoup 解析网站的…

Python 商务数据分析—— NumPy 学习笔记Ⅱ

一、 数组元素值的替换 我们可以使用索引或 where () 函数来替换 NumPy 数组中的元素值。 1.1 方式一&#xff1a;索引 import numpy as npnp.random.seed(42)a3 np.random.randint(0, 10, size(3, 4))print("原数组:\n", a3)a3\[1] 0 # 将a3数组第一行数据全…

遥感图像语义分割1-安装mmsegmentation

参考&#xff1a; mmsegmentation: 安装并使用自定义数据集进行训练_mmsegmentation安装-CSDN博客 最新Windows配置安装mmcv与mmsegmentation&#xff0c;以及mmsegmentation的验证_mmcv安装-CSDN博客 GitCode - 全球开发者的开源社区,开源代码托管平台 参考&#xff1a; …