SpringBoot实现Excel导入导出

SpringBoot实现Excel导入导出

在我们平时工作中经常会遇到要操作Excel的功能,比如导出个用户信息或者订单信息的Excel报表。你肯定听说过

POI这个东西,可以实现。但是POI实现的API确实很麻烦,它需要写那种逐行解析的代码(类似Xml解析)。今天

给大家推荐一款非常好用的Excel导入导出工具EasyPoi,希望对大家有所帮助!

1、EasyPoi简介

用惯了SpringBoot的朋友估计会想到,有没有什么办法可以直接定义好需要导出的数据对象,然后添加几个注

解,直接自动实现Excel导入导出功能?

EasyPoi正是这么一款工具,如果你不太熟悉POI,想简单地实现Excel操作,用它就对了!

EasyPoi的目标不是替代POI,而是让一个不懂导入导出的人也能快速使用POI完成Excel的各种操作,而不是看很

多API才可以完成这样的工作。

项目官网:https://gitee.com/lemur/easypoi

2、集成

在SpringBoot中集成EasyPoi非常简单,只需添加easypoi-spring-boot-starter依赖即可,真正的开箱即

用!

2.1 pom依赖

<?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.5.6</version><relativePath/></parent><groupId>com.easypoi</groupId><artifactId>spring-boot-easypoi</artifactId><version>0.0.1-SNAPSHOT</version><name>spring-boot-easypoi</name><description>pringBoot实现Excel导入导出</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.4.0</version></dependency><!--springfox swagger官方Starter--><dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version></dependency><!--lombok依赖--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!--SpringBoot通用依赖模块--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

2.2 结果集封装

package com.easypoi.common.api;/*** 封装API的错误码*/
public interface IErrorCode {long getCode();String getMessage();
}
package com.easypoi.common.api;/*** 枚举了一些常用API操作码*/
public enum ResultCode implements IErrorCode {SUCCESS(200, "操作成功"),FAILED(500, "操作失败"),VALIDATE_FAILED(404, "参数检验失败"),UNAUTHORIZED(401, "暂未登录或token已经过期"),FORBIDDEN(403, "没有相关权限");private long code;private String message;private ResultCode(long code, String message) {this.code = code;this.message = message;}public long getCode() {return code;}public String getMessage() {return message;}
}
package com.easypoi.common.api;/*** 通用返回对象*/
public class CommonResult<T> {private long code;private String message;private T data;protected CommonResult() {}protected CommonResult(long code, String message, T data) {this.code = code;this.message = message;this.data = data;}/*** 成功返回结果** @param data 获取的数据*/public static <T> CommonResult<T> success(T data) {return new CommonResult<T>(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage(), data);}/*** 成功返回结果** @param data    获取的数据* @param message 提示信息*/public static <T> CommonResult<T> success(T data, String message) {return new CommonResult<T>(ResultCode.SUCCESS.getCode(), message, data);}/*** 失败返回结果** @param errorCode 错误码*/public static <T> CommonResult<T> failed(IErrorCode errorCode) {return new CommonResult<T>(errorCode.getCode(), errorCode.getMessage(), null);}/*** 失败返回结果** @param message 提示信息*/public static <T> CommonResult<T> failed(String message) {return new CommonResult<T>(ResultCode.FAILED.getCode(), message, null);}/*** 失败返回结果*/public static <T> CommonResult<T> failed() {return failed(ResultCode.FAILED);}/*** 参数验证失败返回结果*/public static <T> CommonResult<T> validateFailed() {return failed(ResultCode.VALIDATE_FAILED);}/*** 参数验证失败返回结果** @param message 提示信息*/public static <T> CommonResult<T> validateFailed(String message) {return new CommonResult<T>(ResultCode.VALIDATE_FAILED.getCode(), message, null);}/*** 未登录返回结果*/public static <T> CommonResult<T> unauthorized(T data) {return new CommonResult<T>(ResultCode.UNAUTHORIZED.getCode(), ResultCode.UNAUTHORIZED.getMessage(), data);}/*** 未授权返回结果*/public static <T> CommonResult<T> forbidden(T data) {return new CommonResult<T>(ResultCode.FORBIDDEN.getCode(), ResultCode.FORBIDDEN.getMessage(), data);}public long getCode() {return code;}public void setCode(long code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public T getData() {return data;}public void setData(T data) {this.data = data;}
}

2.3 Swagger配置

package com.easypoi.config;import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;/*** Swagger2API文档的配置*/
@Configuration
@EnableSwagger2
public class Swagger2Config {@Beanpublic Docket createRestApi() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select()//为当前包下controller生成API文档.apis(RequestHandlerSelectors.basePackage("com.easypoi.controller"))//为有@Api注解的Controller生成API文档.apis(RequestHandlerSelectors.withClassAnnotation(Api.class))//为有@ApiOperation注解的方法生成API文档.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)).paths(PathSelectors.any()).build();}private ApiInfo apiInfo() {return new ApiInfoBuilder().title("SwaggerUI演示").description("mall-tiny").contact(new Contact("macro", null, null)).version("1.0").build();}
}

2.4 启动类

package com.easypoi;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class SpringBootEasypoiApplication {public static void main(String[] args) {SpringApplication.run(SpringBootEasypoiApplication.class, args);}}

2.5 配置文件

server:port: 8088springfox:documentation:enabled: true

2.6 实体类

package com.easypoi.domain;import cn.afterturn.easypoi.excel.annotation.Excel;
import lombok.Data;
import lombok.EqualsAndHashCode;import java.util.Date;/*** 购物会员*/
@Data
@EqualsAndHashCode(callSuper = false)
public class Member {@Excel(name = "ID", width = 10)private Long id;@Excel(name = "用户名", width = 20, needMerge = true)private String username;private String password;@Excel(name = "昵称", width = 20, needMerge = true)private String nickname;@Excel(name = "出生日期", width = 20, format = "yyyy-MM-dd")private Date birthday;@Excel(name = "手机号", width = 20, needMerge = true, desensitizationRule = "3_4")private String phone;private String icon;@Excel(name = "性别", width = 10, replace = {"男_0", "女_1"})private Integer gender;
}
package com.easypoi.domain;import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.excel.annotation.ExcelCollection;
import cn.afterturn.easypoi.excel.annotation.ExcelEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;import java.util.Date;
import java.util.List;/*** 订单*/
@Data
@EqualsAndHashCode(callSuper = false)
public class Order {@Excel(name = "ID", width = 10, needMerge = true)private Long id;@Excel(name = "订单号", width = 20, needMerge = true)private String orderSn;@Excel(name = "创建时间", width = 20, format = "yyyy-MM-dd HH:mm:ss", needMerge = true)private Date createTime;@Excel(name = "收货地址", width = 20, needMerge = true)private String receiverAddress;@ExcelEntity(name = "会员信息")private Member member;@ExcelCollection(name = "商品列表")private List<Product> productList;
}
package com.easypoi.domain;import cn.afterturn.easypoi.excel.annotation.Excel;
import lombok.Data;
import lombok.EqualsAndHashCode;import java.math.BigDecimal;/*** 商品*/
@Data
@EqualsAndHashCode(callSuper = false)
public class Product {@Excel(name = "ID", width = 10)private Long id;@Excel(name = "商品SN", width = 20)private String productSn;@Excel(name = "商品名称", width = 20)private String name;@Excel(name = "商品副标题", width = 30)private String subTitle;@Excel(name = "品牌名称", width = 20)private String brandName;@Excel(name = "商品价格", width = 10)private BigDecimal price;@Excel(name = "购买数量", width = 10, suffix = "件")private Integer count;
}

2.7 工具类

package com.easypoi.util;import cn.hutool.core.io.IoUtil;
import cn.hutool.core.io.resource.ClassPathResource;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONUtil;import java.nio.charset.Charset;
import java.util.List;/*** 从本地获取JSON数据的工具类*/
public class LocalJsonUtil {/*** 从指定路径获取JSON并转换为List** @param path        json文件路径* @param elementType List元素类型*/public static <T> List<T> getListFromJson(String path, Class<T> elementType) {ClassPathResource resource = new ClassPathResource(path);String jsonStr = IoUtil.read(resource.getStream(), Charset.forName("UTF-8"));JSONArray jsonArray = new JSONArray(jsonStr);return JSONUtil.toList(jsonArray, elementType);}
}

LocalJsonUtil工具类,可以直接从resources目录下获取JSON数据并转化为对象。

2.8 字段处理器

package com.easypoi.handler;import cn.afterturn.easypoi.handler.impl.ExcelDataHandlerDefaultImpl;
import cn.hutool.core.util.StrUtil;
import com.easypoi.domain.Member;/*** 自定义字段处理*/
public class MemberExcelDataHandler extends ExcelDataHandlerDefaultImpl<Member> {@Overridepublic Object exportHandler(Member obj, String name, Object value) {if("昵称".equals(name)){String emptyValue = "暂未设置";if(value==null){return super.exportHandler(obj,name,emptyValue);}if(value instanceof String&&StrUtil.isBlank((String) value)){return super.exportHandler(obj,name,emptyValue);}}return super.exportHandler(obj, name, value);}@Overridepublic Object importHandler(Member obj, String name, Object value) {return super.importHandler(obj, name, value);}
}

2.9 处理器

package com.easypoi.controller;import cn.afterturn.easypoi.entity.vo.NormalExcelConstants;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import cn.afterturn.easypoi.view.PoiBaseView;
import com.easypoi.common.api.CommonResult;
import com.easypoi.domain.Member;
import com.easypoi.domain.Order;
import com.easypoi.domain.Product;
import com.easypoi.handler.MemberExcelDataHandler;
import com.easypoi.util.LocalJsonUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;/*** EasyPoi导入导出测试Controller*/
@Controller
@Api(tags = "EasyPoiController", description = "EasyPoi导入导出测试")
@RequestMapping("/easyPoi")
public class EasyPoiController {@ApiOperation(value = "导出会员列表Excel")@RequestMapping(value = "/exportMemberList", method = RequestMethod.GET)public void exportMemberList(ModelMap map,HttpServletRequest request,HttpServletResponse response) {List<Member> memberList = LocalJsonUtil.getListFromJson("json/members.json", Member.class);ExportParams params = new ExportParams("会员列表", "会员列表", ExcelType.XSSF);//对导出结果进行自定义处理MemberExcelDataHandler handler = new MemberExcelDataHandler();handler.setNeedHandlerFields(new String[]{"昵称"});params.setDataHandler(handler);map.put(NormalExcelConstants.DATA_LIST, memberList);map.put(NormalExcelConstants.CLASS, Member.class);map.put(NormalExcelConstants.PARAMS, params);map.put(NormalExcelConstants.FILE_NAME, "memberList");PoiBaseView.render(map, request, response, NormalExcelConstants.EASYPOI_EXCEL_VIEW);}@ApiOperation("从Excel导入会员列表")@RequestMapping(value = "/importMemberList", method = RequestMethod.POST)@ResponseBodypublic CommonResult importMemberList(@RequestPart("file") MultipartFile file) {ImportParams params = new ImportParams();params.setTitleRows(1);params.setHeadRows(1);try {List<Member> list = ExcelImportUtil.importExcel(file.getInputStream(),Member.class, params);return CommonResult.success(list);} catch (Exception e) {e.printStackTrace();return CommonResult.failed("导入失败!");}}@ApiOperation(value = "导出订单列表Excel")@RequestMapping(value = "/exportOrderList", method = RequestMethod.GET)public void exportOrderList(ModelMap map,HttpServletRequest request,HttpServletResponse response) {List<Order> orderList = getOrderList();ExportParams params = new ExportParams("订单列表", "订单列表", ExcelType.XSSF);//导出时排除一些字段params.setExclusions(new String[]{"ID", "出生日期", "性别"});map.put(NormalExcelConstants.DATA_LIST, orderList);map.put(NormalExcelConstants.CLASS, Order.class);map.put(NormalExcelConstants.PARAMS, params);map.put(NormalExcelConstants.FILE_NAME, "orderList");PoiBaseView.render(map, request, response, NormalExcelConstants.EASYPOI_EXCEL_VIEW);}private List<Order> getOrderList() {List<Order> orderList = LocalJsonUtil.getListFromJson("json/orders.json", Order.class);List<Product> productList = LocalJsonUtil.getListFromJson("json/products.json", Product.class);List<Member> memberList = LocalJsonUtil.getListFromJson("json/members.json", Member.class);for (int i = 0; i < orderList.size(); i++) {Order order = orderList.get(i);order.setMember(memberList.get(i));order.setProductList(productList);}return orderList;}
}

2.10 测试

接下来介绍下EasyPoi的使用,以会员信息和订单信息的导入导出为例,分别实现下简单的单表导出和具有关联信

息的复杂导出。

2.10.1 简单导出

我们以会员信息列表导出为例,使用EasyPoi来实现下导出功能,看看是不是够简单!

  • 首先创建一个会员对象Member,封装会员信息;

  • 在此我们就可以看到EasyPoi的核心注解@Excel,通过在对象上添加@Excel注解,可以将对象信息直接导出

    到Excel中去,下面对注解中的属性做个介绍;

    • name:Excel中的列名;

    • width:指定列的宽度;

    • needMerge:是否需要纵向合并单元格;

    • format:当属性为时间类型时,设置时间的导出导出格式;

    • desensitizationRule:数据脱敏处理,3_4表示只显示字符串的前3位和后4位,其他为*号;

    • replace:对属性进行替换;

    • suffix:对数据添加后缀。

  • 接下来我们在Controller中添加一个接口,用于导出会员列表到Excel,导出的member.json的内容:

[{"id": 1,"username": "admin","password": null,"nickname": "Admin","birthday": "1994-12-31","phone": "18790000000","icon": null,"gender": 0},{"id": 2,"username": "macro","password": null,"nickname": "Macro","birthday": "1995-01-31","phone": "18791000000","icon": null,"gender": 0},{"id": 3,"username": "andy","password": null,"nickname": "Andy","birthday": "1995-02-28","phone": "18792000000","icon": null,"gender": 1},{"id": 4,"username": "ruby","password": null,"nickname": "Ruby","birthday": "1995-03-31","phone": "18793000000","icon": null,"gender": 1},{"id": 5,"username": "tom","password": null,"nickname": "","birthday": "1995-03-31","phone": "18793000000","icon": null,"gender": 1}
]

运行项目,直接通过Swagger访问接口,注意在Swagger中访问接口无法直接下载,需要点击返回结果中的下载按

钮才行,访问地址:http://localhost:8088/swagger-ui/

在这里插入图片描述

在这里插入图片描述

下载完成后,查看下文件,一个标准的Excel文件已经被导出了。

memberList.xlsx文件内容:

在这里插入图片描述

2.10.2 简单导入

导入功能实现起来也非常简单,下面以会员信息列表的导入为例。

  • 在Controller中添加会员信息导入的接口,这里需要注意的是使用@RequestPart注解修饰文件上传参数,否

    则在Swagger中就没法显示上传按钮了;

  • 然后在Swagger中测试接口,选择之前导出的Excel文件即可,导入成功后会返回解析到的数据。

在这里插入图片描述

得到的结果:

{"code": 200,"message": "操作成功","data": [{"id": 1,"username": "admin","password": null,"nickname": "Admin","birthday": "1994-12-30T16:00:00.000+00:00","phone": "187****0000","icon": null,"gender": 0},{"id": 2,"username": "macro","password": null,"nickname": "Macro","birthday": "1995-01-30T16:00:00.000+00:00","phone": "187****0000","icon": null,"gender": 0},{"id": 3,"username": "andy","password": null,"nickname": "Andy","birthday": "1995-02-27T16:00:00.000+00:00","phone": "187****0000","icon": null,"gender": 1},{"id": 4,"username": "ruby","password": null,"nickname": "Ruby","birthday": "1995-03-30T16:00:00.000+00:00","phone": "187****0000","icon": null,"gender": 1},{"id": 5,"username": "tom","password": null,"nickname": "暂未设置","birthday": "1995-03-30T16:00:00.000+00:00","phone": "187****0000","icon": null,"gender": 1}]
}
2.10.3 复杂导出

当然EasyPoi也可以实现更加复杂的Excel操作,比如导出一个嵌套了会员信息和商品信息的订单列表,下面我们来

实现下!

  • 首先添加商品对象Product,用于封装商品信息;

  • 然后添加订单对象Order,订单和会员是一对一关系,使用@ExcelEntity注解表示,订单和商品是一对多关

    系,使用@ExcelCollection注解表示,Order就是我们需要导出的嵌套订单数据;

  • 接下来在Controller中添加导出订单列表的接口,由于有些会员信息我们不需要导出,可以调用

    ExportParams中的setExclusions方法排除掉;

  • 在Swagger中访问接口测试,导出订单列表对应Excel;

products.json的内容:

[{"id": 1,"productSn": "7437788","name": "小米8","subTitle": "全面屏游戏智能手机 6GB+64GB 黑色 全网通4G 双卡双待","brandName": "小米","price": 2699,"count": 1},{"id": 2,"productSn": "7437789","name": "红米5A","subTitle": "全网通版 3GB+32GB 香槟金 移动联通电信4G手机 双卡双待","brandName": "小米","price": 649,"count": 1},{"id": 3,"productSn": "7437799","name": "Apple iPhone 8 Plus","subTitle": "64GB 红色特别版 移动联通电信4G手机","brandName": "苹果","price": 5499,"count": 1}
]

orders.json的内容:

[{"id": 1,"orderSn": "201809150101000001","createTime": "2021-10-10 17:02:28","receiverAddress": "广东省深圳市"},{"id": 1,"orderSn": "201809150101000002","createTime": "2021-10-11 17:02:28","receiverAddress": "江苏省南京市"},{"id": 1,"orderSn": "201809150101000003","createTime": "2021-10-12 17:02:28","receiverAddress": "江苏省苏州市"}
]

在这里插入图片描述

  • 下载完成后,查看下文件,EasyPoi导出复杂的Excel也是很简单的!

在这里插入图片描述

2.10.4 自定义处理

如果你想对导出字段进行一些自定义处理,EasyPoi也是支持的,比如在会员信息中,如果用户没有设置昵称,我

们添加下暂未设置信息。

  • 我们需要添加一个处理器继承默认的ExcelDataHandlerDefaultImpl类,然后在exportHandler方法中实

    现自定义处理逻辑;

  • 然后修改Controller中的接口,调用MemberExcelDataHandler处理器的setNeedHandlerFields设置需要

    自定义处理的字段,并调用ExportParamssetDataHandler设置自定义处理器;

  • 再次调用导出接口,我们可以发现昵称已经添加默认设置了。

上面的代码已经是自定义处理过的。

//对导出结果进行自定义处理
MemberExcelDataHandler handler = new MemberExcelDataHandler();
handler.setNeedHandlerFields(new String[]{"昵称"});
params.setDataHandler(handler);

3、总结

体验了一波EasyPoi,它使用注解来操作Excel的方式确实非常好用。如果你想生成更为复杂的Excel的话,可以考

虑下它的模板功能。

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

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

相关文章

关于mac下pycharm旧版本没删除的情况下新版本2023安装之后闪退

先说结论&#xff0c;我用的app cleaner 重新删除的pycharm &#xff0c;再重新安装即可。在此记录一下 之前安装的旧版的2020的pycharm&#xff0c;因为装不了新的插件&#xff0c;没办法就升级了。新装2023打开之后闪退&#xff0c;重启系统也不行&#xff0c;怀疑是一起破解…

3D全景技术,为我们打开全新宣传领域

随着科技的发展&#xff0c;3D全景技术正在融入我们的生活&#xff0c;这种全新视觉体验方式为我们打开了一扇全新的宣传领域&#xff0c;可以让我们多方位、多视角地探索各个行业&#xff0c;无论是对教育、商业、还是其他领域&#xff0c;都产生了深远的影响。 3D全景技术结合…

【每日一题】—— C. Anonymous Informant(Codeforces Round 908 (Div. 2))(思维题)

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;每日一题 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日反刍 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓称…

Python基础入门----Python虚拟环境:为何要用虚拟环境、如何使用virtualenv

文章目录 在Python开发中,虚拟环境是一个独立的目录树,可以在其中安装Python模块。每个虚拟环境都有自己的Python二进制文件和一组安装的库。使用虚拟环境的主要原因是为了避免项目间的依赖冲突,允许每个项目有其特定的依赖,而不影响全局安装的模块。 为何要用虚拟环境 依…

三菱FX3U系列—原点回归指令

目录 一、简介 二、指令形式 1、原点指令[ZRN/DZRN] 2、带搜索的原点回归指令[DSZR] 三、回归指令运行过程 1、ZRN原点回归运行过程 2、带搜索的原点回归运行过程 四、特殊辅助继电器 五、特殊输出模块 六、总结 一、简介 用于将电机或伺服驱动器控制的轴回到预定的原…

Java枚举类的使用

说明: 根据设计图抽象的枚举类,一张模板背景图(会改变),二维码(传入参数生成),一个关闭的icon(固定不变) 设计图如下 枚举类 去除重复模板后共五个,根据需求编写枚举类如下,url则对应不同的模板,编写成后台人员的可配置项, public enum ImageTemplateEnum {PURCHASE("p…

【ES专题】ElasticSearch功能详解与原理剖析

目录 前言要点阅读对象阅读导航前置知识笔记正文一、ES数据预处理1.1 Ingest Node&#xff1a;摄入节点1.2 Ingest Pipeline&#xff1a;摄入管道1.3 Processor&#xff1a;预处理器——简单加工1.4 Painless Script&#xff1a;脚本——复杂加工1.5 简单实用案例 二、文档/数据…

springcloud二手交易平台系统源码

开发技术&#xff1a; 大等于jdk1.8&#xff0c;大于mysql5.5&#xff0c;idea&#xff08;eclipse&#xff09;&#xff0c;nodejs&#xff0c;vscode&#xff08;webstorm&#xff09; springcloud springboot mybatis vue elementui mysql 功能介绍&#xff1a; 用户端&…

时间序列预测模型实战案例(十)(个人创新模型)通过堆叠CNN、GRU、LSTM实现多元预测和单元预测

本文介绍 本篇博客为大家讲解的是通过组堆叠CNN、GRU、LSTM个数&#xff0c;建立多元预测和单元预测的时间序列预测模型&#xff0c;其效果要比单用GRU、LSTM效果好的多&#xff0c;其结合了CNN的特征提取功能、GRU和LSTM用于处理数据中的时间依赖关系的功能。通过将它们组合在…

Java根据一个List内Object的两个字段去重

背景 在Java开发过程中&#xff0c;我们经常会遇到需要对List进行去重的需求。 其中常见的情况是&#xff0c;将数组去重&#xff0c;或者将对象依据某个字段去重。这两种方式均可用set属性进行处理。 今天讨论&#xff0c;有一个List&#xff0c;且其中的元素是自定义的对象&…

【VUE+ elementUI 实现动态表头渲染】

VUE elementUI 实现动态表头渲染 1、定义 columns&#xff08;表头数据&#xff09; 和 dataList&#xff08;表格数据&#xff09; data() {return {loading: false,dataList: [{ name: 张三, sex: 男, age: 18 },{ name: 林琳, sex: 女, age: 20 },{ name: 王五, sex: 男, …

数据分析-numpy

numpy numpy numpy简介优点下载ndarray的属性输出数据类型routines 函数ndarray对象的读写操作ndarray的级联和切分级联切分 ndarray的基本运算广播机制&#xff08;Broadcast&#xff09;ndarry的聚合操作数组元素的操作numpy 数学函数numpy 查找和排序 写在最后面 简介 nump…

ChatGPT:something went wrong

今天下午不知什么原因&#xff0c;ChatGPT无法使用。我原来在使用ChatGPT for chrome&#xff0c;返回了一个答案&#xff0c;后来在网页端无法使用&#xff0c;以为是这个chrome插件泄露API KEY导致的。注销账号&#xff0c;删除API KEY后&#xff0c;wrong问题仍然存在。 我…

API是什么?解密API背后的奥秘

API&#xff0c;全称Application Programming Interface&#xff0c;是一种用于不同应用程序间通信的接口&#xff0c;它允许不同的应用程序之间交换数据和功能。API可以理解为应用程序提供给其他应用程序或开发者的接口&#xff0c;通过这个接口&#xff0c;其他应用程序或开发…

PostgreSQL 技术内幕(十一)位图扫描

扫描算子在上层计算和底层存储之间&#xff0c;向下扫描底层存储的数据&#xff0c;向上作为计算的输入源&#xff0c;在SQL的执行层中&#xff0c;起着关键的作用。顺序、索引、位图等不同类型的扫描算子适配不同的数据分布场景。然而&#xff0c;扫描算子背后的实现原理是怎样…

【JavaEESpring】认识Spring

认识Spring 1. 什么是框架2. SpringBoot 介绍2.1 Spring 的介绍2.2 SpringBoot 1. 什么是框架 框架(Framework) &#xff0c;意思是框架、机制、准则。通俗的来讲: 框架是实现某种功能的半成品, 他提供了⼀些常⽤的⼯具类, 我们在框架的基础上, 可以更加⾼效的进⾏开发 后端框…

Redis6的IO多线程分析

性能测试 机器配置 C Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 14 On-line CPU(s) list: 0-13 Mem: 62G性能 配置推荐 官方表示&#xff0c;当使用redis时有性能瓶…

《开箱元宇宙》:认识香港麦当劳通过 The Sandbox McNuggets Land 的 Web3 成功经验

McNuggets Land 是 The Sandbox 于 2023 年发布的最受欢迎的体验之一。在本期的《开箱元宇宙》系列中&#xff0c;我们采访了香港麦当劳数位顾客体验暨合作伙伴资深总监 Kai Tsang&#xff0c;来了解这一成功案例背后的策略。 在不断发展的市场营销和品牌推广领域&#xff0c;不…

Visual Studio 2022 + OpenCV 4.5.2 安装与配置教程

目录 OpenCV的下载与配置Visual Studio 2022的配置新建工程新建文件新建项目属性表环境配置测试先写一个输出将OpenCV的动态链接库添加到项目的 x64 | Debug下测试配置效果 Other OpenCV的下载与配置 参考这个OpenCV的下载与环境变量的配置&#xff1a; Windows10CLionOpenCV4…

网络原理---拿捏HTTP协议:请求和响应

文章目录 认识请求首行URLURL的格式URL的encode和decode 版本号方法GET方法POST方法GET VS POST 请求头&#xff1a;headerHostContent-Length 和 Content-TypeUser-Agent&#xff08;UA&#xff09;RefererCookie 空行正文&#xff1a;body如何构造HTTP请求&#xff1f;浏览器…