Alibaba 工具型技术系列,实战技术针对于项目中常用的 Excel 操作指南

news2024/11/26 16:46:02
  • Ø ExcelIgnoreUnannotated 默认不加 ExcelProperty 的注解的都会参与读写,加了不会参与

通用参数

  • Ø ReadWorkbook,ReadSheet 都会有的参数,如果为空,默认使用上级。

  • Ø converter 转换器,默认加载了很多转换器。也可以自定义。

  • Ø readListener 监听器,在读取数据的过程中会不断的调用监听器。

  • Ø headRowNumber 需要读的表格有几行头数据。默认有一行头,也就是认为第二行开始起为数据。

  • Ø head 与 clazz 二选一。读取文件头对应的列表,会根据列表匹配数据,建议使用 class。

  • Ø clazz 与 head 二选一。读取文件的头对应的 class,也可以使用注解。如果两个都不指定,则会读取全部数据。

  • Ø autoTrim 字符串、表头等数据自动 trim

  • Ø password 读的时候是否需要使用密码

ReadWorkbook(理解成 excel 对象)参数

  • Ø excelType 当前 excel 的类型 默认会自动判断

  • Ø inputStream 与 file 二选一。读取文件的流,如果接收到的是流就只用,不用流建议使用 file 参数。因为使用了 inputStream easyexcel 会帮忙创建临时文件,最终还是 file

  • Ø file 与 inputStream 二选一。读取文件的文件。

  • Ø autoCloseStream 自动关闭流。

  • Ø readCache 默认小于 5M 用 内存,超过 5M 会使用 EhCache,这里不建议使用这个参数。

ReadSheet(就是 excel 的一个 Sheet)参数

  • Ø sheetNo 需要读取 Sheet 的编码,建议使用这个来指定读取哪个 Sheet

  • Ø sheetName 根据名字去匹配 Sheet,excel 2003 不支持根据名字去匹配

注解

  • Ø ExcelProperty index 指定写到第几列,默认根据成员变量排序。value 指定写入的名称,默认成员变量的名字,多个 value 可以参照快速开始中的复杂头

  • Ø ExcelIgnore 默认所有字段都会写入 excel,这个注解会忽略这个字段

  • Ø DateTimeFormat 日期转换,将 Date 写到 excel 会调用这个注解。里面的 value 参照 java.text.SimpleDateFormat

  • Ø NumberFormat 数字转换,用 Number 写 excel 会调用这个注解。里面的 value 参照 java.text.DecimalFormat

  • Ø ExcelIgnoreUnannotated 默认不加 ExcelProperty 的注解的都会参与读写,加了不会参与

参数

通用参数

  • Ø WriteWorkbook,WriteSheet ,WriteTable 都会有的参数,如果为空,默认使用上级。

  • Ø converter 转换器,默认加载了很多转换器。也可以自定义。

  • Ø writeHandler 写的处理器。可以实现 WorkbookWriteHandler,SheetWriteHandler,RowWriteHandler,CellWriteHandler,在写入 excel 的不同阶段会调用

  • Ø relativeHeadRowIndex 距离多少行后开始。也就是开头空几行

  • Ø needHead 是否导出头

  • Ø head 与 clazz 二选一。写入文件的头列表,建议使用 class。

  • Ø clazz 与 head 二选一。写入文件的头对应的 class,也可以使用注解。

  • Ø autoTrim 字符串、表头等数据自动 trim

WriteWorkbook(理解成 excel 对象)参数

  • Ø excelType 当前 excel 的类型 默认 xlsx

  • Ø outputStream 与 file 二选一。写入文件的流

  • Ø file 与 outputStream 二选一。写入的文件

  • Ø templateInputStream 模板的文件流

  • Ø templateFile 模板文件

  • Ø autoCloseStream 自动关闭流。

  • Ø password 写的时候是否需要使用密码

  • Ø useDefaultStyle 写的时候是否是使用默认头

WriteSheet(就是 excel 的一个 Sheet)参数

  • Ø sheetNo 需要写入的编码。默认 0

  • Ø sheetName 需要些的 Sheet 名称,默认同 sheetNo

WriteTable(就把 excel 的一个 Sheet,一块区域看一个 table)参数

  • Ø tableNo 需要写入的编码。默认 0

EasyExcel 用法指南

简单的读取 excel 文件

public void read() { String fileName = "demo.xlsx"; // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭 // 参数一:读取的excel文件路径 // 参数二:读取sheet的一行,将参数封装在DemoData实体类中 // 参数三:读取每一行的时候会执行DemoDataListener监听器 EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();``}

简单的写入 excel 文件

@Test``public void simpleWrite() { String fileName = "demo.xlsx"; // 这里 需要指定写用哪个class去读,然后写到第一个sheet,名字为模板 然后文件流会自动关闭 // 如果这里想使用03 则 传入excelType参数即可 // 参数一:写入excel文件路径 // 参数二:写入的数据类型是DemoData // data()方法是写入的数据,结果是List<DemoData>集合 EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data());``}

Web 上传与下载

/** excel文件的下载``*/``@GetMapping("download")``public void download(HttpServletResponse response) throws IOException { response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); response.setHeader("Content-disposition", "attachment;filename=demo.xlsx"); EasyExcel.write(response.getOutputStream(), DownloadData.class).sheet("模板").doWrite(data());``}

/** excel文件的上传``*/``@PostMapping("upload")``@ResponseBody``public String upload(MultipartFile file) throws IOException { EasyExcel.read(file.getInputStream(), DemoData.class, new DemoDataListener()).sheet().doRead(); return "success";``}

详解读取 Excel

对象模型

// 如果没有特殊说明,下面的案例将默认使用这个实体类``public class DemoData { /** * 强制读取第三个 这里不建议 index 和 name 同时用,要么一个对象只用index,要么一个对象只用name去匹配 */ @ExcelProperty(index = 2) //我想接收百分比的数字 @NumberFormat("#.##%") @ExcelProperty(value="浮点数标题", converter = CustomStringConverter.class) private Double doubleData; /** * 用名字去匹配,这里需要注意,如果名字重复,会导致只有一个字段读取到数据 */ @ExcelProperty(value="字符串标题", converter = CustomStringConverter.class) // converter属性定义自己的字符串转换器 private String string; @DateTimeFormat("yyyy年MM月dd日 HH时mm分ss秒") @ExcelProperty("日期标题") //这里用string 去接日期才能格式化 private Date date;``}

监听器

// 如果没有特殊说明,下面的案例将默认使用这个监听器``public class DemoDataListener extends AnalysisEventListener<DemoData> {

List<DemoData> list = new ArrayList<DemoData>(); /** * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来 */ public DemoDataListener() {} /** * 这个每一条数据解析都会来调用 * * @param data * @param context */ @Override public void invoke(DemoData data, AnalysisContext context) { System.out.println("解析到一条数据:{}", JSON.toJSONString(data)); list.add(data); }

/** * 所有数据解析完成了 都会来调用 * * @param context */ @Override public void doAfterAllAnalysed(AnalysisContext context) { System.out.println(JSON.toJSONString(list)); }``}

代码

@Test``public void simpleRead() { // 写法1: String fileName = "demo.xlsx"; // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭 EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead(); // 写法2: fileName = "demo.xlsx"; ExcelReader excelReader = EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).build(); ReadSheet readSheet = EasyExcel.readSheet(0).build(); excelReader.read(readSheet); // 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的 excelReader.finish();``}

读取多个 sheet

@Test``public void repeatedRead() { String fileName = "demo.xlsx"; // 读取全部sheet // 这里需要注意 DemoDataListener的doAfterAllAnalysed 会在每个sheet读取完毕后调用一次。然后所有sheet都会往同一个DemoDataListener里面写 EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).doReadAll(); // 读取部分sheet fileName = "demo.xlsx"; ExcelReader excelReader = EasyExcel.read(fileName).build(); // 这里为了简单 所以注册了 同样的head 和Listener 自己使用功能必须不同的Listener // readSheet参数设置读取sheet的序号 ReadSheet readSheet1 = EasyExcel.readSheet(0).head(DemoData.class).registerReadListener(new DemoDataListener()).build(); ReadSheet readSheet2 = EasyExcel.readSheet(1).head(DemoData.class).registerReadListener(new DemoDataListener()).build(); // 这里注意 一定要把sheet1 sheet2 一起传进去,不然有个问题就是03版的excel 会读取多次,浪费性能 excelReader.read(readSheet1, readSheet2); // 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的 excelReader.finish();``}

自定义格式转换

public class CustomStringStringConverter implements Converter<String> { @Override public Class supportJavaTypeKey() { return String.class; }

@Override public CellDataTypeEnum supportExcelTypeKey() { return CellDataTypeEnum.STRING; }

/** * 这里读的时候会调用 * * @param cellData * NotNull * @param contentProperty * Nullable * @param globalConfiguration * NotNull * @return */ @Override public String convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { return "自定义:" + cellData.getStringValue(); }

/** * 这里是写的时候会调用 不用管 * * @param value * NotNull * @param contentProperty * Nullable * @param globalConfiguration * NotNull * @return */ @Override public CellData convertToExcelData(String value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { return new CellData(value); }``}

多行头

@Test``public void complexHeaderRead() { String fileName = "demo.xlsx"; // 这里 需要指定读用哪个class去读,然后读取第一个sheet`` EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet() // 这里可以设置1,因为头就是一行。如果多行头,可以设置其他值。不传入默认1行 .headRowNumber(1).doRead();``}

读取表头数据

覆盖监听器 invokeHeadMap 方法

/** * 这里会一行行的返回头 * 监听器只需要重写这个方法就可以读取到头信息 * @param headMap * @param context */``@Override``public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) { LOGGER.info("解析到一条头数据:{}", JSON.toJSONString(headMap));``}

异常处理

覆盖监听器 onException 方法

/**``* 监听器实现这个方法就可以在读取数据的时候获取到异常信息``*/``@Override``public void onException(Exception exception, AnalysisContext context) { LOGGER.error("解析失败,但是继续解析下一行:{}", exception.getMessage()); // 如果是某一个单元格的转换异常 能获取到具体行号 // 如果要获取头的信息 配合invokeHeadMap使用 if (exception instanceof ExcelDataConvertException) { ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException)exception; LOGGER.error("第{}行,第{}列解析异常", excelDataConvertException.getRowIndex(), excelDataConvertException.getColumnIndex()); }``}

导出指定的列

@Test``public void excludeOrIncludeWrite() { String fileName = "excludeOrIncludeWrite" + System.currentTimeMillis() + ".xlsx"; // 忽略 date 不导出 Set<String> excludeColumnFiledNames = new HashSet<String>(); excludeColumnFiledNames.add("date"); // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭 EasyExcel.write(fileName, DemoData.class).excludeColumnFiledNames(excludeColumnFiledNames).sheet("忽略date") .doWrite(data()); fileName = "excludeOrIncludeWrite" + System.currentTimeMillis() + ".xlsx"; // 根据用户传入字段 假设我们只要导出 date Set<String> includeColumnFiledNames = new HashSet<String>(); includeColumnFiledNames.add("date"); // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭 EasyExcel.write(fileName, DemoData.class).includeColumnFiledNames(includeColumnFiledNames).sheet("导出date") .doWrite(data());``}

调整指定列顺序

public class IndexData { /** * 导出的excel第二列和第四列将空置 */ @ExcelProperty(value = "字符串标题", index = 0) private String string; `@ExcelProperty(value = “日期标题”, index

= 2) private Date date; @ExcelProperty(value = “浮点数标题”, index = 4) private Double doubleData;``}`

复杂头写入

public class ComplexHeadData { /** * 主标题 将整合为一个单元格效果如下: * ————————————————————————— * | 主标题 | * ————————————————————————— * |字符串标题|日期标题|数字标题| * ————————————————————————— */ @ExcelProperty({"主标题", "字符串标题"}) private String string; @ExcelProperty({"主标题", "日期标题"}) private Date date; @ExcelProperty({"主标题", "数字标题"}) private Double doubleData;``}

前面属于主标题,后面属于副标题

图片导出

@Data``@ContentRowHeight(200)``@ColumnWidth(200 / 8)``public class ImageData { // 图片导出方式有5种 private File file; private InputStream inputStream; /** * 如果string类型 必须指定转换器,string默认转换成string,该转换器是官方支持的 */ @ExcelProperty(converter = StringImageConverter.class) private String string; private byte[] byteArray; /** * 根据url导出 版本2.1.1才支持该种模式 */ private URL url;``}

@Test``public void imageWrite() throws Exception { String fileName = "imageWrite" + System.currentTimeMillis() + ".xlsx"; // 如果使用流 记得关闭 InputStream inputStream = null; try { List<ImageData> list = new ArrayList<ImageData>(); ImageData imageData = new ImageData(); list.add(imageData); String imagePath = "converter" + File.separator + "img.jpg"; // 放入五种类型的图片 根据实际使用只要选一种即可 imageData.setByteArray(FileUtils.readFileToByteArray(new File(imagePath))); imageData.setFile(new File(imagePath)); imageData.setString(imagePath); inputStream = FileUtils.openInputStream(new File(imagePath)); imageData.setInputStream(inputStream); imageData.setUrl(new URL( "https://raw.githubusercontent.com/alibaba/easyexcel/master/src/test/resources/converter/img.jpg")); EasyExcel.write(fileName, ImageData.class).sheet().doWrite(list); } finally { if (inputStream != null) { inputStream.close(); } }``}

列宽、行高

@Data@ContentRowHeight(10)@HeadRowHeight(20)@ColumnWidth(25)public class WidthAndHeightData { @ExcelProperty(“字符串标题”) private String string; @ExcelProperty(“日期标题”) private Date date; /** * 宽度为50,覆盖上面的宽度25 */ @ColumnWidth(50) @ExcelProperty(“数字标题”) private Double doubleData;``}

  • @HeadRowHeight(value = 35) // 表头行高

  • @ContentRowHeight(value = 25) // 内容行高

  • @ColumnWidth(value = 50) // 列宽

此外还有,自适应宽度,但是这个不是特别精确

@Test``void contextLoads() { EasyExcel.write("自适应.xlsx", Student.class) .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) .sheet() .doWrite(getData());``}

动态表头

@Test``public void dynamicHeadWrite() { String fileName = "dynamicHeadWrite" + System.currentTimeMillis() + ".xlsx"; EasyExcel.write(fileName) // 这里放入动态头 .head(head()).sheet("模板") // 当然这里数据也可以用 List<List<String>> 去传入 .doWrite(data());``}``// 动态表头的数据格式List<List<String>>``private List<List<String>> head() { List<List<String>> list = new ArrayList<List<String>>(); List<String> head0 = new ArrayList<String>(); head0.add("字符串" + System.currentTimeMillis()); List<String> head1 = new ArrayList<String>(); head1.add("数字" + System.currentTimeMillis()); List<String> head2 = new ArrayList<String>(); head2.add("日期" + System.currentTimeMillis()); list.add(head0); list.add(head1); list.add(head2); return list;``}

合并单元格

@Test public void mergeWrite() { String fileName = "mergeWrite" + System.currentTimeMillis() + ".xlsx"; LoopMergeStrategy loopMergeStrategy = new LoopMergeStrategy(2, 0); EasyExcel.write(fileName, DemoData.class).registerWriteHandler(loopMergeStrategy).sheet("合并单元格") .doWrite(data()); }

  • 每隔 2 行会合并 把 eachColumn 设置成 3 也就是我们数据的长度,所以就第一列会合并。当然其他合并策略也可以自己写

  • 这里 需要指定写用哪个 class 去写,然后写到第一个 sheet,名字为模板 然后文件流会自动关闭

web 数据写出

@GetMapping("download")``public void download(HttpServletResponse response) throws IOException { response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系 String fileName = URLEncoder.encode("数据写出", "UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); EasyExcel.write(response.getOutputStream(), DownloadData.class).sheet("模板").doWrite(data());``}

模板格式导出

如果需要横向填充只需要模板设置好就可以。

简单的 Excel 模板

public class FillData { private String name; private double number; // getting setting``}

实现模板填充

@Test``public void simpleFill() { String templateFileName = "simple.xlsx";

// 方案1 根据对象填充 String fileName = System.currentTimeMillis() + ".xlsx"; // 这里 会填充到第一个sheet, 然后文件流会自动关闭 FillData fillData = new FillData(); fillData.setName("知春秋"); fillData.setNumber(25); EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(fillData);

// 方案2 根据Map填充 fileName = System.currentTimeMillis() + ".xlsx"; // 这里 会填充到第一个sheet, 然后文件流会自动关闭 Map<String, Object> map = new HashMap<String, Object>(); map.put("name", "知春秋"); map.put("number", 25); EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(map);``}

  • 模板注意 用{} 来表示你要用的变量 如果本来就有"{“,”}" 特殊字符 用"{“,”}"代替

复杂的填充

使用 List 集合的方法批量写入数据,点表示该参数是集合

@Test``public void complexFill() { String templateFileName = "complex.xlsx"; String fileName = System.currentTimeMillis() + ".xlsx"; ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build(); WriteSheet writeSheet = EasyExcel.writerSheet().build(); // 如果数据量大 list不是最后一行 参照下一个 FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); excelWriter.fill(data(), fillConfig, writeSheet); excelWriter.fill(data(), fillConfig, writeSheet); // 其他参数可以使用Map封装 Map<String, Object> map = new HashMap<String, Object>(); excelWriter.fill(map, writeSheet); excelWriter.finish();``}

.xlsx"; String fileName = System.currentTimeMillis() + “.xlsx”; ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build(); WriteSheet writeSheet = EasyExcel.writerSheet().build(); // 如果数据量大 list不是最后一行 参照下一个 FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); excelWriter.fill(data(), fillConfig, writeSheet); excelWriter.fill(data(), fillConfig, writeSheet); // 其他参数可以使用Map封装 Map<String, Object> map = new HashMap<String, Object>(); excelWriter.fill(map, writeSheet); excelWriter.finish();``}`

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

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

相关文章

emlog模板开发基础2022最新指南

emlog模板的开发基础指南,如果想要开发emlog的模板,你必须知道那些开发内容呢&#xff1f;下面将介绍分析emlog5下的模板基本结构以及基本变量、函数的作用。 首先我们用该知道emlog的模板是位于根目录content\templates\文件夹下,每个模板都是一个单独的文件夹,文件夹以模板名…

[附源码]JAVA毕业设计-英杰学堂网上教学平台-(系统+LW)

[附源码]JAVA毕业设计-英杰学堂网上教学平台-&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项…

一道关于Vue的数据绑定和依赖收集的面试题

概要 分享一道Vue的面试题&#xff0c;该题涉及Vue的响应式数据绑定和依赖收集&#xff0c;希望可以加深大家对Vue原理的理解。 题面 有如下html和JS&#xff0c;要求使用Vue的响应式数据原理和依赖收集原理&#xff0c;实现createApps和ref方法。只能使用原生JS&#xff0c…

教育的本质——采用不同学习方式,学习者在两周后还能记住的内容有多少

目录 一、学习金字塔模型 二、学习曲线 三、左右脑交替学习法 一、学习金字塔模型 “学习金字塔模型”&#xff0c;人们学习的效率一共分为七个层次&#xff1a; 第一层 ~ 第四层&#xff1a;这是我们最熟悉不过的形式&#xff0c;在学生时代&#xff0c;老师在上面讲课、…

【Leetcode】225. 用队列实现栈、232. 用栈实现队列

作者&#xff1a;一个喜欢猫咪的的程序员 专栏&#xff1a;《Leetcode》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 目录 225. 用队列实现栈 232. 用栈实现队列 225. 用队列实现栈 225. 用队…

91-143-Scala-集合模式泛型等

91-Scala-集合模式泛型等&#xff1a; Scala 的集合有三大类&#xff1a;序列 Seq、集 Set、映射 Map&#xff0c;所有的集合都扩展自 Iterable特质。 2&#xff09;对于几乎所有的集合类&#xff0c;Scala 都同时提供了可变和不可变的版本&#xff0c;分别位于以下两个包 不…

人工智能(AI)背后人工的力量——数据标注

尽管随着AI的普及&#xff0c;我们在生活中越来越依赖于人工智能&#xff0c;但“人工智障”的相关调侃也从来没有消失过。 相信大家都知道&#xff0c;如果我们想要让AI准确识别出图中的鸟&#xff0c;我们需要在数据集中手动将这些照片标记为鸟&#xff0c;然后让算法和图像…

c3p0数据库连接池的使用

c3p0数据库连接池的使用 c3p0的官网&#xff1a;c3p0 - JDBC3 c3p0数据库连接池有两种方法 导入jar包 首先两种方法都需要导入jar包 图中打钩的&#xff0c;第一个是c3p0的包&#xff0c;第二个是连接数据库的 在WEB-INF下新建lib包&#xff0c;将所需要的jar导入 右键添加…

【Java技术专题】「OpenJDK专题」想不想编译属于你自己的JDK呢?(Windows环境)

Win10下编译OpenJDK8 编译环境 Windows10专业版64位&#xff1b; 编译前准备 Tip&#xff1a; 以下软件的安装和解压目录尽量不要包含中文或空格&#xff0c;不然可能会出现问题 安装 Visual Studio 2010 Professional 在windows下编译JDK需要使用Visual Studio 2010 Profes…

反抗与反噬:亚马逊被迫结束封号神秘主义,不再粗暴关店

“每一天醒来&#xff0c;都要看一眼自己的店铺是否还在。”、“账号被封之后&#xff0c;自己也曾第一时间向平台申诉&#xff0c;经历过一次、两次甚至是多次申诉无果后&#xff0c;才意识到账号是真的回不来了。”、“过去传言大卖有保护伞&#xff0c;这一回才发现做亚马逊…

B站有哪些值得Java初学者看的视频,Java学习路线

我的读者中有很大一部分学生读者&#xff0c;以前也分享过一些Java学习路线&#xff0c;但是我收到的反馈并不好&#xff0c;因为学习路线包含的内容太多了&#xff0c;对于初学者来说难度太大&#xff0c;时间也不够用&#xff0c;根本学不完。今天我将结合B站优秀视频整理一期…

英特尔着眼系统工艺协同优化理念,推进摩尔定律新浪潮

Ann Kelleher介绍了晶体管诞生75年之后的新进展 在IEDM 2022&#xff08;2022 IEEE国际电子器件会议&#xff09;全体会议上发表演讲之前&#xff0c;英特尔副总裁兼技术开发总经理Ann Kelleher接受了《IEEE Spectrum》的采访&#xff0c;她表示&#xff0c;摩尔定律的下一波浪…

Tcp/Udp(网络套接字,服务器) -- Linux/Windows

目录 网络传输本质 认识端口号 认识协议 认识TCP协议 认识UDP协议 网络字节序 socket编程接口 socket 常见API sockaddr结构 sockaddr 结构 sockaddr_in 结构 in_addr结构 编写代码前的小tip&#xff08;重点&#xff09; UDP套接字&#xff08;网络通信&#xf…

算法竞赛入门【码蹄集进阶塔335题】(MT2101-2125)

算法竞赛入门【码蹄集进阶塔335题】(MT2201-2225&#xff09; 文章目录算法竞赛入门【码蹄集进阶塔335题】(MT2201-2225&#xff09;前言为什么突然想学算法了&#xff1f;为什么选择码蹄集作为刷题软件&#xff1f;目录1. MT2101 竹鼠发瓜子2. MT2102 竹鼠发瓜子&#xff08;二…

Raft协议

Raft协议先行了解 总体过程速览 假设我们只使用一个节点&#xff0c;可以很容易的达成协议或者共识。 但是现在我们思考&#xff0c;假如有多个节点呢&#xff1f; 多个节点之间达成协议或者共识就叫做分布式共识。 而Raft就是一个实现分布式共识的协议。 一个节点可以有3…

数字化转型的十大好处

前言&#xff1a; 在过去的几年中&#xff0c;“适者生存”对企业来说是至关重要的。不能适应环境变化的企业&#xff0c;也将会加速被淘汰的进程。只有从数字化转型中受益的企业才能更好的参与管理和快速调整&#xff0c;这样一来&#xff0c;员工便能够在更高效、更安全的状…

黑盒测试用例设计 - 判定表法

什么是判定表&#xff1f; 判定表法也叫判定驱动法&#xff0c;是分析和表达多逻辑条件下执行不同操作的情况的工作。 应用场合&#xff1a;只要适用于多条件的内容组合与结果分析 它由以下几个内容组成&#xff1a; 条件桩&#xff08;condition stub&#xff09;&#xff1…

LwIP带操作系统的移植

目录 LwIP移植前期准备 LwIP移植流程 修改lwipopts.h 修改lwip_comm.c文件 修改ethernetif.c/h文件 修改ethernetif_input函数 修改ethernet.c文件 添加应用程序 LwIP是支持操作系统的&#xff0c;在操作系统的支持下我们可以使用LwIP提供的另外两种API编程接口编程。没…

使用动态代理+Netty+Zookeeper+Protobuff手撸一个RPC框架

RPC是什么 RPC&#xff08;Remote Procedure Call&#xff09;远程过程调用&#xff0c;一种计算机之间的远程调用技术&#xff0c;客户端能够在不知道服务器底层的通信架构的情况下调用服务器端的方法&#xff0c;就像调用自身的方法一样。 举个例子&#xff1a; 老婆自己去…

Uni-app 实现md5加密

写下这篇文章&#xff0c;记录自己走过的坑 第一次尝试&#xff1a;参照博客uniapp使用md5_清雨小竹的博客-CSDN博客_uniapp md5 引入md5.js后&#xff0c;在main.js中import后&#xff0c;无法使用md5.hex_md5("需要加密的字符串")&#xff0c;vue页面无法打开&…