通过easyexcel导入数据,添加表格参数的校验,同表格内校验以及和已有数据的校验

 引入依赖

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.11</version><scope>compile</scope></dependency>

需要导入到某个目录下

如果产品名称相同,就追加里面的型号,如果型号也相同就返回提示,

如果产品名称相同,表格内的数据要和浏览器录入的 型号对应参数保持一致,顺序、名称、数量等都要完全一致

如果产品名称相同,表格内部的 型号对应的参数必须保持一致,顺序、名称、数量等都要完全一致;

例如:

 导入的表格要个浏览器对应上

controller

	/*** 导入设备*/@PostMapping("importProduct")@ApiOperationSupport(order = 11)@ApiOperation(value = "导入设备", notes = "传入excel/产品")public R importProduct(MultipartFile file, Long categoryId) throws IOException {//此处判断文件大小不能为0if (file.getSize() == 0) {return R.fail("文件大小不能为空");}if (categoryId == null || categoryId <= 0) {return R.fail("请选择所属产品分类");}return productService.importProduct(file, categoryId);}

services

	//导入产品@Override@Transactional(rollbackFor = Exception.class)public R importProduct(MultipartFile file, Long categoryId) throws IOException {CategoryEntity category = categoryService.getById(categoryId);if (category == null) {throw new ServiceException("产品分类不存在");}DataExcelListener<ProductImportExcel> listener = new DataExcelListener<ProductImportExcel>();// headRowNumber(2):表示第一、二行为表头,从第三行取值ExcelReader excelReader = EasyExcelFactory.read(file.getInputStream(), ProductImportExcel.class, listener).headRowNumber(2).build();excelReader.readAll();List<ProductImportExcel> data = listener.getDatas();excelReader.finish();Map<String, List<CodeProTypeJson>> map = new LinkedHashMap<>();//获取表格数据,根据表格每一行的列数量不同,获取数据后组装型号jsongetExcelData(data, map);// 转换数据并添加产品List<ProductEntity> productList = new ArrayList<>();//判断导入的产品名称和已有的产品名称是否相同,如果相同就追加型号List<String> productNameList = new ArrayList<>();for (Map.Entry<String, List<CodeProTypeJson>> listEntry : map.entrySet()) {String productName = listEntry.getKey();List<CodeProTypeJson> value = listEntry.getValue();ProductEntity product = new ProductEntity();product.setCategoryId(categoryId);product.setCodeProName(productName);product.setCodeProType(JSON.toJSONString(value));product.setCodeProTypeNum(value.size());product.setEnterpriseId(IotAuthUtil.getEnterpriseId());productNameList.add(productName);productList.add(product);}// 批量查询 已经存在的产品 存在就覆盖 不存在就新增if (productNameList != null && productNameList.size() > 0) {LambdaQueryWrapper<ProductEntity> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.in(ProductEntity::getCodeProName, productNameList);List<ProductEntity> selectList = baseMapper.selectList(queryWrapper);List<ProductEntity> updateList = new ArrayList<>();List<ProductEntity> addList = new ArrayList<>();for (ProductEntity entity : productList) {// 判断产品是否已经添加,如已添加就走修改逻辑,未添加就走添加逻辑ProductEntity product = containsProductEntity(entity, selectList);if (product != null) {entity.setId(product.getId());updateList.add(entity);} else {addList.add(entity);}/*Long productId = containsProductEntity(entity, selectList);if (productId != null) {entity.setId(productId);updateList.add(entity);} else {addList.add(entity);}*/}// 批量更新if (updateList != null && updateList.size() > 0) {this.updateBatchById(updateList);}// 批量添加if (addList != null && addList.size() > 0) {this.saveBatch(addList);}}return R.success("导入成功!");}

 Excel导入数据 解析监听器 用于获取excel表格的数据

package com.bluebird.code.util;import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.metadata.Cell;import java.util.ArrayList;
import java.util.List;
import java.util.Map;/*** Excel导入数据 解析监听器 用于获取excel表格的数据*/
public class DataExcelListener<T> extends AnalysisEventListener<T> {/*** 自定义用于暂时存储data* 可以通过实例获取该值*/private List<T> datas = new ArrayList<>();/*** 每解析一行都会回调invoke()方法** @param object  读取后的数据对象* @param context 内容*/@Override@SuppressWarnings("unchecked")public void invoke(Object object, AnalysisContext context) {T data = (T) object;//数据存储到list,供批量处理,判断每一行是否为空行。if (data != null && !isEmptyRow(context.readRowHolder().getCellMap())) {datas.add(data);}}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {//解析结束销毁不用的资源//注意不要调用datas.clear(),否则getDatas为null}/*** 返回数据** @return 返回读取的数据集合**/public List<T> getDatas() {return datas;}/*** 设置读取的数据集合** @param datas 设置读取的数据集合**/public void setDatas(List<T> datas) {this.datas = datas;}/*** 判断一行是否为空行* @param cellMap 当前行的单元格映射* @return 如果所有单元格都为空,则返回 true,否则返回 false*/private boolean isEmptyRow(Map<Integer, Cell> cellMap) {for (Object cellValue : cellMap.values()) {if (cellValue != null && !cellValue.toString().trim().isEmpty()) {return false;}}return true;}}

获取数据后组装型号json串 (同时处理表格内部相同产品名称不同型号参数名的问题,要确保相同参数名称的参数名保持一致)

// 获取数据后组装型号json串 (同时处理表格内部相同产品名称不同型号参数名的问题,要确保相同参数名称的参数名保持一致)public void getExcelData(List<ProductImportExcel> data, Map<String, List<CodeProTypeJson>> map) {int count = 2;// 判断产品名称和型号是否相等,如过相等就返回提示,产品名和型号组成合并后需要唯一Map<String, String> proNameTypeMap = new HashMap<>();// 定义一个map集合,key:产品名称,value:型号集合的名称拼接Map<String, String> mapProductType = new LinkedHashMap<>();for (ProductImportExcel entity : data) {count++;String productName = entity.getCodeProName();String codeProType = entity.getCodeProType();String proNameType = productName + codeProType;if (StringUtils.isBlank(productName) || StringUtils.isEmpty(productName)) {throw new ServiceException("第 " + count + " 行产品名称不能为空!");}if (StringUtils.isBlank(codeProType) || StringUtils.isEmpty(codeProType)) {throw new ServiceException("第 " + count + " 行规格型号不能为空!");}//String proNameTypeStr = proNameTypeMap.get(proNameType);if (StringUtils.isNotBlank(proNameTypeStr)) {throw new ServiceException("第 " + count + " 行和第 " + (count - 1) + "产品名称下的规格型号不能重复!");}proNameTypeMap.put(proNameType, proNameType);List<CodeProTypeJson> list = map.get(productName);CodeProTypeJson json = new CodeProTypeJson();List<CodeProTypeJson.SkuParamsList> listDate = new ArrayList<>();json.setSkuName(entity.getCodeProType());json.setSkuId(IdWorker.getIdStr());// 将参数名进行拼接StringBuilder paramSb = new StringBuilder();// 根据型号参数名字处理表格数据,如果此单元格为空就不处理(因为每个产品的型号数量不确定)if (StringUtils.isNotEmpty(entity.getParamName1())) {CodeProTypeJson.SkuParamsList skuParamsList = new CodeProTypeJson.SkuParamsList();skuParamsList.setParamId(IdWorker.getIdStr());skuParamsList.setParamName(entity.getParamName1());skuParamsList.setParamValue(entity.getParamValue1());listDate.add(skuParamsList);paramSb.append(entity.getParamName1());}// 根据型号参数名字处理表格数据,如果此单元格为空就不处理(因为每个产品的型号数量不确定)if (StringUtils.isNotEmpty(entity.getParamName2())) {CodeProTypeJson.SkuParamsList skuParamsList = new CodeProTypeJson.SkuParamsList();skuParamsList.setParamId(IdWorker.getIdStr());skuParamsList.setParamName(entity.getParamName2());skuParamsList.setParamValue(entity.getParamValue2());listDate.add(skuParamsList);paramSb.append("->");paramSb.append(entity.getParamName2());}// 根据型号参数名字处理表格数据,如果此单元格为空就不处理(因为每个产品的型号数量不确定)if (StringUtils.isNotEmpty(entity.getParamName3())) {CodeProTypeJson.SkuParamsList skuParamsList = new CodeProTypeJson.SkuParamsList();skuParamsList.setParamId(IdWorker.getIdStr());skuParamsList.setParamName(entity.getParamName3());skuParamsList.setParamValue(entity.getParamValue3());listDate.add(skuParamsList);paramSb.append("->");paramSb.append(entity.getParamName3());}// 根据型号参数名字处理表格数据,如果此单元格为空就不处理(因为每个产品的型号数量不确定)if (StringUtils.isNotEmpty(entity.getParamName4())) {CodeProTypeJson.SkuParamsList skuParamsList = new CodeProTypeJson.SkuParamsList();skuParamsList.setParamId(IdWorker.getIdStr());skuParamsList.setParamName(entity.getParamName4());skuParamsList.setParamValue(entity.getParamValue4());listDate.add(skuParamsList);paramSb.append("->");paramSb.append(entity.getParamName4());}// 根据型号参数名字处理表格数据,如果此单元格为空就不处理(因为每个产品的型号数量不确定)if (StringUtils.isNotEmpty(entity.getParamName5())) {CodeProTypeJson.SkuParamsList skuParamsList = new CodeProTypeJson.SkuParamsList();skuParamsList.setParamId(IdWorker.getIdStr());skuParamsList.setParamName(entity.getParamName5());skuParamsList.setParamValue(entity.getParamValue5());listDate.add(skuParamsList);paramSb.append("->");paramSb.append(entity.getParamName5());}// 根据型号参数名字处理表格数据,如果此单元格为空就不处理(因为每个产品的型号数量不确定)if (StringUtils.isNotEmpty(entity.getParamName6())) {CodeProTypeJson.SkuParamsList skuParamsList = new CodeProTypeJson.SkuParamsList();skuParamsList.setParamId(IdWorker.getIdStr());skuParamsList.setParamName(entity.getParamName6());skuParamsList.setParamValue(entity.getParamValue6());listDate.add(skuParamsList);paramSb.append("->");paramSb.append(entity.getParamName6());}// 根据型号参数名字处理表格数据,如果此单元格为空就不处理(因为每个产品的型号数量不确定)if (StringUtils.isNotEmpty(entity.getParamName7())) {CodeProTypeJson.SkuParamsList skuParamsList = new CodeProTypeJson.SkuParamsList();skuParamsList.setParamId(IdWorker.getIdStr());skuParamsList.setParamName(entity.getParamName7());skuParamsList.setParamValue(entity.getParamValue7());listDate.add(skuParamsList);paramSb.append("->");paramSb.append(entity.getParamName7());}// 根据型号参数名字处理表格数据,如果此单元格为空就不处理(因为每个产品的型号数量不确定)if (StringUtils.isNotEmpty(entity.getParamName8())) {CodeProTypeJson.SkuParamsList skuParamsList = new CodeProTypeJson.SkuParamsList();skuParamsList.setParamId(IdWorker.getIdStr());skuParamsList.setParamName(entity.getParamName8());skuParamsList.setParamValue(entity.getParamValue8());listDate.add(skuParamsList);paramSb.append("->");paramSb.append(entity.getParamName8());}// 将参数名拼接后转换字符串String paramSbStr = paramSb.toString();// 根据当前行的产品名称去map集合获取已经存入的参数名的拼接串String paramNameMap = mapProductType.get(productName);if (Func.isNotBlank( paramNameMap ) && !paramNameMap.equals( paramSbStr )) {String msg = "[ " + paramNameMap + " ] 和 [ " + paramSbStr + " ] 型号参数名称、数量、顺序需保持一致";throw new ServiceException(" 产品名称为:[ " + productName + " ] 的型号参数与表格其他行的参数名称或顺序不一致,请修改!</br>" + msg);}// 如果校验通过后添加参数拼接串到map集合中mapProductType.put(productName, paramSbStr);json.setSkuParamsList(listDate);if (list == null) {list = new ArrayList<>();}List<CodeProTypeJson> typeJsons = map.get(productName);if (typeJsons != null && typeJsons.size() > 0) {typeJsons.add(json);map.put(productName, typeJsons);} else {list.add(json);map.put(productName, list);}}}

判断产品是否已经添加,如已添加就走修改逻辑,未添加就走添加逻辑  excel:entity

	// 判断产品是否已经添加,如已添加就走修改逻辑,未添加就走添加逻辑  excel:entityprivate static ProductEntity containsProductEntity(ProductEntity entity, List<ProductEntity> selectList) {for (ProductEntity item : selectList) {if (item.getCodeProName().equals(entity.getCodeProName())) {// 如果导入的产品名称和已经添加的产品名称相同,就追加型号,如果型号相同,就返回提示List<CodeProTypeJson> itemTypeJsonList = JSONObject.parseArray(Func.toStr(item.getCodeProType()), CodeProTypeJson.class);List<CodeProTypeJson> excelTypeJsonList = JSONObject.parseArray(Func.toStr(entity.getCodeProType()), CodeProTypeJson.class);for (CodeProTypeJson itemJson : itemTypeJsonList) {for (CodeProTypeJson excelJson : excelTypeJsonList) {if (Objects.equals(itemJson.getSkuName(), excelJson.getSkuName())) {throw new ServiceException(" 产品名称为: " + item.getCodeProName() + " 的 " + itemJson.getSkuName() + " 型号已存在,请先修改该型号");}}}// 比较 如果导入的产品名称和数据库已有的数据产品名称相同,就比对型号的名称和顺序是否一致,如果不一致就返回提示if (itemTypeJsonList != null && itemTypeJsonList.size() > 0 && excelTypeJsonList != null && excelTypeJsonList.size() > 0) {// 获取查询到的第一个型号的参数列表CodeProTypeJson codeProTypeJson = itemTypeJsonList.get(0);List<CodeProTypeJson.SkuParamsList> itemSkuParamsList = codeProTypeJson.getSkuParamsList();// 将参数名进行拼接StringBuilder sbItem = new StringBuilder();for (int i = 0; i < itemSkuParamsList.size(); i++) {CodeProTypeJson.SkuParamsList param = itemSkuParamsList.get(i);sbItem.append(param.getParamName());if (i < itemSkuParamsList.size() - 1) {sbItem.append("->");}}String itemTypeJson = sbItem.toString();// 遍历excel表格里面的所有型号对应的参数列表for (CodeProTypeJson json : excelTypeJsonList) {List<CodeProTypeJson.SkuParamsList> skuParamsList = json.getSkuParamsList();// 遍历某个型号的所有参数名,将参数名进行拼接StringBuilder sbJson = new StringBuilder();for (int i = 0; i < skuParamsList.size(); i++) {CodeProTypeJson.SkuParamsList param = skuParamsList.get(i);sbJson.append(param.getParamName());if (i < skuParamsList.size() - 1) {sbJson.append("->");}}String excelTypeJson = sbJson.toString();System.out.println("itemTypeJson " + itemTypeJson);System.out.println("excelTypeJson " + excelTypeJson);System.out.println(itemTypeJson.equals(excelTypeJson));// 比对数据库查询的 拼接参数和excel表格里面的 拼接参数是否一致if (!itemTypeJson.equals(excelTypeJson)) {String msg = "原参数[ " + itemTypeJson + " ] 新参数 [ " + excelTypeJson + " ]";throw new ServiceException(" 产品名称为:[ " + item.getCodeProName() + " ]的型号参数与已有参数名称不一致或顺序不一致,请修改!</br>" + msg);}}}itemTypeJsonList.addAll(excelTypeJsonList);entity.setCodeProType(JSON.toJSONString(itemTypeJsonList));entity.setCodeProTypeNum(itemTypeJsonList.size());entity.setId(item.getId());return entity;}}return null;}

ProductEntity实体类

package com.bluebird.code.entity;import com.baomidou.mybatisplus.annotation.TableName;
import com.bluebird.core.tenant.mp.TenantEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;/*** 赋码 - 产品表 实体类 */
@Data
@TableName("t_code_product")
@ApiModel(value = "Product对象", description = "赋码 - 产品表")
@EqualsAndHashCode(callSuper = true)
public class ProductEntity extends TenantEntity {/*** 企业id*/@ApiModelProperty(value = "企业id")private Long enterpriseId;/*** 产品名称*/@ApiModelProperty(value = "产品名称")private String codeProName;/*** 产品编号*/@ApiModelProperty(value = "产品编号")private String codeProNum;/*** 产品分类*/@ApiModelProperty(value = "产品分类")private Long categoryId;/*** 产品图片*/@ApiModelProperty(value = "产品图片")private String codeProImage;/*** 产品主图图片*/@ApiModelProperty(value = "产品主图图片")private String codeMainImage;/*** 产品视频*/@ApiModelProperty(value = "产品视频")private String codeProVideo;/*** 产品型号(第一组元素必须为规格型号)** @see com.bluebird.code.dto.CodeProTypeJson*/@ApiModelProperty(value = "产品型号(第一组元素必须为规格型号)")
//	private CodeProTypeJson codeProType;private String codeProType;/*** 产品简介*/@ApiModelProperty(value = "产品简介")private String codeProDesc;/*** 规格数量*/@ApiModelProperty(value = "规格数量")private Integer codeProTypeNum;/*** 排序*/@ApiModelProperty(value = "排序")private Integer sort;/*** 备注*/@ApiModelProperty(value = "备注")private String remark;}

CodeProTypeJson 产品型号Json对象 (第一组元素必须为规格型号)

package com.bluebird.code.dto;import lombok.Data;import java.util.List;/**** 产品型号Json对象 (第一组元素必须为规格型号)*** @return:* @date: 2024/6/20*/
@Data
public class CodeProTypeJson {//产品idprivate String skuId;//产品型号private String skuName;//规格英文名称private String skuEnName;//产品规格参数Listprivate List<SkuParamsList> skuParamsList;@Datapublic static class SkuParamsList {//规格idprivate String paramId;//规格名称private String paramName;//规格英文名称private String paramEnName;//规格参数值private String paramValue;}
}

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

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

相关文章

Mybatis数据封装

目录 解决方案&#xff1a; 1.起别名&#xff1a; 2.手动结果映射&#xff1a; 3.开启驼峰命名(推荐)&#xff1a; 我们看到查询返回的结果中大部分字段是有值的&#xff0c;但是deptId&#xff0c;createTime&#xff0c;updateTime这几个字段是没有值的&#xff0c;而数据…

分析数据不要太老实,有BI方案就用起来——奥威BI软件

在当今数据驱动的时代&#xff0c;企业对于数据分析的需求日益迫切。然而&#xff0c;面对海量的数据和复杂的分析需求&#xff0c;许多企业仍停留在传统的手工分析模式&#xff0c;这不仅效率低下&#xff0c;还容易出错。幸运的是&#xff0c;像奥威BI这样的数据分析软件提供…

【深度学习】扫描全能王的AI驱动创新与智能高清滤镜技术解析

目录 引言1、扫描全能王2、智能高清滤镜黑科技2.1、图像视觉矫正2.2、去干扰技术 3、实际应用案例3.1、打印文稿褶皱检测3.2、试卷擦除手写3.3、老旧文件处理3.4、收银小票3.5、从不同角度扫描文档 4、用户体验结论与未来展望 引言 在数字化时代背景下&#xff0c;文档扫描功能…

GitCode见证:华为云DevUI如何定义下一代前端开发

在当今快速发展的数字时代&#xff0c;前端开发已成为企业数字化转型的关键一环。随着用户对交互体验的期待不断增长&#xff0c;拥有一个强大、灵活且易于使用的前端解决方案变得至关重要。 DevUI的诞生&#xff0c;源于华为对研发工具的深入理解和长期积累&#xff0c;作为一…

【云原生监控】Prometheus 普罗米修斯从搭建到使用详解

目录 一、前言 二、服务监控概述 2.1 什么是微服务监控 2.2 微服务监控指标 2.3 微服务监控工具 三、Prometheus概述 3.1 Prometheus是什么 3.2 Prometheus 特点 3.3 Prometheus 架构图 3.3.1 Prometheus核心组件 3.3.2 Prometheus 工作流程 3.4 Prometheus 应用场景…

如何使用C++进行高效的数据处理和数据挖掘?

如何使用C进行高效的数据处理和数据挖掘&#xff1f; 数据处理和数据挖掘在如今信息爆炸的时代变得越来越重要。为了快速、高效地处理和分析大量的数据&#xff0c;选择合适的编程语言非常重要。C作为一种高性能的编程语言&#xff0c;在数据处理和数据挖掘领域也有广泛的应用…

8624 多项式系数累加和

这个问题可以通过使用数学的导数规则来解决。对于一个多项式&#xff0c;它的导数可以通过将每一项的系数乘以它的指数&#xff0c;然后降低该项的指数来得到。这个过程可以重复M次来得到多项式的M阶导数。然后&#xff0c;我们可以简单地将所有项的系数相加来得到结果。 以下…

3D Gaussian Splatting代码中的train和render两个文件代码解读

现在来聊一聊训练和渲染是如何进行的 training train.py line 31 def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoint_iterations, checkpoint, debug_from):# 初始化第一次迭代的索引为0first_iter 0# 准备输出和日志记录器tb_writer p…

wordpress企业主题和wordpress免费主题

农业畜牧养殖wordpress主题 简洁大气的农业畜牧养殖wordpress主题&#xff0c;农业农村现代化&#xff0c;离不开新农人、新技术。 https://www.jianzhanpress.com/?p3051 SEO优化wordpress主题 简洁的SEO优化wordpress主题&#xff0c;效果好不好&#xff0c;结果会告诉你…

第一后裔The First Descendant延迟、卡顿、无法联机?

The First Descendant第一后裔游戏中还设计了多种辅助攻击手段&#xff0c;它们如同角色手中的魔法&#xff0c;为战斗增添了无数可能性。这些辅助攻击手段或能造成范围伤害&#xff0c;或能减速敌人&#xff0c;甚至能召唤出强大的支援力量。最近有玩家反映&#xff0c;遇到了…

Windows条件竞争提权漏洞复现(CVE-2024-300889)

漏洞原理 当内核将当前令牌对象的 _AUTHZBASEP_SECURITY_ATTRIBUTES_INFORMATION 复制到用户模式时&#xff0c;错误位于函数 AuthzBasepCopyoutInternalSecurityAttributes 内部&#xff0c;该模式的结构如下&#xff1a; //0x30 bytes (sizeof) struct _AUTHZBASEP_SECURIT…

科研工具|从图片中提取曲线数据

最近水哥在做一个项目时需要用到一篇论文中的数据&#xff0c;而这数据是作者的实验数据&#xff0c;且年代较为久远&#xff0c;联系原作者要一份数据也不太现实&#xff0c;因而只能从论文的图片中提取数据了。 目前市面上有很多小软件可以实现这方面的功能&#xff0c;比如…

DVT:华为提出动态级联Vision Transformer,性能杠杠的 | NeurIPS 2021

论文主要处理Vision Transformer中的性能问题&#xff0c;采用推理速度不同的级联模型进行速度优化&#xff0c;搭配层级间的特征复用和自注意力关系复用来提升准确率。从实验结果来看&#xff0c;性能提升不错 来源&#xff1a;晓飞的算法工程笔记 公众号 论文: Not All Image…

智慧应急管理平台:数字孪生,让防汛救灾更科学高效

近期全国各地暴雨频发&#xff0c;城市排水系统面临着前所未有的挑战&#xff0c;应急防涝已成为城市管理中不可或缺的一环。在这个信息化、智能化的时代&#xff0c;数字孪生技术以其独特的优势&#xff0c;为应急领域带来了革命性的变革。数字孪生&#xff0c;作为现实世界在…

揭秘:学校教室采用数码管同步时钟的原因-讯鹏电子钟

在学校的教室里&#xff0c;我们常常会看到数码管同步时钟的身影。究竟是什么原因让它成为学校教室的宠儿呢&#xff1f;让我们一同来探究其中的奥秘。 数码管同步时钟具有极高的准确性。对于学校这样一个对时间管理要求严格的场所&#xff0c;准确的时间是保障教学秩序的基石。…

SwinIR: Image Restoration Using Swin Transformer(ICCV 2021)含代码复现

目录 一、Introduction 1 Motivation 2 Contribution 二、原理分析 1 Network Architecture 1&#xff09;Shallow feature extraction 2) deep feature extraction 3) image reconsruction modules 4) loss function 2 Residual Swin Transformer Block 三、实验结果…

没有调用memcpy却报了undefined reference to memcpy错误

现象 在第5行出现了&#xff0c;undefined reference to memcpy’ 1 static void printf_x(unsigned int val) 2{ 3 char buffer[32]; 4 const char lut[]{0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F}; 5 char *p buffer; 6 while (val || p buffer) { 7 *(p) …

基于循环神经网络的一维信号降噪方法(简单版本,Python)

代码非常简单。 import torch import torch.nn as nn from torch.autograd import Variable from scipy.io.wavfile import write #need install pydub module #pip install pydub import numpy as np import pydub from scipy import signal import IPython import matplot…

C语言学习记录(十二)——指针与数组及字符串

文章目录 前言一、指针和数组二、指针和二维数组**行指针(数组指针)** 三、 字符指针和字符串四、指针数组 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出~ 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、指针和数组 在C语言中 &#xff0…

AI降重,不再难:降AI率的实用技巧大揭秘

如何有效降低AIGC论文的重复率&#xff0c;也就是我们说的aigc如何降重&#xff1f;AIGC疑似度过高确实是个比较愁人的问题。如果你用AI帮忙写了论文&#xff0c;就一定要在交稿之前做一下AIGC降重的检查。一般来说&#xff0c;如果论文的AIGC超过30%&#xff0c;很可能会被判定…