Springboot3+EasyExcel由浅入深

环境介绍

技术栈

springboot3+easyexcel

软件

版本

IDEA

IntelliJ IDEA 2022.2.1

JDK

17

Spring Boot

3

EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。

他能让你在不用考虑性能、内存的等因素的情况下,快速完成Excel的读、写等功能。

官网https://easyexcel.opensource.alibaba.com/

Sheet工作簿

Row,行,索引从0开始

Column,列,索引从0开始

Cell,单元格

目录

Read

Read1

Read2

异常处理

读sheet

自定义格式转换 日期,数字-Read

自定义转换器-Read

读指定行

Write

Write1

Write2

写入指定列

多级列名

自定义格式转换 日期,数字-Write

自定义转换器-Write

指定列宽行高

批量写入excel方法

自定义模板写入excel

自定义监听器

Web上传下载


Read

Read1

List<Corrdinate> newlist =new ArrayList<>();String fileName="C:\\Users\\Administrator\\Desktop\\demofile\\坐标测试.xlsx";EasyExcel.read(fileName, Corrdinate.class, new ReadListener<Corrdinate>() {@Overridepublic void invoke(Corrdinate corrdinate, AnalysisContext analysisContext) {try {if (11<=Double.parseDouble(corrdinate.getX()) && Double.parseDouble(corrdinate.getX())<120&& 2<=Double.parseDouble(corrdinate.getY()) && Double.parseDouble(corrdinate.getY())<244 ){corrdinate.setZ(true);}else {corrdinate.setZ(false);}newlist.add(corrdinate);}catch (Exception e){System.out.println(e);corrdinate.setDesc("类型转换失败");newlist.add(corrdinate);}}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {System.out.println("读取完成");}}).sheet().doRead();

Read2

String fileName="C:\\Users\\Administrator\\Desktop\\demofile\\坐标测试.xlsx";EasyExcel.read(fileName, Corrdinate.class,new PageReadListener<Corrdinate>(corrdinates -> {for (Corrdinate corrdinate : corrdinates) {try {if (1<=Double.parseDouble(corrdinate.getX()) && Double.parseDouble(corrdinate.getX())<110&& 2<=Double.parseDouble(corrdinate.getY()) && Double.parseDouble(corrdinate.getY())<240 ){corrdinate.setZ(true);}else {corrdinate.setZ(false);}newlist.add(corrdinate);}catch (Exception e){System.out.println(e);corrdinate.setDesc("类型转换失败");newlist.add(corrdinate);}}})).sheet().doRead();

异常处理

重写onException方法

@Test
void readException() {List<Corrdinate> oldlist =new ArrayList<>();List<Corrdinate> newlist =new ArrayList<>();String fileName="C:\\Users\\Administrator\\Desktop\\坐标测试.xlsx";EasyExcel.read(fileName, Corrdinate.class, new ReadListener<Corrdinate>() {@Overridepublic void invoke(Corrdinate corrdinate, AnalysisContext analysisContext) {if (1<=Double.parseDouble(corrdinate.getX()) && Double.parseDouble(corrdinate.getX())<110&& 2<=Double.parseDouble(corrdinate.getY()) && Double.parseDouble(corrdinate.getY())<240 ){corrdinate.setZ(true);}else {corrdinate.setZ(false);}newlist.add(corrdinate);}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {System.out.println("读取完成");}@Overridepublic void onException(Exception exception, AnalysisContext context) throws Exception {System.out.println(exception);}}).sheet().doRead();for (Corrdinate corrdinate : newlist) {System.out.println(corrdinate.toString());}
}

try- catch

@Test
void read1() {List<Corrdinate> oldlist =new ArrayList<>();List<Corrdinate> newlist =new ArrayList<>();String fileName="C:\\Users\\Administrator\\Desktop\\测试.xlsx";EasyExcel.read(fileName, Corrdinate.class, new ReadListener<Corrdinate>() {@Overridepublic void invoke(Corrdinate corrdinate, AnalysisContext analysisContext) {try {if (1<=Double.parseDouble(corrdinate.getX()) && Double.parseDouble(corrdinate.getX())<200&& 20<=Double.parseDouble(corrdinate.getY()) && Double.parseDouble(corrdinate.getY())<300 ){corrdinate.setZ(true);}else {corrdinate.setZ(false);}newlist.add(corrdinate);}catch (Exception e){System.out.println(e);corrdinate.setDesc("类型转换失败");newlist.add(corrdinate);}}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {System.out.println("读取完成");}}).sheet().doRead();for (Corrdinate corrdinate : newlist) {System.out.println(corrdinate.toString());}
}

读sheet

读所有工作簿

@Test
void readManyShoot() {String fileName="C:\\Users\\Administrator\\Desktop\\demofile\\坐标测试.xlsx";EasyExcel.read(fileName, Corrdinate.class,new PageReadListener<>(corrdinates -> {corrdinates.forEach(System.out::println);})).doReadAll();
}

读任意工作簿

@Test
void readAppointSheet() {try (ExcelReader excelReader = EasyExcel.read("C:\\Users\\Administrator\\Desktop\\demofile\\坐标测试.xlsx").build();){//创建工作簿对象sheet1ReadSheet sheet1 = EasyExcel.readSheet(0).head(Corrdinate.class).registerReadListener(new PageReadListener<>(corrdinates -> {corrdinates.forEach(System.out::println);})).build();//创建工作簿对象sheet2ReadSheet sheet2 = EasyExcel.readSheet("Sheet2").head(Corrdinate.class).registerReadListener(new PageReadListener<>(corrdinates -> {corrdinates.forEach(System.out::println);})).build();excelReader.read(sheet1,sheet2);}
}

自定义格式转换 日期,数字-Read

@Data
public class man {
    @ExcelProperty("姓名")
    private String name;
    @ExcelProperty("日期")
    @DateTimeFormat("yyyy年mm月dd日")
    private Date date;
    @ExcelProperty("成功率")
    private BigDecimal successrate;
}

自定义转换器-Read

public class StringConverterString implements Converter<String> {//支持java类型@Overridepublic Class<?> supportJavaTypeKey() {return String.class;}//支持Excel单元格类型@Overridepublic CellDataTypeEnum supportExcelTypeKey() {return CellDataTypeEnum.STRING;}//读的数据符合类型@Overridepublic String convertToJavaData(ReadConverterContext<?> context) throws Exception {//转换return "姓名:"+context.getReadCellData().getStringValue();}//写的数据符合类型@Overridepublic WriteCellData<?> convertToExcelData(WriteConverterContext<String> context) throws Exception {return new WriteCellData<>(context.getValue());}
}@Data
public class man {@ExcelProperty(converter = StringConverterString.class)private String name;@ExcelProperty("日期")@DateTimeFormat("yyyy年mm月dd日")private Date date;@ExcelProperty("成功率")private BigDecimal successrate;
}

读指定行

EasyExcel默认从第一行开始读取,第0行默认为列头

@Test
void selectRead(){String fileName="C:\\Users\\Administrator\\Desktop\\demofile\\坐标测试.xlsx";EasyExcel.read(fileName, man.class,new PageReadListener<>(mans -> {mans.forEach(System.out::println);})).sheet("Sheet3").headRowNumber(2)//第几行,0-n.doRead();
}

Write

实体类

@Datapublic class Corrdinate {private long id;@ExcelProperty("x")private String x;private String y;@ExcelProperty("是否匹配")private boolean z;@ExcelProperty("描述")private String desc;@ExcelIgnore//忽略字段private String de;}

Write1

//生成数据方法private List<Corrdinate> getData(int count) {List<Corrdinate> list = ListUtils.newArrayList();for (int i = 0; i < count; i++) {Corrdinate corrdinate = new Corrdinate();//生成10-100随机数corrdinate.setId(RandomUtil.randomInt(10, 100));corrdinate.setX(String.valueOf(RandomUtil.randomInt(10, 100)));corrdinate.setY(String.valueOf(RandomUtil.randomInt(10, 100)));list.add(corrdinate);}return list;}@Testvoid write1(){EasyExcel.write("C:\\Users\\Administrator\\Desktop\\demofile\\test01.xlsx", Corrdinate.class).sheet()//指定工作簿

Write2

//生成数据方法private List<Corrdinate> getData(int count) {List<Corrdinate> list = ListUtils.newArrayList();for (int i = 0; i < count; i++) {Corrdinate corrdinate = new Corrdinate();corrdinate.setId(Long.parseLong(String.valueOf(RandomUtil.randomInt(10, 100))));//生成10-100随机数corrdinate.setX(String.valueOf(RandomUtil.randomInt(10, 100)));corrdinate.setY(String.valueOf(RandomUtil.randomInt(10, 100)));//随机生成MD5corrdinate.setDesc(DigestUtils.md5Hex("hello"));list.add(corrdinate);}return list;}

@Testvoid write2(){try (ExcelWriter excelWriter = EasyExcel.write("C:\\Users\\Administrator\\Desktop\\demofile\\test01.xlsx", Corrdinate.class).build();){WriteSheet sheet2 = EasyExcel.writerSheet("Sheet2").build();WriteSheet sheet1 =EasyExcel.writerSheet("Sheet1").build();excelWriter.write(getData(10),sheet1);excelWriter.write(getData(10),sheet2);}

写入指定列

实体类

@Datapublic class Corrdinate {private long id;@ExcelProperty(value = "x",index = 1)//指定列名和顺序private String x;private String y;@ExcelProperty("是否匹配")private boolean z;@ExcelProperty("描述")private String desc;@ExcelIgnore//忽略字段private String de;}

生成数据方法

//生成数据方法private List<Corrdinate> getData(int count) {List<Corrdinate> list = ListUtils.newArrayList();for (int i = 0; i < count; i++) {Corrdinate corrdinate = new Corrdinate();corrdinate.setId(Long.parseLong(String.valueOf(RandomUtil.randomInt(10, 100))));//生成10-100随机数corrdinate.setX(String.valueOf(RandomUtil.randomInt(10, 100)));corrdinate.setY(String.valueOf(RandomUtil.randomInt(10, 100)));//随机生成MD5corrdinate.setDesc(DigestUtils.md5Hex("hello"));corrdinate.setDe(DigestUtils.md5Hex("de"));list.add(corrdinate);}return list;}

写测试

@Testvoid writeColumn(){Set<String> set = new TreeSet<>();set.add("de");EasyExcel.write("C:\\Users\\Administrator\\Desktop\\demofile\\test01.xlsx", Corrdinate.class).excludeColumnFieldNames(set).sheet("Sheet2")//指定工作簿.doWrite(getData(10));//写入10个数据}

多级列名

实体类

@Datapublic class Corrdinate {private long id;@ExcelProperty(value = "x",index = 1)//指定列名和顺序private String x;private String y;@ExcelProperty({"一级列名","是否匹配"})private boolean z;@ExcelProperty({"一级列名","描述"})private String desc;//@ExcelIgnore//忽略字段//设置一级列名,二级列名@ExcelProperty({"一级列名","二级列名"})private String de;}

写测试

@Testvoid writeDemo(){EasyExcel.write("C:\\Users\\Administrator\\Desktop\\demofile\\test01.xlsx", Corrdinate.class).sheet("Sheet3")//指定工作簿.doWrite(getData(10));//写入10个数据}

自定义格式转换 日期,数字-Write

实体类

@Datapublic class man {@ExcelProperty(converter = StringConverterString.class)private String name;@ExcelProperty("日期")@DateTimeFormat("yyyy年mm月dd日")private Date date;@NumberFormat("#.##%")private BigDecimal successrate;}

生成数据并测试写入

//生成数据方法private List<Man> getData2(int count) {List<Man> list = ListUtils.newArrayList();for (int i = 0; i < count; i++) {Man m = new Man();m.setName("张三"+i);m.setSuccessrate(BigDecimal.valueOf(RandomUtil.randomDouble(0.0, 1)));m.setDate(new Date());list.add(m);}return list;
}@Testvoid writeDemo(){EasyExcel.write("C:\\Users\\Administrator\\Desktop\\demofile\\test01.xlsx", Man.class).sheet("Sheet3")//指定工作簿.doWrite(getData2(10));//写入10个数据}}

自定义转换器-Write

自定义转换器

public class StringConverterString implements Converter<String> {//支持java类型@Overridepublic Class<?> supportJavaTypeKey() {return String.class;}//支持Excel单元格类型@Overridepublic CellDataTypeEnum supportExcelTypeKey() {return CellDataTypeEnum.STRING;}//读的数据符合类型@Overridepublic String convertToJavaData(ReadConverterContext<?> context) throws Exception {//转换return "姓名:"+context.getReadCellData().getStringValue();}//写的数据符合类型@Overridepublic WriteCellData<?> convertToExcelData(WriteConverterContext<String> context) throws Exception {return new WriteCellData<>("写入数据"+context.getValue());}}

生成数据并测试写入

private List<Man> getData2(int count) {List<Man> list = ListUtils.newArrayList();for (int i = 0; i < count; i++) {Man m = new Man();m.setName("张三"+i);m.setSuccessrate(BigDecimal.valueOf(RandomUtil.randomDouble(0.0, 1)));m.setDate(new Date());list.add(m);}return list;}@Testvoid writeDemo(){EasyExcel.write("C:\\Users\\Administrator\\Desktop\\demofile\\test01.xlsx", Man.class).sheet("Sheet3")//指定工作簿.doWrite(getData2(10));//写入10个数据}

指定列宽行高

@Data@HeadRowHeight(30)// 指定列头行高度@ContentRowHeight(15)// 指定内容行高度@ColumnWidth(12)//指定列宽public class Man {@ExcelProperty(converter = StringConverterString.class)private String name;@ExcelProperty("日期")@DateTimeFormat("yyyy年mm月dd日")private Date date;@NumberFormat("#.##%")private BigDecimal successrate;}

批量写入excel方法

编写实体类

@TableName(value ="product")

@Data

@NoArgsConstructor

@AllArgsConstructor

public class Product implements Serializable {

    /**

     * 序号

     */

    @TableId(type = IdType.AUTO)

    @ExcelProperty("序号")

    private Integer number;

    /**

     * 创建时间

     */

    @ExcelProperty("创建时间")

    private Date createtime;

    /**

     * 产品名称

     */

    @ExcelProperty("产品名称")

    private String productname;

    /**

     * 产品编号

     */

    @ExcelProperty("产品编号")

    private String productnumber;

    /**

     * 产品型号

     */

    @ExcelProperty("产品型号")

    private String manufacturer;

    /**

     * 产品位置

     */

    @ExcelProperty("产品位置")

    private String producepath;

    /**

     * 图片位置

     */

    @ExcelProperty("图片位置")

    private String imagepath;

    /**

     * 使用单位

     */

    @ExcelProperty("使用单位")

    private String unit;

    /**

     * 金额

     */

    @ExcelProperty("金额")

    private Integer money;

    /**

     * 入库时间

     */

    @ExcelProperty("入库时间")

    private Date intime;

    /**

     * 出库时间

     */

    @ExcelProperty("出库时间")

    private Date puttime;

    /**

     * 操作人

     */

    @ExcelProperty("操作人")

    private String operator;

    /**

     * 创建人

     */

    @ExcelProperty("创建人")

    private String createduser;

    /**

     * 备注

     */

    @ExcelProperty("备注")

    private String notes;

    /**

     * 产品数量

     */

    @ExcelProperty("产品数量")

    private Integer producedigit;

    /**

     * 产品单位

     */

    @ExcelProperty("产品单位")

    private String productunit;

    @TableField(exist = false)

    private static final long serialVersionUID = 1L;

}

//重复多次写入(写到单个或者多个Sheet)@Testpublic void manyWrite() {// 方法1: 如果写到同一个sheetString fileName = "C:\\Users\\13631\\Desktop\\simpleWriteTest1702391756908.xlsx";// 这里 需要指定写用哪个class去写try (ExcelWriter excelWriter = EasyExcel.write(fileName, Product.class).build()) {// 这里注意 如果同一个sheet只要创建一次WriteSheet writeSheet = EasyExcel.writerSheet("测试").build();long star = System.currentTimeMillis();// 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来for (int i = 0; i < 5; i++) {// 分页去数据库查询数据 这里可以去数据库查询每一页的数据List<Product> data = getData(1000);excelWriter.write(data, writeSheet);}long end = System.currentTimeMillis();System.out.println("耗时:" + (end - star)/1000 + "秒");}

自定义模板写入excel

填充单行

填充集合

//根据模板填充数据
@Test
public void fillWrite() {// 方案2 分多次 填充 会使用文件缓存(省内存)String fileName = "C:\\Users\\13631\\Desktop\\模板写数据.xlsx";String templateFileName = "C:\\Users\\13631\\Desktop\\模板.xlsx";try (ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build()) {WriteSheet writeSheet = EasyExcel.writerSheet().build();excelWriter.fill(getData2(100), writeSheet);}
}

填充效果

自定义监听器

1、实体类(如上述实体类)

2、自定义监听器

Invoke和doAfterAllAnalysed是必选的

public class MyListener implements ReadListener<Product> {private TestMapper testMapper;private ArrayList<Product> list = new ArrayList<>();int sum=0;public MyListener(TestMapper testMapper) {this.testMapper = testMapper;}//每读一行,则调用该方法@Overridepublic void invoke(Product product, AnalysisContext analysisContext) {sum++;list.add(product);}//每读完整个excel,则调用该方法@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {System.out.println("读取了"+sum+"行数据");}
}
@Test
void contextLoads() {String fileName = "C:\\Users\\13631\\Desktop\\simpleWriteTest1702391756908.xlsx";// 这里默认每次会读取100条数据 然后返回过来 直接调用使用数据就行// 具体需要返回多少行可以在`PageReadListener`的构造函数设置ExcelReader reader = EasyExcel.read(fileName, Product.class, new MyListener(new TestMapper())).build();ReadSheet sheet = EasyExcel.readSheet().build();reader.read(sheet);
}

Web上传下载

web中的读(上传)

后端

//上传

//上传

    @PostMapping("/upload")

    @ResponseBody

    public String upload(MultipartFile file) throws IOException {

        long start = System.currentTimeMillis();

        EasyExcel.read(file.getInputStream(), Product.class, new MyListener(productService)).sheet().doRead();

        long end = System.currentTimeMillis();

        System.out.println("耗时:"+(end-start)/1000+"秒");

        return "success";

    }

前端(vue2+Element)

<el-upload

  class="upload-demo"

  action="http://192.168.1.8:8007/excel/upload"

  :on-preview="handlePreview"

  :on-remove="handleRemove"

  :before-remove="beforeRemove"

  multiple

  :limit="3"

  :on-exceed="handleExceed"

  :file-list="fileList">

  <el-button size="small" type="primary">点击上传</el-button>

</el-upload>

效果

web中的写(下载)

后端

@GetMapping("download")public void download(HttpServletResponse response) throws IOException {// 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postmanresponse.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");EasyExcel.write(response.getOutputStream(), Product.class).sheet("模板").doWrite(productService.list());}

前端

<button @click="download">导出Excel</button>methods:{download(){document.location.href="http://192.168.1.8:8007/excel/download";}},

效果

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

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

相关文章

Android系统remount功能的实现原理

前言 remount 是 Android 系统中的一个命令&#xff0c;用于重新挂载文件系统为可读写模式。在 Android 设备中&#xff0c;大多数文件系统默认是以只读模式挂载的&#xff0c;在这种模式下&#xff0c;无法修改或删除文件。使用 remount 命令可以将文件系统重新挂载为可读写模…

关于burpsuite设置HTTP或者SOCKS代理

使用burpsuite给自己的浏览器做代理&#xff0c;抓包重发这些想必大家都清除 流量请求过程&#xff1a; 本机浏览器 -> burpsuite -> 目标服务器 实质还是本机发出的流量 如果我们想让流量由其他代理服务器发出 实现&#xff1a; 本机浏览器 -> burpsuite -> 某…

用Gradio做一个ai-chat应用

背景 上半年国内的大模型还没遍地开花的时候&#xff0c;笔者花巨资购了两台云服务器及给OpenAI充了20$&#xff0c;给身边的亲友给做了一个可使用的ai-chat。 代码实现 起先笔者 基于openai的api接口文档 API Reference - OpenAI API &#xff0c;自己编写web后台&#xff0…

Flink自定义Source模拟数据流

maven依赖 <?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.…

1329:【例8.2】细胞 广度优先搜索

1329&#xff1a;【例8.2】细胞 时间限制: 1000 ms 内存限制: 65536 KB 【题目描述】 一矩形阵列由数字0 到9组成,数字1到9 代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。如: 4 10 0234500067 1034560500 2045600671 00000000…

docker搭建部署minio 存储文件

1. 介绍 MinIO是一个开源的对象存储服务器&#xff0c;它允许你在自己的硬件上构建高性能的对象存储。本文将指导你如何使用Docker搭建和部署MinIO&#xff0c;并挂载外部目录以实现文件的持久化存储。 2. 安装Docker 首先&#xff0c;确保你的系统上已经安装了Docker。你可…

基于JavaWeb+SSM+Vue基于微信小程序的消防隐患在线举报系统的设计与实现

基于JavaWebSSMVue基于微信小程序的消防隐患在线举报系统的设计与实现 源码获取入口KaiTi 报告Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 KaiTi 报告 1.1 题目背景 随着信息化飞速发展&#xff0c;互联网不…

3D PDF查看器HOOPS Publish助力Smartscape拓展日本AEC市场!

​ 公司&#xff1a;Smartscape Co., Ltd. 行业&#xff1a;建筑、工程和施工(AEC) 软件&#xff1a;适用于AEC行业的3D PDF工具 软件开发工具包&#xff1a;Hoops Publish HOOPS_3D软件开发工具_HOOPS中文网慧都科技是HOOPS全套产品中国地区指定授权经销商&#xff0c;提供3D…

Python教程41:使用turtle画蜡笔小新

---------------turtle源码集合--------------- Python教程39&#xff1a;使用turtle画美国队长盾牌 Python教程38&#xff1a;使用turtle画动态粒子爱心文字爱心 Python教程37&#xff1a;使用turtle画一个戴帽子的皮卡丘 Python教程36&#xff1a;海龟画图turtle写春联 …

十一、工具盒类(MyQQ)(Qt5 GUI系列)

目录 ​编辑 一、设计需求 二、实现代码 三、代码解析 四、总结 一、设计需求 抽屉效果是软件界面设计中的一种常用形式&#xff0c;可以以一种动态直观的方式在有限大小的界面上扩展出更多的功能。本例要求实现类似 QQ 抽屉效果。 二、实现代码 #include "dialog.…

应对 DevOps 中的技术债务:创新与稳定性的微妙平衡

技术性债务在DevOps到底意味着什么&#xff1f;从本质上讲&#xff0c;这是小的开发缺陷的积累&#xff0c;需要不断地返工。它可能由多种原因引起&#xff0c;例如快速交付新功能的压力&#xff0c;这可能会导致团队不得不牺牲代码的整洁和完善。但这些不完整的小代码&#xf…

【Python进阶必备】一文掌握re库:实战正则表达式

目录 re库初识 re库基础使用方法 compile()函数 基本用法 正则表达式常用规则字符 match与search方法 match search match/search findall与finditer方法 使用findall()返回所有匹配项 使用findall()提取多个组的匹配 使用finditer()逐个返回Match对象 使用findi…

Realm Management Extension领域管理扩展之系统架构

RME不仅仅是一组处理器功能,为了充分利用RME引入的功能,系统的其余部分需要提供支持。 下图显示了一个示例系统以及引入RME后受到影响的组件: 主存储器保护 RME启用的系统包括内存加密和可能的完整性。基线加密要求支持对外部内存进行加密,使用每个PA空间的单独加密密钥或…

3. SPSS数据文件的基本加工和处理

如何获取SPSS自带的案例数据文件&#xff1f; 首先找到SPSS的安装目录&#xff0c;然后找到Samples文件夹 可以看到有不同语言版本&#xff0c;选择简体中文 就能看到很多.sav文件 数据文件的整理 个案排序 单值排序 例&#xff1a;对于下面的数据集&#xff0c;将工资按…

访问学者申请需要注意什么?

访问学者申请是一项复杂而重要的过程&#xff0c;需要申请人在准备材料和过程中注意一些关键事项&#xff0c;以确保顺利完成申请并提高成功率。以下是知识人网小编的一些建议&#xff0c;希望对你的访问学者申请有所帮助。 1. 详细了解目标学术机构&#xff1a; 在申请访问学…

使用curl命令在Linux上进行HTTP请求

在Linux系统中&#xff0c;curl是一个非常强大的命令行工具&#xff0c;用于发送各种类型的HTTP请求。通过简单的命令&#xff0c;你可以发送GET、POST、PUT、DELETE等请求&#xff0c;以及设置请求头、处理响应等。以下是一些使用curl进行HTTP请求的常见用法和示例。 1. 发送…

二极管选型怎么选?常用参数要熟练~

同学们大家好&#xff0c;今天我们继续学习杨欣的《电子设计从零开始》&#xff0c;这本书从基本原理出发&#xff0c;知识点遍及无线电通讯、仪器设计、三极管电路、集成电路、传感器、数字电路基础、单片机及应用实例&#xff0c;可以说是全面系统地介绍了电子设计所需的知识…

Visual Studio 2019 ctrl+f 呼出查找和替换窗口

有时候 ctrlshiftf 呼出查找和替换窗口不起作用&#xff0c;可能和其它程序的快捷键冲突&#xff0c;解决方案&#xff1a; ------------英文版本------------ 依次点击VS菜单栏中的 Tools - Options - Environment - Keyboard: 1. 在右侧的 Show commands containing: 文本框输…

实战使用工具appuploader上线发布苹果商店

实战使用工具appuploader上线发布苹果商店 我们发布ios应用的时候&#xff0c;步骤繁琐&#xff0c;非常耗时&#xff0c;appuploader工具就是解决一站式从上传到发布到appstore应用商店的&#xff0c;当我们开发完app后&#xff0c;需要将ipa/apk提交给测试人员测试&#xff0…

软件测试进阶自动化测试流程

如果想让测试在公司的项目中发挥出它最大的价值&#xff0c;并不是招两个测试技术高手&#xff0c;或引入几个测试技术&#xff0c;而是测试技术对项目流程的渗透&#xff0c;以及测试流程的改进与完善。虽然&#xff0c;当然测试行业前景乐观&#xff0c;许多中小企业也都在引…