EasyPOI使用详解
EasyPOI
简介
环境搭建
# 1.引入相关依赖
<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>3.2.0</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-web</artifactId><version>3.2.0</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-annotation</artifactId><version>3.2.0</version></dependency>
相关注解
- @Excel 作用到filed上面,是对Excel一列的一个描述
- @ExcelCollection 表示一个集合,主要针对一对多的导出,比如一个老师对应多个科目,科目就可以用集合表示
- @ExcelEntity 表示一个继续深入导出的实体,但他没有太多的实际意义,只是告诉系统这个对象里面同样有导出的字段
- @ExcelIgnore 和名字一样表示这个字段被忽略跳过这个导出
- @ExcelTarget 这个是作用于最外层的对象,描述这个对象的id,以便支持一个对象可以针对不同导出做出不同处理
@ExcelTarget
# 1.说明- 用在实体类上标识是一个可以通过EasyPOI导入导出的实体类- 相关属性:value: [String][定义id唯一标识,不能重复] `常用`height: [Double][定义单元格高度]fontSize: [short ][定义单元格字体大小]# 2.使用@ExcelTarget("users")public class User implements Serializable {//..... 省略属性 相关GET,SET方法}
@Excel
# 1.说明- 用在filed(属性)上面,是对Excel一列的一个描述- 常用属性:name : [String][生成Excel表格中列名]needMerge: [boolean][是否需要纵向合并单元格(用于含有list中,单个的单元格,合并list创建的多个row)]orderNum : [String][指定生成Excel中列的顺序,按照数字自然顺序排序]savePath : [String][指定导入Excel中图片的保存路径]type : [String][导出类型 1 是文本 2 是图片,3 是函数,10 是数字 默认是文本]width : [Double][指定导出Excel时列的宽度]isImportField: [boolean][是否是导入字段,如果没有说明是错误的Excel]exportFormat: [String][导出Excel的时间格式]importFormat: [String][导入Excel的时间格式]format : [String][相当于同时设置了exportFormat和importFormat]imageType: [int ][导出类型 1 从file读取 2 是从数据库中读取 默认是文件 同样导入也是一样的]suffix : [String][文字后缀,如% ,90 变成90%]replace:[String[]][替换,用法:{"a_1","b_2"},a指的是要替换的内容,1指的被替换的数据(把数据库为1的替换为a,把2替换为b)]
public class User implements Serializable {@Excel(name="编号",orderNum="1",replace = {"第一份_1","第二份_2"})private String id;@Excel(name="姓名",orderNum="2")private String name;@Excel(name="年龄",orderNum="4",suffix = " $")private Integer age;@Excel(name="生日",orderNum = "3",width = 20.0,exportFormat = "yyyy年MM月dd日")private Date bir;//...省略GET、SET方法}
@ExcelTarget("emp")@Datapublic class Emp implements Serializable {// name要和excel的标题一致@Excel(name="编号")private Integer id;@Excel(name="姓名")private String name;@Excel(name="年龄" )private Integer age;@Excel(name = "生日",format = "yyyy-MM-dd")private Date birthday;@Excel(name = "状态",replace = {"可用_0","不可用_1"})//replace:替换private String status;//图片 type:标识导入导出类型为图片,savePath:图片保存的位置@Excel(name = "头像",type = 2,savePath = "C:/Users/1/IdeaProjects/easypoi/src/main/resources/static")private String image;}
# 1.说明- 标记是不是导出excel 标记为实体类,一遍是一个内部属性类,标记是否继续穿透- 常用属性:name: [String][定义唯一标识]
@ExcelTarget("users")public class User implements Serializable {//... 省略GET SET和其他属性@ExcelEntity(name="身份信息")private Card card;}@ExcelTarget("card")public class Card implements Serializable {@Excel(name="身份证号",orderNum = "6")private String id;@Excel(name="家庭住址",orderNum = "7")private String address;}
@ExcelCollection
# 1.说明- 一对多的集合注解,用以标记集合是否被数据以及集合的整体排序- 常用属性:name : [String][定义集合列名]orderNum: [int][用来指定导出excel集合内列的顺序]type : [Class\<?>][用来指定导出是创建对象类型]
@ExcelTarget("users")public class User implements Serializable {//....省略GET SET其他属性@ExcelCollection(name="订单",orderNum = "5")private List<Order> orders;}@ExcelTarget("orders")public class Order implements Serializable {//....省略GET SET方法@Excel(name = "订单编号")private String id;@Excel(name = "订单名称")private String name;}
@ExcelIgnore
# 1.说明- 用在属性上,导出Excel时忽略这个属性
导出Excel
1.导出基本数据
注意:导出Excel的对象必须实现对象序列化接口
# 1.定义对象
@ExcelTarget("users")public class User implements Serializable {@Excel(name="编号",orderNum="1",replace = {"xxx_1","nnn_2"})private String id;@Excel(name="姓名",orderNum="2")private String name;@Excel(name="年龄",orderNum="4",suffix = " $")private Integer age;@Excel(name="生日",orderNum = "3",width = 20.0,exportFormat = "yyyy年MM月dd日")private Date bir;//省略GET、SET方法。。。}
# 2.定义测试数据
//测试数据public static List<User> getUsers(){List<User> users = new ArrayList<>();for (int i = 0; i < 10; i++) {User user = new User();user.setId(String.valueOf(i));user.setName("小陈");user.setAge(20+i);user.setBir(new Date());users.add(user);}return users;}
# 3.导出Excel
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("用户列表","测试"),User.class,getUsers());FileOutputStream outputStream = new FileOutputStream("/Users/chenyannan/Desktop/aa.xls");workbook.write(outputStream);outputStream.close();workbook.close();
# 4.查看Excel

2.导出指定字段
//@Excel(name="年龄",orderNum="4",suffix = " $")@ExcelIgnoreprivate Integer age;

3.导出list集合
# 1.说明- 往往有时候导出的对象中含有数组或者集合,需要导出这样的数据可以直接使用@Excel进行导出
@ExcelTarget("users")public class User implements Serializable {@Excel(name="爱好",orderNum = "5",width = 20.0)private List<String> habbys;//....}

# 2.说明- 从上面运行结果可以看出,导出的格式默认是上述图片中格式,如果需要自定义导出格式怎么办?- 自定义导出格式可以在对应的set方法中进行处理即可
@ExcelTarget("users")public class User implements Serializable {@ExcelIgnore //忽略原始list集合private List<String> habbys;@Excel(name="爱好",orderNum = "5",width = 20.0)private String habbysstr; //定义一个list集合字符串,用来存储集合数据public String getHabbysstr(){ //修改get方法StringBuilder sb = new StringBuilder();this.habbys.forEach(s->sb.append(s).append("、"));return sb.toString();}}
# 3.导出查看结果

3.导出对象中含有对象
# 1.说明- 导出对象中含有对象的Excel
@ExcelTarget("users")public class User implements Serializable {@ExcelEntity(name="card") //定义对象private Card card;//.....}@ExcelTarget("card")public class Card implements Serializable {@Excel(name="身份证号",orderNum = "6")private String id;@Excel(name="家庭住址",orderNum = "7")private String address;}
# 2.为导出对象赋值
//测试数据public static List<User> getUsers(){List<User> users = new ArrayList<>();for (int i = 0; i < 10; i++) {User user = new User();user.setId(String.valueOf(i));user.setName("小陈");user.setAge(20+i);user.setBir(new Date());user.setHabbys(Arrays.asList("看书","听歌","打篮球"));user.setCard(new Card("11000103422323212342","北京市朝阳区"));users.add(user);}return users;}
# 3.导出Excel
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("用户列表","测试"),User.class,getUsers());FileOutputStream outputStream = new FileOutputStream("/Users/chenyannan/Desktop/aa.xls");workbook.write(outputStream);outputStream.close();workbook.close();

4.导出一对多关系
# 1.说明- 往往在业务比较复杂时,我们需要导出一对多关联关系处理,如 导出学生课程信息,导出用户的所有订单信息等等....- 在Easypoi中如何处理一对多关系呢?
@ExcelTarget("users")public class User implements Serializable {//......@ExcelCollection(name="订单信息",orderNum="8")private List<Order> orders; //定义集合}
@ExcelTarget("orders")public class Order implements Serializable {@Excel(name = "订单编号")private String id;@Excel(name = "订单名称")private String name;}
# 2.测试数据
//测试数据public static List<User> getUsers(){List<User> users = new ArrayList<>();for (int i = 0; i < 10; i++) {User user = new User();user.setId(String.valueOf(i));user.setName("小陈");user.setAge(20+i);user.setBir(new Date());user.setHabbys(Arrays.asList("看书","听歌","打篮球"));user.setCard(new Card("11000103422323212342","北京市朝阳区"));user.setOrders(Arrays.asList(new Order("1","超短裙"), new Order("2","iphone X")));users.add(user);}return users;}
# 3.导出Excel
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("用户列表","测试"),User.class,getUsers());FileOutputStream outputStream = new FileOutputStream("/Users/chenyannan/Desktop/aa.xls");workbook.write(outputStream);outputStream.close();workbook.close();

5.导出图片
# 1.说明- 往往随着业务不断变化,可能需要在导出excel时将图片信息也一并导出,如商品图标,用户头像信息等数据,这个时候easypoi该如何处理呢?
@ExcelTarget("users")public class User implements Serializable {//.....@Excel(name="头像信息",type = 2,orderNum = "0",width = 12,height = 12)//type的值一定要指定为2private String photo;//定义头像 直接写指定图片路径}
# 2.准备图片放入指定路径中,并在测试数据中进行赋值
//测试数据public static List<User> getUsers(){List<User> users = new ArrayList<>();for (int i = 0; i < 10; i++) {User user = new User();user.setId(String.valueOf(i));user.setName("小陈");user.setAge(20+i);user.setBir(new Date());user.setHabbys(Arrays.asList("看书","听歌","打篮球")); //设置爱好user.setCard(new Card("11000103422323212342","北京市朝阳区"));//设置对象user.setOrders(Arrays.asList(new Order("1","超短裙"), new Order("2","iphone X")));//设置集合user.setPhoto("/Users/chenyannan/Desktop/1.jpeg");//设置头像users.add(user);}return users;}
# 3.导出Excel查看结果

6.大数据量导出
# 1.说明- 大数据导出是当我们的导出数量在几万,到上百万的数据时,一次从数据库查询这么多数据加载到内存然后写入会对我们的内存和CPU都产生压力,这个时候需要我们像分页一样处理导出分段写入Excel缓解Excel的压力
Workbook workbook1 = ExcelExportUtil.exportBigExcel(new ExportParams("用户列表", "测试"), User.class, getUsers());workbook1.write(outputStream);ExcelExportUtil.closeExportBigExcel();
注意:最好大量数据进行分页处理,每次导出数据最好不要超过1W条记录
导入Excel
1.导入基本数据
# 0.准备导入的目标Excel

# 1.定义导出数据基本对象- 为了节省篇幅,一下代码统一忽略getter,setter
public class Student implements Serializable {@Excel(name="编号")private String id;@Excel(name="姓名")private String name;@Excel(name="年龄")private Integer age;@Excel(name="生日",format = "yyyy年MM月dd日")private Date bir;}
# 2.导入excel中数据
@Testpublic void test(){//定义导入参数ImportParams importParams = new ImportParams();importParams.setTitleRows(1);importParams.setHeadRows(1);//导出数据 餐数1:当如excel文件 参数2:导入对象的类型 参数3:导入参数配置List<Student> students = ExcelImportUtil.importExcel(new File("/Users/chenyannan/Desktop/student.xls"), Student.class,importParams);students.forEach(s-> System.out.println(s));}
# 3.查看导入结果

2.导入小技巧
# 1.技巧说明- 读取指定的sheet比如要读取上传得第二个sheet 那么需要把startSheetIndex = 1 就可以了- 读取几个sheet比如读取前2个sheet,那么 sheetNum=2 就可以了- 读取第二个到第五个sheet设置 startSheetIndex = 1 然后sheetNum = 4- 读取全部的sheetsheetNum 设置大点就可以了- 判断一个Excel是不是合法的ExcelimportFields 设置下值,就是表示表头必须至少包含的字段,如果缺一个就是不合法的excel,不导入
3.带图片导入
# 0.准备数据

# 1.说明- 有图片的导出就有图片的导入,导入的配置和导出是一样的,但是需要设置保存路径
public class Student implements Serializable {@Excel(name="编号")private String id;@Excel(name="姓名")private String name;@Excel(name="年龄")private Integer age;@Excel(name="生日",format = "yyyy年MM月dd日")private Date bir;@Excel(name="头像信息",type = 2,savePath = "/Users/chenyannan/IdeaProjects/180codes/baizhimail/src/main/webapp")private String photo;}
# 2.导入Excel
@Testpublic void test(){//定义导入参数ImportParams importParams = new ImportParams();importParams.setTitleRows(1);importParams.setHeadRows(1);importParams.setImportFields(new String[]{"生日"});importParams.setNeedSave(false);//是否保存上传的excelimportParams.setSaveUrl("/Users/chenyannan/IdeaProjects/180codes/baizhimail/src/main/webapp");//导出数据 餐数1:当如excel文件 参数2:导入对象的类型 参数3:导入参数配置List<Student> students = ExcelImportUtil.importExcel(new File("/Users/chenyannan/Desktop/students.xls"), Student.class,importParams);students.forEach(s-> System.out.println(s));}
# 3.测试导入结果

集成web实现导入导出
1.搭建springboot+mybatis项目环境
# 1.创建springboot项目

# 2.引入相关依赖- mybatis- mysql- druid- easypoi- 引入thymelaf
<!--引入mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.3</version></dependency><!--引入mysql--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.38</version></dependency><!--引入druid--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.19</version></dependency><!--引入thymelaf--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><!--引入easypoi--><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>3.2.0</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-web</artifactId><version>3.2.0</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-annotation</artifactId><version>3.2.0</version></dependency>
server.port=8989spring.application.name=easypoispring.thymeleaf.cache=falsespring.datasource.type=com.alibaba.druid.pool.DruidDataSourcespring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/easypoi?characterEncoding=UTF-8spring.datasource.username=rootspring.datasource.password=rootmybatis.mapper-locations=classpath:com/baizhi/mapper/*.xmlmybatis.type-aliases-package=com.baizhi.entity
# 4.创建包结构

# 5.启动项目检测环境搭建是否成功

2.开发测试页面
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>导入excel的主页面</title><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"></head><body><div class="container-fluid"><div class="row"><div class="col-md-12"><h1>选择Excel文件导入到数据中</h1><form action="" method="post" class="form-inline"><div class="form-group"><input class="form-control" type="file" name="excelFile"><input type="submit" class="btn btn-danger" value="导入数据"></div></form></div><div class="col-md-12"><h1>显示导入数据列表</h1><table class="table table-bordered" ><tr><th>编号</th><th>头像</th><th>姓名</th><th>年龄</th><th>生日</th></tr><tr><td>1</td><td><img src="" alt=""></td><td>小陈</td><td>23</td><td>2012-12-12</td></tr><tr><td>1</td><td><img src="" alt=""></td><td>小陈</td><td>23</td><td>2012-12-12</td></tr></table><hr><input type="button" class="btn btn-info" value="导出excel"></div></div></div></body></html>

3.查询所有
# 0.准备数据Excel

# 1.根据Excel抽取库表结构
SET NAMES utf8mb4;SET FOREIGN_KEY_CHECKS = 0;-- ------------------------------ Table structure for t_user-- ----------------------------DROP TABLE IF EXISTS `t_user`;CREATE TABLE `t_user` (`id` int(6) NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`bir` timestamp NULL DEFAULT NULL,`photo` varchar(150) DEFAULT NULL,`habbys` varchar(100) DEFAULT NULL,`cardno` varchar(18) DEFAULT NULL,`address` varchar(60) DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;SET FOREIGN_KEY_CHECKS = 1;
@Data@ExcelTarget("users")public class User implements Serializable {@Excel(name="编号")private String id;@Excel(name="姓名")private String name;@Excel(name="生日",format = "yyyy年MM月dd日")private Date bir;@Excel(name="头像信息",type = 2,savePath = "/Users/chenyannan/IdeaProjects/180codes/easypoi/src/main/resources/static/imgs")private String photo;@Excel(name="爱好",width = 12.0)private String habbys;@Excel(name="身份证号",width = 15.0)private String cardno;@Excel(name="家庭住址",width = 15.0)private String address;}
@Mapperpublic interface UserDAO {//查询所有List<User> findAll();}
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.baizhi.dao.UserDAO"><!--查询所有--><select id="findAll" resultType="User">select id,name,bir,photo,habbys,cardno,address from t_user</select></mapper>
# 4.创建Service接口&实现
public interface UserService {List<User> findAll();}
@Service@Transactionalpublic class UserServiceImpl implements UserService {@Autowiredprivate UserDAO userDAO;@Overridepublic List<User> findAll() {return userDAO.findAll();}}
# 5.创建Controller完成查询所有
@Controller@RequestMapping("/user")@Slf4jpublic class UserController {@Autowiredprivate UserService userService;//查询所有@RequestMapping("/findAll")public String findAll(HttpServletRequest request){List<User> users = userService.findAll();request.setAttribute("users",users);return "index";}}
# 6.修改index.html展示所有数据
引入thymeleaf语法解析:<html lang="en" xmlns:th="http://www.thymeleaf.org">
<!DOCTYPE html><html lang="en" xmlns:th="http://www.thymeleaf.org"><head><meta charset="UTF-8"><title>导入excel的主页面</title><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"></head><body><div class="container-fluid"><div class="row"><div class="col-md-12"><h1>选择Excel文件导入到数据中</h1><form th:action="@{/user/import}" method="post" enctype="multipart/form-data" class="form-inline"><div class="form-group"><input class="form-control" type="file" name="excelFile"><input type="submit" class="btn btn-danger" value="导入数据"></div></form></div><div class="col-md-12"><h1>显示导入数据列表</h1><table class="table table-bordered" ><tr><th>编号</th><th>头像</th><th>姓名</th><th>生日</th><th>爱好</th><th>身份证号</th><th>家庭住址</th></tr><tr th:each="user : ${users}"><td th:text="${user.id}"></td><td><img th:src="${'/imgs/'+ user.photo}" height="60px" alt=""></td><td th:text="${user.name}"></td><td th:text="${#dates.format(user.bir,'yyyy-MM-dd')}"></td><td th:text="${user.habbys}"></td><td th:text="${user.cardno}"></td><td th:text="${user.address}"></td></tr></table><hr><a th:href="@{/user/export}" class="btn btn-info">导出excel</a></div></div></div></body></html>

# 7.启动项目进行访问

4.导入数据
# 1.开发DAO&Mapper
@Mapperpublic interface UserDAO {//查询所有List<User> findAll();//插入记录void save(User user);}
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.baizhi.dao.UserDAO"><!--查询所有--><select id="findAll" resultType="User">select id,name,bir,photo,habbys,cardno,address from t_user</select><!--插入记录--><insert id="save" parameterType="User" useGeneratedKeys="true" keyProperty="id">insert into t_user values (#{id},#{name},#{bir},#{photo},#{habbys},#{cardno},#{address})</insert></mapper>
# 2.开发Service接口和实现类
public interface UserService {//查询所有List<User> findAll();//批量保存void saveAll(List<User> users);}
@Service@Transactionalpublic class UserServiceImpl implements UserService {@Autowiredprivate UserDAO userDAO;@Overridepublic List<User> findAll() {return userDAO.findAll();}@Overridepublic void saveAll(List<User> users) {users.forEach(user -> {user.setId(null);user.setPhoto(user.getPhoto().substring(user.getPhoto().lastIndexOf("/")+1));userDAO.save(user);});}}
# 3.开发controller
//导入excel@RequestMapping("/import")public String importExcel(MultipartFile excelFile) throws Exception {log.info("文件名称: [{}]",excelFile.getOriginalFilename());ImportParams params = new ImportParams();params.setTitleRows(1);//设置一级标题行为1行params.setHeadRows(1);//设置header标题为1行List<User> users = ExcelImportUtil.importExcel(excelFile.getInputStream(), User.class, params);log.info("导入总数为: [{}]", users.size());userService.saveAll(users);return "redirect:/user/findAll";}
# 4.编辑页面index.html- 表单提交方式必须是post- 表单的enctype必须为multipart/form-data
<form th:action="@{/user/import}" method="post" enctype="multipart/form-data" class="form-inline"><div class="form-group"><input class="form-control" type="file" name="excelFile"><input type="submit" class="btn btn-danger" value="导入数据"></div></form>
# 5.启动项目导入Excel数据

5.导出数据
# 1.开发Controller
//导出excel@RequestMapping("/export")public void exportExcel(HttpServletResponse response,HttpServletRequest request) throws IOException {List<User> users = userService.findAll();users.forEach(user -> {try {Excel excelAnn = user.getClass().getDeclaredField("photo").getAnnotation(Excel.class);user.setPhoto(excelAnn.savePath()+'/'+user.getPhoto());} catch (NoSuchFieldException e) {e.printStackTrace();}});Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("用户列表", "用户信息"), User.class, users);response.setHeader("content-disposition","attachment;fileName="+ URLEncoder.encode("用户列表.xls","UTF-8"));ServletOutputStream os = response.getOutputStream();workbook.write(os);os.close();workbook.close();}
# 2.编辑index.html页面

# 3.启动项目测试excel导出


相关文章:

EasyPOI使用详解
EasyPOI 简介 easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板 语言(熟悉的表达式语法),完成以前复杂的写法 文档:http://easypoi.mydoc.io/#categor…...

【云原生开发】K8S多集群资源管理平台架构设计
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...

基于SpringBoot的城镇住房保障系统开发
2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…...

一文解秘Rust如何与Java互操作
本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0许可协议。转载请注明来自 唯你 使用场景 JAVA 与 Rust 互操作让 Rust 可以背靠 Java 大生态来做更多事情,而 Java 也可以享受 Rust 语言特性的内存安全,所有权机制,无畏并发。…...
手机发展史介绍
手机,这个曾经在电影和科幻小说中出现的高科技产品,如今已经渗透进了我们生活的每个角落。从单纯的通讯工具到如今集成了通讯、娱乐、工作、社交等多种功能的智能终端,手机的发展史也是人类科技进步的缩影。本文将从手机的发展历程、技术革新…...

【ArcGISPro】单次将自己建立的工具箱添加至Arcpy中
新建工具箱 添加至Arcpy中 调用刚添加的工具箱...

docker镜像仓库常用命令
docker镜像仓库常用命令 docker logindocker logoutdocker pulldocker pushdocker searchdocker imagesdocker image inspectdocker tagdocker rmidocker image prunedocker savedocker loaddocker history docker login 语法: docker login [options] [server] 功能ÿ…...
springboot 传统应用程序,适配云原生改造
概述 2024年传统应用程序上云,改造方案 1、mysql 云环境高可用方案 2、redis 云环境高可用方案 3、nginx 云环境高可用方案 4、应用 云环境高可用方案1、mysql 云环境高可用方案 1.1 你先了解 1.1.1 你先了解“mysql高可用方案” 主从复制(Master-S…...

D61【python 接口自动化学习】- python基础之数据库
day61 数据库定义 学习日期:20241107 学习目标:MySQL数据库-- 130:MySQL入门使用 学习笔记: 在命令提示符内先试用MySQL 使用图形化工具操作MySQL DBeaver安装 DBeaver连接MySQL 总结 MySQL安装成功后,可以使用命…...

数据库期末考试简答题
1.试述数据、数据库、数据库管理系统、数据库系统的概念。 答:(1)数据是数据库中存储的基本对象,是描述事物的符号记录。数据有多种表现形式,它们都可以经过数字化后存入计算机。数据的种类有数字、文字、…...
Java[面试题]-真实面试
1.什么是IOC和AOP?了解么? IOC(控制反转)和AOP(面向切面编程) 1. IOC(控制反转) 概念 IOC(Inversion of Control)是面向对象编程中的一个设计原则…...
HTML5新增多媒体支持
一、引言 在当今数字化时代,丰富的多媒体内容对于网页的吸引力和用户体验至关重要。HTML5 的出现为网页带来了强大的多媒体支持,尤其是在音频和视频方面,为开发者和用户带来了全新的可能性。 二、音频audio标签 2.1 定义与属性详解 <a…...

K8S群集调度二
一、污点(Taint) 和 容忍(Tolerations) 1.1、污点(Taint) 设置在node上是对pod的一种作用 节点的亲和性,是Pod的一种属性(偏好或硬性要求),它使Pod被吸引到一类特定的节点 而Taint 则相反,它使节点能够排斥一类特…...

43.第二阶段x86游戏实战2-提取游戏里面的lua
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要…...

debian系统安装qt的时候 显示xcb相关文件缺失
如果是安装之后的问题 我们可以选择使用ldd的命令查看当前依赖的so那些文件确实 ldd /home/yinsir/Qt/5.15.2/gcc_64/plugins/platforms/libqxcb.so 本人在进行打包的时候 出现则会个报错 ERROR: ldd outputLine: “libxcb-util.so.1 > not found” ERROR: for binary: “/…...

得物多模态大模型在重复商品识别上的应用和架构演进
重复商品治理介绍 根据得物的平台特性,同一个商品在平台上不能出现多个链接,原因是平台需要保证一品一链的特点,以保障商品的集中竞价,所以说一个商品在整个得物平台上只能有一个商详链接,因此我们需要对一品多链的情…...

基于 SSM(Spring + Spring MVC + MyBatis)框架构建电器网上订购系统
基于 SSM(Spring Spring MVC MyBatis)框架构建电器网上订购系统可以为用户提供一个方便快捷的购物平台。以下将详细介绍该系统的开发流程,包括需求分析、技术选型、数据库设计、项目结构搭建、主要功能实现以及前端页面设计。 需求分析 …...
应用插件化及其进程关系梳理
插件应用的AndroidManifest.xml <manifest xmlns:android"http://schemas.android.com/apk/res/android"coreApp"true"package"com.demo.phone"android:sharedUserId"android.uid.phone"><uses-sdk android:minSdkVersion&q…...

Odoo:免费开源的医药流通行业信息化解决方案
文 / 开源智造Odoo亚太金牌服务 方案概述 开源智造Odoo免费开源ERP提供面向医药批发采、供、销业财一体化,及直接面向消费者的门店终端、全渠道管理、营销管理以及GSP合规管理解决方案,提升企业运营效率和全业务链条的数字化管控、追溯能力。 行业的最新…...
系统架构设计师论文:大数据Lambda架构
论文一:大数据Lambda架构 1简要说明你参与开发的软件项目,以及你所承担的主要工作 2 lamada体系架构将数据流分为批处理层(Batch Layer)、加速层(Speed Layer)、服务层(Serving Layer)。简要叙述这三个层次的用途和特点 3 详细阐述你参与开发的软件项目是如何基于lamada…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...

嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...

基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...