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

【业务功能篇55】Springboot+easyPOI 导入导出

Apache POI是Apache软件基金会的开源项目,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

Apache POI 代码实现复杂,学习成本较高。

Easypoi 功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板 语言(熟悉的表达式语法),完成以前复杂的写法

EasyPOI官网:EasyPoi教程_V1.0

环境搭建

1)搭建springboot项目

2)导入依赖

        <!-- 引入easyPOI --><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.2.0</version></dependency>

 EasyPOI相关注解

easypoi 起因就是Excel的导入导出,最初的模板是实体和Excel的对应,model--row,filed--col 这样利用注解我们可以和容易做到excel到导入导出 经过一段时间发展,现在注解有5个类分别是

  • @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%]

2.使用

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方法
}

 

@ExcelEntity

1.说明

- 标记是不是导出excel 标记为实体类,一遍是一个内部属性类,标记是否继续穿透
- 常用属性:
name: [String][定义唯一标识]

2.使用

@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\<?>][用来指定导出是创建对象类型]
 

 2.使用

@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 

.说明

  • 用在属性上,导出Excel时忽略这个属性

 

导出Excel

导出基本数据 

注意:导出Excel的对象必须实现对象序列化接口

1)定义对象

@Data
@ExcelTarget("users")
public class User implements Serializable {@ExcelIgnore@Excel(name="编号",orderNum="1")private String id;@Excel(name="姓名",orderNum="2")private String name;@Excel(name="年龄",orderNum="3",suffix = " &")private Integer age;@Excel(name="生日",orderNum="4",width = 35.0,format = "yyyy-MM-dd HH:mm:ss")private Date birthday;@Excel(name ="状态" ,orderNum="5",replace = {"激活_1","未激活_0"})private String status;
}

 

2)定义测试数据

    public 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(16+i);user.setBirthday(new Date());user.setStatus(String.valueOf(i%2));users.add(user);}return users;}

3)导出Excel

    @Testpublic void testExport() throws Exception {//1.配置对象 2.导出类型 3.导出数据集合Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("用户列表", "测试"), User.class, getUsers());FileOutputStream outputStream = new FileOutputStream("C:\\Users\\86187\\Desktop\\user.xls");workbook.write(outputStream);outputStream.close();workbook.close();}

4)查看Excel

 

导出List集合

1)说明

- 往往有时候导出的对象中含有数组或者集合,需要导出这样的数据可以直接使用@Excel进行导出

 2)使用
@Data
@ExcelTarget("users")
public class User implements Serializable {@Excel(name = "爱好",width=20.0,orderNum = "6")private List<String> hobby;
}

3) 改换格式

//    @Excel(name = "爱好",width=20.0,orderNum = "6")@ExcelIgnoreprivate List<String> hobby;@Excel(name = "爱好",width=20.0,orderNum = "6")private String hobbystr;//自定义格式public String getHobbystr() {StringBuilder sb = new StringBuilder();this.hobby.forEach(s -> sb.append(s).append("、") );return sb.toString();}

 

导出对象中含有的对象

  • - 导出对象中含有对象的Excel
@Data
@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;
}
  •  为导出对象赋值
public 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(16+i);user.setBirthday(new Date());user.setStatus(String.valueOf(i%2));user.setHobby(Arrays.asList("抽烟","喝酒","烫头"));user.setCard(new Card("11000103422323212342","北京市朝阳区"));users.add(user);}return users;
}

 

  • 导出Excel
//1.配置对象 2.导出类型 3.导出数据集合
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("用户列表", "测试"), User.class, getUsers());
FileOutputStream outputStream = new FileOutputStream("C:\\Users\\86187\\Desktop\\user.xls");
workbook.write(outputStream);
outputStream.close();
workbook.close();

 

 

 

导出图片

  1. - 往往随着业务不断变化,可能需要在导出excel时将图片信息也一并导出,如商品图标,用户头像信息等数据,这个时候easypoi该如何处理呢?
@ExcelTarget("users")
public class User implements Serializable {@Excel(name = "头像信息",type = 2,orderNum = "0",width = 12,height = 12)private String photo;//定义头像 直接写指定图片路径
}

准备图片放入指定路径中,并在测试数据中进行赋值 

public 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(16+i);user.setBirthday(new Date());user.setStatus(String.valueOf(i%2));user.setHobby(Arrays.asList("抽烟","喝酒","烫头"));user.setCard(new Card("11000103422323212342","北京市朝阳区"));user.setPhoto("C:\\Users\\86187\\Desktop\\桌面.png");users.add(user);}return users;
}

 

 导出Excel查看结果

 

导入Excel 

导入基本数据

1) 准备导入的目标Excel

2) 定义导出数据基本对象

@Data
@ExcelTarget("emps")
public class Emp  implements Serializable {@Excel(name="编号")private String id;@Excel(name="姓名")private  String  name;@Excel(name="年龄")private Integer age;@Excel(name="生日",format = "yyyy-MM-dd HH:mm:ss")private Date bir;@Excel(name="状态",replace = {"激活_1","未激活_0"})private String status;@Excel(name="头像",type = 2,savePath = "I:\\resources\\static")private String photo;
}

3) 导入excel中数据 

     @Testpublic void testImportExcel()throws Exception{ImportParams params = new ImportParams();params.setTitleRows(1); //标题列占几行params.setHeadRows(1); //列名占几行params.setNeedSave(true);params.setSaveUrl("I:\\msb_hejiayun\\easypoi_boot\\src\\main\\resources\\static");List<Emp> list = ExcelImportUtil.importExcel(new FileInputStream("C:\\Users\\86187\\Desktop\\emp.xls"), Emp.class, params);list.forEach(System.out::println);}

多Sheet页导入导出 

- 读取指定的sheet
比如要读取上传得第二个sheet 那么需要把startSheetIndex = 1 就可以了

- 读取几个sheet 
比如读取前2个sheet,那么 sheetNum=2 就可以了

- 读取第二个到第五个sheet
设置 startSheetIndex = 1 然后sheetNum = 4

- 读取全部的sheet
sheetNum  设置大点就可以了

- 判断一个Excel是不是合法的Excel 
importFields 设置下值,就是表示表头必须至少包含的字段,如果缺一个就是不合法的excel,不导入

 

 

准备表格,创建对应实体

@Data
@ExcelTarget("loginUser")
public class LoginUser implements Serializable {@Excel(name = "用户ID",orderNum = "1")private String id;@Excel(name = "昵称",orderNum = "2")private String nickname;@Excel(name = "密码",orderNum = "3")private String password;@Excel(name="注册时间",orderNum="4",format = "yyyy-MM-dd HH:mm:ss")private Date createTime;@Excel(name ="状态" ,orderNum="5",replace = {"VIP_1","普通用户_0"})private String status;}

 

@Data
@ExcelTarget("loginUrl")
public class LoginUrl implements Serializable {@Excel(name = "用户ID",orderNum = "1")private String userId;@Excel(name = "请求类型",orderNum = "2")private String type;@Excel(name = "访问地址",orderNum = "3")private String url;
}

  

多sheet导入方法

/*** 功能描述:根据接收的Excel文件来导入多个sheet,根据索引可返回一个集合* @param filePath   导入文件路径* @param sheetIndex  导入sheet索引* @param titleRows  表标题的行数* @param headerRows 表头行数* @param pojoClass  Excel实体类* @return*/public static <T> List<T> importMultiSheet(String filePath,int sheetIndex,Integer titleRows, Integer headerRows, Class<T> pojoClass) {// 根据file得到Workbook,主要是要根据这个对象获取,传过来的excel有几个sheet页ImportParams params = new ImportParams();// 第几个sheet页params.setStartSheetIndex(sheetIndex);params.setTitleRows(titleRows);params.setHeadRows(headerRows);//是否保存本次上传的excelparams.setNeedSave(false);//表示表头必须包含的字段,不包含 就报错.params.setImportFields(new String[]{"用户ID"});List<T> list = null;try {list = ExcelImportUtil.importExcel(new FileInputStream(filePath), pojoClass, params);} catch (Exception e) {e.printStackTrace();}return list;}
    //测试多sheet导入@Testpublic void testImportMultiSheet() throws Exception {String excelPath = "C:\\Users\\86187\\Desktop\\login.xls";List<LoginUser> loginUserList = this.importMultiSheet(excelPath, 0, 1, 1, LoginUser.class);loginUserList.forEach(System.out::println);List<LoginUrl> loginUrlList = this.importMultiSheet(excelPath, 1, 1, 1, LoginUrl.class);loginUrlList.forEach(System.out::println);}

 

多sheet导出方法

   public void exportMultiSheet(Object... objects) throws Exception {//创建参数对象,用于设定Excel的sheet页内容等信息ExportParams loginUserExportParams = new ExportParams();//设置sheet的名称loginUserExportParams.setSheetName("登录用户");loginUserExportParams.setTitle("登录用户列表");//使用map创建sheet1HashMap<String, Object> sheet1Map = new HashMap<>();//设置titlesheet1Map.put("title",loginUserExportParams);//设置导出的实体类型sheet1Map.put("entity",LoginUser.class);//sheet中要填充的数据sheet1Map.put("data",objects[0]);///==================================//创建参数对象,用于设定Excel的sheet页内容等信息ExportParams loginUrlExportParams = new ExportParams();//设置sheet的名称loginUrlExportParams.setSheetName("URL路径");loginUrlExportParams.setTitle("URL路径");//使用map创建sheet2HashMap<String, Object> sheet2Map = new HashMap<>();//设置titlesheet2Map.put("title",loginUrlExportParams);//设置导出的实体类型sheet2Map.put("entity",LoginUrl.class);//sheet中要填充的数据sheet2Map.put("data",objects[1]);//将sheet1和sheet2 进行包装List<Map<String,Object>> sheetList = new ArrayList<>();sheetList.add(sheet1Map);sheetList.add(sheet2Map);//执行方法Workbook workbook = ExcelExportUtil.exportExcel(sheetList, ExcelType.HSSF);FileOutputStream outputStream =new FileOutputStream("C:\\Users\\86187\\Desktop\\exportLogin.xls");workbook.write(outputStream);outputStream.close();workbook.close();}

 

    //测试多sheet导出@Testpublic void testExportMultiSheet() throws Exception {List<LoginUser> sheet1 = new ArrayList<>();sheet1.add(new LoginUser("1001", "向阳", "123456", new Date(), "0"));sheet1.add(new LoginUser("1002", "文渊", "123456", new Date(), "1"));sheet1.add(new LoginUser("1003", "小李", "123456", new Date(), "0"));List<LoginUrl> sheet2 = new ArrayList<>();sheet2.add(new LoginUrl("1001", "get", "http://127.0.0.1:8080"));sheet2.add(new LoginUrl("1001", "post", "http://127.0.0.1:8080/logingout"));exportMultiSheet(sheet1,sheet2);}

集成web实现导入导出

前端代码

<!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="@{/course/importExcel}" 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>ID编号</th><th>订单编号</th><th>课程名称</th><th>课程简介</th><th>课程价格</th></tr><tr th:each="course : ${courses}"><td th:text="${course.cid}"></td><td th:text="${course.orderno}"></td><td th:text="${course.cname}"></td><td th:text="${course.brief}"></td><td th:text="${course.price}"></td></tr></table><hr><a th:href="@{/course/exportExcel}" class="btn btn-info" >导出excel</a></div></div>
</div>
</body>
</html>

 

Controller层 

@Controller
@RequestMapping("/course")
public class CourseController {@Autowiredprivate CourseService courseService;@RequestMapping("/findAll")public String findAll(Model model){List<Course> courses = courseService.findAll();System.out.println(courses);model.addAttribute("courses",courses);return "index";}//导入Excel@RequestMapping("/importExcel")public String importExcel(MultipartFile excelFile) throws Exception {ImportParams params = new ImportParams();params.setTitleRows(1); //设置1级标题行为一行params.setHeadRows(1); //设置header标题行为一行List<Course> courseList = ExcelImportUtil.importExcel(excelFile.getInputStream(), Course.class, params);courseService.save(courseList);return "redirect:/course/findAll";}//导出Excel@RequestMapping("/exportExcel")public void exportExcel(HttpServletResponse response)throws Exception{//查询数据库的所有数据List<Course> courseList = courseService.findAll();//生成ExcelWorkbook workbook = ExcelExportUtil.exportExcel(new ExportParams("课程信息列表", "课程信息"),Course.class, courseList);response.setHeader("content-disposition","attachment;fileName="+ URLEncoder.encode("课程信息列表.xls","UTF-8"));ServletOutputStream outputStream = response.getOutputStream();workbook.write(outputStream);outputStream.close();workbook.close();}}

Service层

public interface CourseService  {//查询所有List<Course> findAll();//插入记录void save(List<Course> courses);
}@Service
public class CourseServiceImpl implements CourseService {@Autowiredprivate CourseDao courseDao;@Overridepublic List<Course> findAll() {return courseDao.findAll();}@Overridepublic void save(List<Course> courses) {courses.forEach(course -> {course.setCid(null); //自动生成ID 不使用Excel中的编号courseDao.save(course);});}
}

dao层

@Mapper
public interface CourseDao {//查询所有List<Course> findAll();//插入记录void save(Course course);
}

XML 

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mashibing.mapper.CourseDao"><!--查询所有--><select id="findAll" resultType="Course">SELECT cid,orderno,cname,brief,price FROM course;</select><!-- 插入记录 --><insert id="save" parameterType="Course" >INSERT INTO course VALUES (#{cid},#{orderno},#{cname},#{brief},#{price})</insert>
</mapper>

 

相关文章:

【业务功能篇55】Springboot+easyPOI 导入导出

Apache POI是Apache软件基金会的开源项目&#xff0c;POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 Apache POI 代码实现复杂&#xff0c;学习成本较高。 Easypoi 功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出…...

对顶堆算法

对顶堆可以动态维护一个序列上的第k大的数&#xff0c;由一个大根堆和一个小根堆组成&#xff0c; 小根堆维护前k大的数(包含第k个)大根堆维护比第k个数小的数 [CSP-J2020] 直播获奖 题目描述 NOI2130 即将举行。为了增加观赏性&#xff0c;CCF 决定逐一评出每个选手的成绩&a…...

node.js的优点

提示&#xff1a;node.js的优点 文章目录 一、什么是node.js二、node.js的特性 一、什么是node.js 提示&#xff1a;什么是node.js? Node.js发布于2009年5月&#xff0c;由Ryan Dahl开发&#xff0c;是一个基于ChromeV8引擎的JavaScript运行环境&#xff0c;使用了一个事件驱…...

golang编译跨平台

golang可以在windows上编译出linux、MacOS等系统上的程序。 go编译器windows下可变翼linux程序&#xff0c;例如&#xff0c;GOARCHamd64 和 GOOSlinux 可以用于编译 64 位的 Linux 平台上的可执行文件。&#xff1a; set GOARCHamd64 set GOOSlinux go build main.go通过设置…...

关于Spring的bean的相关注解以及其简单使用方法

一、前置工作 第一步&#xff1a;创建一个maven项目 第二步&#xff1a;在resource中创建一个名字叫做spring-config.xml的文件&#xff0c;并把以下代码复制粘贴 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.sprin…...

【计算机视觉】BLIP:源代码示例demo(含源代码)

文章目录 一、Image Captioning二、VQA三、Feature Extraction四、Image-Text Matching 一、Image Captioning 首先配置代码&#xff1a; import sys if google.colab in sys.modules:print(Running in Colab.)!pip3 install transformers4.15.0 timm0.4.12 fairscale0.4.4!g…...

TWILIGHT靶场详解

TWILIGHT靶场详解 下载地址&#xff1a;https://download.vulnhub.com/sunset/twilight.7z 这是一个比较简单的靶场&#xff0c;拿到IP后我们扫描发现开启了超级多的端口 其实这些端口一点用都没有&#xff0c;在我的方法中 但是也有不同的方法可以拿权限&#xff0c;就需要…...

【案例】--GPT衍生应用案例

目录 一、前言二、GPT实现智能问答架构2.1、基本的GPT实现智能问答架构2.2、可应用的GPT实现智能问答架构1、语义转换2、相似度关键字矩阵3、ES中搜索相似度关键字矩阵三、后续一、前言 GPT,全称Generative Pre-trained Transformer ,中文名可译作生成式预训练Transformer。…...

Sip网络音频对讲广播模块, sip网络寻呼话筒音频模块

Sip网络音频对讲广播模块&#xff0c; sip网络寻呼话筒音频模块 一、模块介绍 SV-2101VP和 SV-2103VP网络音频对讲广播模块 是一款通用的独立SIP音频功能模块&#xff0c;可以轻松地嵌入到OEM产品中。该模块对来自网络的SIP协议及RTP音频流进行编解码。 该模块支持多种网络协议…...

leetcode1219. 黄金矿工(java)

黄金矿工 leetcode1219. 黄金矿工题目描述回溯算法代码 回溯算法 leetcode1219. 黄金矿工 难度: 中等 eetcode 1219 黄金矿工 题目描述 你要开发一座金矿&#xff0c;地质勘测学家已经探明了这座金矿中的资源分布&#xff0c;并用大小为 m * n 的网格 grid 进行了标注。每个单元…...

Svelte框架入门

关键词 前端框架、编译器、响应式、模板 介绍 Svelte /svelt/ adj. 苗条的&#xff1b;线条清晰的&#xff1b;和蔼的 Svelte是一个前端组件框架&#xff0c;就像它的英文名字一样&#xff0c;Svelte的目标是打造一个更高性能的响应性前端框架。 Svelte类似于React和Vue框架&am…...

在linux中进行arm交叉编译体验tiny6410裸机程序开发流程

在某鱼上找了一个友善之臂的Tiny6410开发板用来体验一下嵌入式开发。这次先体验一下裸机程序的开发流程&#xff0c;由于这个开发板比较老旧了&#xff0c;官方文档有很多过期的内容&#xff0c;所以记录一下整个过程。 1. 交叉编译器安装 按照光盘A中的文档《04- Tiny6410 L…...

SpringBoot实战(二十三)集成 SkyWalking

目录 一、简介二、拉取镜像并部署1.拉取镜像2.运行skywalking-oap容器3.运行skywalking-ui容器4.访问页面 三、下载解压 agent1.下载2.解压 四、创建 skywalking-demo 项目1.Maven依赖2.application.yml3.DemoController.java 五、构建启动脚本1.startup.bat2.执行启动脚本3.发…...

深度学习实践——卷积神经网络实践:裂缝识别

深度学习实践——卷积神经网络实践&#xff1a;裂缝识别 系列实验 深度学习实践——卷积神经网络实践&#xff1a;裂缝识别 深度学习实践——循环神经网络实践 深度学习实践——模型部署优化实践 深度学习实践——模型推理优化练习 深度学习实践——卷积神经网络实践&#xff…...

linux | vscode | makefile | c++编译和调试

简单介绍环境&#xff1a; vscode 、centos、 gcc、g、makefile 简单来说就是&#xff0c;写好项目然后再自己写makefile脚本实现编译。所以看这篇博客的用户需要了解gcc编译的一些常用命令以及makefile语法。在网上看了很多教程&#xff0c;以及官网也看了很多次&#xff0c;最…...

Spring | Bean 作用域和生命周期

一、通过一个案例来看 Bean 作用域的问题 Spring 是用来读取和存储 Bean&#xff0c;因此在 Spring 中 Bean 是最核心的操作资源&#xff0c;所以接下来我们深入学习⼀下 Bean 对象 假设现在有⼀个公共的 Bean&#xff0c;提供给 A 用户和 B 用户使用&#xff0c;然而在使用的…...

培训(c++题解)

题目描述 某培训机构的学员有如下信息&#xff1a; 姓名&#xff08;字符串&#xff09;年龄&#xff08;周岁&#xff0c;整数&#xff09;去年 NOIP 成绩&#xff08;整数&#xff0c;且保证是 5 的倍数&#xff09; 经过为期一年的培训&#xff0c;所有同学的成绩都有所提…...

ansible-playbook编写 lnmp 剧本

ansible-playbook编写 lnmp 剧本 vim /opt/lnmp/lnmp.yaml执行剧本 ansible-playbook lnmp.yaml...

需求太多处理不过来?MoSCoW模型帮你

一、MoSCoW模型是什么 MoSCoW模型 是在项目管理、软件开发中使用的一种排序优先级的方法&#xff0c;以便开发人员、产品经理、客户对每个需求交付的重要性达成共识。 MoSCoW是一个首字母缩略词&#xff0c;代表&#xff1a; M&#xff08;Must have&#xff09;&#xff1a…...

Vue 3:玩一下web前端技术(六)

前言 本章内容为VUE请求后端技术与相关技术讨论。 上一篇文章地址&#xff1a; Vue 3&#xff1a;玩一下web前端技术&#xff08;五&#xff09;_Lion King的博客-CSDN博客 下一篇文章地址&#xff1a; Vue 3&#xff1a;玩一下web前端技术&#xff08;七&#xff09;_Lio…...

【点云处理教程】00计算机视觉的Open3D简介

一、说明 Open3D 是一个开源库&#xff0c;使开发人员能够处理 3D 数据。它提供了一组用于 3D 数据处理、可视化和机器学习任务的工具。该库支持各种数据格式&#xff0c;例如 .ply、.obj、.stl 和 .xyz&#xff0c;并允许用户创建自定义数据结构并在程序中访问它们。 Open3D 广…...

Windows10系统还原操作

哈喽&#xff0c;大家好&#xff0c;我是雷工&#xff01; 复制了下虚拟机的Win10系统&#xff0c;但其中有一些软件&#xff0c;想实现类似手机的格式化出厂操作&#xff0c;下面记录Windows10系统的还原操作。 一、系统环境&#xff1a; 虚拟机内的Windows10&#xff0c;64…...

Django学习笔记-模板(Template)基础

使用模块可以很方便的执行一些数据操作&#xff0c;然后根据传入的数据直接在模板html文件中进行处理。 1.Django中的模板配置 Django的模板引擎在sttings.py文件中&#xff1a; TEMPLATES [{# 模板引擎&#xff0c;默认为django模板BACKEND: django.template.backends.dja…...

使用 NVM(Node Version Manager)管理 Node.js 版本

使用 NVM&#xff08;Node Version Manager&#xff09;管理 Node.js 版本 步骤一&#xff1a;安装 NVM NVM 是一个用于安装和管理不同版本的 Node.js 的工具。首先&#xff0c;你需要确保你的系统上已经安装了 NVM。可以通过以下命令检查 NVM 是否已经安装&#xff1a; nvm …...

(文章复现)梯级水光互补系统最大化可消纳电量期望短期优化调度模型matlab代码

参考文献&#xff1a; [1]罗彬,陈永灿,刘昭伟等.梯级水光互补系统最大化可消纳电量期望短期优化调度模型[J].电力系统自动化,2023,47(10):66-75. 1.基本原理 1.1 目标函数 考虑光伏出力的不确定性&#xff0c;以梯级水光互补系统的可消纳电量期望最大为目标&#xff0c;函数…...

tinkerCAD案例:24. Ruler - Measuring Lengths 标尺 -量勺

tinkerCAD案例&#xff1a;24. Ruler - Measuring Lengths 标尺 - 测量长度 Project Overview: 项目概况&#xff1a; A machine shop, where any idea can become a reality, can cost millions and million of dollars. Still, the most important tool in the shop is the…...

linux系统编程重点复习--线程同步

目录 复习目标&#xff1a; 1 互斥锁 1.1互斥锁的使用步骤 1.2 练习 1.3 死锁 2 读写锁 3 条件变量 4 信号量 复习目标&#xff1a; 熟练掌握互斥量的使用说出什么叫死锁以及解决方案熟练掌握读写锁的使用熟练掌握条件变量的使用理解条件变量实现的生产消费者模型理解…...

【Docker 学习笔记】Windows Docker Desktop 安装

文章目录 一、前言二、Windows Docker 安装1. 基于Hyper-V后端和Windows容器的安装2. 基于WSL2后端的安装&#xff08;推荐&#xff09;3. 安装Docker Desktop on Windows4. 启动并验证Docker Desktop 一、前言 Docker并非是一个通用的容器工具&#xff0c;它依赖于已存在并运…...

getInputStream has already been called for this request 问题记录

问题背景 HttpServletRequest.getReader() HttpServletRequest.getInputStream() 不能在过滤器中读取一次二进制流&#xff08;字符流&#xff09;&#xff0c;又在另外一个Servlet中读取一次&#xff0c;即一个InputSteam(BufferedReader)对象在被读取完成后&#xff0c;将无…...

日撸代码300行:第60天(小结)

1、自己对于这个专栏的代码抄写也是断断续续&#xff0c;由于种种原因上次在第54天没坚持下来&#xff0c;这次继续希望能抄完。 2、现在代码的阅读和理解能力明显比刚开始抄代码的时候强了不少。感觉坚持到现在收获还是不小。现在基本上来说仔细想一下都能够理清楚代码的意思。…...