POI及EasyExcel学习笔记(狂神说)

2024-03-27 18:58

本文主要是介绍POI及EasyExcel学习笔记(狂神说),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

视频地址(狂神说):https://www.bilibili.com/video/BV1Ua4y1x7BK

记得三连狂神呀

介绍

https://baike.baidu.com/item/POI/8886826?fr=aladdin

pom.xml

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>POI</artifactId><version>1.0-SNAPSHOT</version><dependencies><!--xls(03)--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.9</version></dependency><!--xlsx(07)--><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.9</version></dependency><!--日期格式化工具--><dependency><groupId>joda-time</groupId><artifactId>joda-time</artifactId><version>2.10.1</version></dependency><!--test--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency></dependencies></project>

Excel 中有几个操作对象:

工作薄:org.apache.poi.ss.usermodel.Workbook;

img

工作表:org.apache.poi.ss.usermodel.Sheet;

行:org.apache.poi.ss.usermodel.Row;

单元格(列):org.apache.poi.ss.usermodel.Cell;

POI-Excel写操作

package com.poi;import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.joda.time.DateTime;
import org.junit.Test;import java.io.FileOutputStream;
import java.io.IOException;public class ExcelWrite {private String PATH="F:\\ideaProject\\study\\";@Testpublic void write03() throws IOException {// 1、创建工作薄Workbook workbook = new HSSFWorkbook();//2、创建工作表Sheet sheet = workbook.createSheet("test1");//3、创建行(0:第一行)Row row1 = sheet.createRow(0);//4、创建单元格(0:第一行的第一个格子)Cell cell00 = row1.createCell(0);cell00.setCellValue("测试数据");//第一行的第二个格子Cell cell01 = row1.createCell(1);cell01.setCellValue("testData");//第二行Row row2 = sheet.createRow(1);//第二行的第一个格子Cell cell10 = row2.createCell(0);cell10.setCellValue("时间");//第二行的第二个格子Cell cell11 = row2.createCell(1);cell11.setCellValue(new DateTime().toString("yyyy-MM-dd HH:mm:ss"));//生成Excel(IO流)//03版本的Excel是使用 .xls 结尾!!!FileOutputStream fileOutputStream = new FileOutputStream(PATH + "POI03测试.xls");workbook.write(fileOutputStream);//关闭流fileOutputStream.close();System.out.println("03Excel输出完毕");}@Testpublic void write07() throws IOException {// 1、创建工作薄Workbook workbook = new XSSFWorkbook();//2、创建工作表Sheet sheet = workbook.createSheet("test1");//3、创建行(0:第一行)Row row1 = sheet.createRow(0);//4、创建单元格(0:第一行的第一个格子)Cell cell00 = row1.createCell(0);cell00.setCellValue("测试数据");//第一行的第二个格子Cell cell01 = row1.createCell(1);cell01.setCellValue("testData");//第二行Row row2 = sheet.createRow(1);//第二行的第一个格子Cell cell10 = row2.createCell(0);cell10.setCellValue("时间");//第二行的第二个格子Cell cell11 = row2.createCell(1);cell11.setCellValue(new DateTime().toString("yyyy-MM-dd HH:mm:ss"));//生成Excel(IO流)//03版本的Excel是使用 .xlsx 结尾!!!FileOutputStream fileOutputStream = new FileOutputStream(PATH + "POI07测试.xlsx");workbook.write(fileOutputStream);//关闭流fileOutputStream.close();System.out.println("07Excel输出完毕");}
}

注意:对象的区别、文件的后缀!!!

数据批量写入

HSSF

缺点:最多只能处理 65536 行,否则会抛出异常

java.lang.IllegalArgumentException: Invalid row number (65536) outside allowable range (0..65535)

优点:过程中写入缓存,不操作磁盘,最后一次性写入磁盘,速度快

@Test
public void write03BigData() throws IOException {long begin = System.currentTimeMillis();//创建簿Workbook workbook = new HSSFWorkbook();//创建表Sheet sheet = workbook.createSheet();//写数据for (int rowNum = 0; rowNum < 65536; rowNum++) {Row row = sheet.createRow(rowNum);for (int cellNum = 0; cellNum < 10; cellNum++) {Cell cell = row.createCell(cellNum);cell.setCellValue(cellNum);}}System.out.println("over");FileOutputStream fileOutputStream = new FileOutputStream(PATH + "TestWrite03BigData.xls");workbook.write(fileOutputStream);fileOutputStream.close();long end = System.currentTimeMillis();System.out.println((double) (end-begin)/1000);
}

XSSF

缺点:写数据时速度非常慢,非常耗内存,也会发生内存溢出,如 100万条

优点:可以写较大的数据量,如 20万条

@Test
public void write07BigData() throws IOException {long begin = System.currentTimeMillis();//创建簿Workbook workbook = new XSSFWorkbook();//创建表Sheet sheet = workbook.createSheet();//写数据for (int rowNum = 0; rowNum < 100000; rowNum++) {Row row = sheet.createRow(rowNum);for (int cellNum = 0; cellNum < 10; cellNum++) {Cell cell = row.createCell(cellNum);cell.setCellValue(cellNum);}}System.out.println("over");FileOutputStream fileOutputStream = new FileOutputStream(PATH + "TestWrite07BigData.xlsx");workbook.write(fileOutputStream);fileOutputStream.close();long end = System.currentTimeMillis();System.out.println((double) (end-begin)/1000);
}

SXSSF

优点:可以写非常大的数据量,如 100万 条甚至更多,写数据速度快,占用更少的内存

注意:

过程中可能产生临时文件,需要清理临时文件

默认由 100 条记录被保存在内存中,如果超过这数量,则最前面的数据被写入临时文件

如果想自定义内存中数据的数量,可以使用 new SXSSFWorkbook(amount)

@Test
public void write07BigDataS() throws IOException {long begin = System.currentTimeMillis();//创建簿Workbook workbook = new SXSSFWorkbook();//创建表Sheet sheet = workbook.createSheet();//写数据for (int rowNum = 0; rowNum < 100000; rowNum++) {Row row = sheet.createRow(rowNum);for (int cellNum = 0; cellNum < 10; cellNum++) {Cell cell = row.createCell(cellNum);cell.setCellValue(cellNum);}}System.out.println("over");FileOutputStream fileOutputStream = new FileOutputStream(PATH + "TestWrite07BigDataS.xlsx");workbook.write(fileOutputStream);fileOutputStream.close();//清除临时文件((SXSSFWorkbook) workbook).dispose();long end = System.currentTimeMillis();System.out.println((double) (end-begin)/1000);
}

SXSSFWorkbook 官方解释:实现“BigGridDemo”策略的流式XSSFWorkbook版本。这允许写入非常大的文件而不会耗尽内存,因为任何时候只有可配置的行部分被保存在内存中。

请注意,仍然可能会消耗大量内存,这些内存基于正在使用的功能,例如合并区域,注释…仍然只存储在内存中,因此如果广泛使用,可能需要大量内存。

POI-Excel读操作

03

@Test
public void testRead03() throws IOException {//获取文件流FileInputStream fileInputStream = new FileInputStream(PATH + "POIPOI03测试.xls");//1、获取工作簿Workbook workbook = new HSSFWorkbook(fileInputStream);//2、得到表Sheet sheet = workbook.getSheetAt(0);//3、得到行Row row = sheet.getRow(0);//4、得到列Cell cell = row.getCell(0);//读取值时一定要注意类型System.out.println(cell.getStringCellValue());fileInputStream.close();
}

07

@Test
public void testRead07() throws IOException {//获取文件流FileInputStream fileInputStream = new FileInputStream(PATH + "POIPOI07测试.xlsx");//1、获取工作簿Workbook workbook = new XSSFWorkbook(fileInputStream);//2、得到表Sheet sheet = workbook.getSheetAt(0);//3、得到行Row row = sheet.getRow(0);//4、得到列Cell cell = row.getCell(0);//读取值时一定要注意类型System.out.println(cell.getStringCellValue());fileInputStream.close();
}

注意获取值的类型!!!

读取不同的数据类型

@Test
public void testCellType() throws Exception {//获取文件FileInputStream fileInputStream = new FileInputStream(PATH + "会员消费商品明细表.xls");//获取工作薄Workbook workbook = new HSSFWorkbook(fileInputStream);//得到表Sheet sheet = workbook.getSheetAt(0);//获取标题内容Row rowTitle = sheet.getRow(0);if (rowTitle != null){//获取一行中有多少个单元格int cellCount = rowTitle.getPhysicalNumberOfCells();for (int cellNum = 0; cellNum < cellCount; cellNum++) {//获取单元Cell cell = rowTitle.getCell(cellNum);if (cell != null){//获取类型int cellType = cell.getCellType();String cellValue = cell.getStringCellValue();System.out.print(cellValue + " | ");}}System.out.println();}//获取表中的内容int rowCount = sheet.getPhysicalNumberOfRows();for (int rowNum = 1; rowNum < rowCount; rowNum++) {Row rowData = sheet.getRow(rowNum);if (rowData != null){//读取列int cellCout = rowTitle.getPhysicalNumberOfCells();for (int cellNum = 0; cellNum < cellCout; cellNum++) {System.out.print("【" + (rowNum+1) + "-" + (cellNum+1) + "】");Cell cell = rowData.getCell(cellNum);//匹配列的数据类型if (cell != null){int cellType = cell.getCellType();String cellValue = "";switch (cellType){case HSSFCell.CELL_TYPE_STRING://字符串System.out.print("【STRING】");cellValue = cell.getStringCellValue();break;case HSSFCell.CELL_TYPE_BOOLEAN://布尔值System.out.print("【BOOLEAN】");cellValue = String.valueOf(cell.getBooleanCellValue());break;case HSSFCell.CELL_TYPE_NUMERIC://数字类型System.out.print("【NUMERIC】");if (HSSFDateUtil.isCellDateFormatted(cell)){//日期System.out.print("【日期】");Date date = cell.getDateCellValue();cellValue = new DateTime().toString("yyyy-MM-dd");}else{// 不是日期格式,则防止当数字过长时以科学计数法显示System.out.print("【转换成字符串】");cell.setCellType(HSSFCell.CELL_TYPE_STRING);cellValue = cell.toString();}break;case HSSFCell.CELL_TYPE_BLANK://System.out.print("【BLANK】");break;case Cell.CELL_TYPE_ERROR:System.out.print("【数据类型错误】");break;}System.out.println(cellValue);}}}}fileInputStream.close();
}

计算公式

@Test
public void testFormula() throws Exception {FileInputStream fileInputStream = new FileInputStream(PATH + "计算公式.xls");Workbook workbook = new HSSFWorkbook(fileInputStream);Sheet sheetAt = workbook.getSheetAt(0);//获取计算公式所在的行Row row = sheetAt.getRow(4);//计算公式的第几个单元格Cell cell = row.getCell(0);//拿到计算公式FormulaEvaluator formulaEvaluator = new HSSFFormulaEvaluator((HSSFWorkbook) workbook);//输出单元格内容int cellType = cell.getCellType();switch (cellType){case Cell.CELL_TYPE_FORMULA://公式//获取单元格的计算公式String formula = cell.getCellFormula();System.out.println(formula);//计算CellValue evaluate = formulaEvaluator.evaluate(cell);String cellValue = evaluate.formatAsString();System.out.println(cellValue);break;}
}

EasyExcel操作

点击跳转:https://www.yuque.com/easyexcel/doc/easyexcel

pom.xml

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version>
</dependency>

固定套路:

1、写入,固定类格式进行写入

2、读取,根据监听器设置的规则进行读取

3.1 准备素材

image-20200423152949092

我们以上面这个表格为例来进行读写操作,触类旁通

3.2 写操作

先来个实体类方便插入数据

import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;import java.util.Date;@Data   //lombok
public class DemoData {@ExcelProperty("字符串标题")private String string;@ExcelProperty("日期标题")private Date date;@ExcelProperty("数字标题")private Double doubleData;/*** 忽略这个字段*/@ExcelIgnore   //注意这个注解是高版本的easyexcel依赖才有private String ignore;
}

再来一个工具类方便我们写数据

public class utilList {public static List<DemoData> data() {List<DemoData> list = new ArrayList<DemoData>();for (int i = 0; i < 10; i++) {DemoData data = new DemoData();data.setString("字符串" + i);data.setDate(new Date());data.setDoubleData(0.56);list.add(data);}return list;}
}

进行写

public class EasyTest {static String path="F:\\demo\\javapoi\\demopoi\\";@Testpublic void simpleWrite() {// 写法1String fileName = path + "EasyTest.xlsx";// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭// 如果这里想使用03 则 传入excelType参数即可EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(utilList.data());// 写法2
//        fileName = TestFileUtil.getPath() + "simpleWrite" + System.currentTimeMillis() + ".xlsx";
//        // 这里 需要指定写用哪个class去写
//        ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build();
//        WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();
//        excelWriter.write(data(), writeSheet);
//        // 千万别忘记finish 会帮忙关闭流
//       excelWriter.finish();}
}

写完就有了这样一个表格

扩展知识

重复多次写,根据数据库的分页查询再写入到表格中,这里如果要写到多个表的话,需要建立多个writeSheet对象

    @Testpublic void repeatedWrite() {// 方法1 如果写到同一个sheetString fileName = TestFileUtil.getPath() + "repeatedWrite" + System.currentTimeMillis() + ".xlsx";// 这里 需要指定写用哪个class去写ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build();// 这里注意 如果同一个sheet只要创建一次WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();// 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来for (int i = 0; i < 5; i++) {// 分页去数据库查询数据 这里可以去数据库查询每一页的数据List<DemoData> data = data();excelWriter.write(data, writeSheet);}/// 千万别忘记finish 会帮忙关闭流excelWriter.finish();

WEB中的写(重点)

这个方法经常用到,导出Excel,失败的时候返回json

    /*** 文件下载并且失败的时候返回json(默认失败了会返回一个有部分数据的Excel)** @since 2.1.1*/@GetMapping("downloadFailedUsingJson")public void downloadFailedUsingJson(HttpServletResponse response) throws IOException {// 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postmantry {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).autoCloseStream(Boolean.FALSE).sheet("模板").doWrite(data());} catch (Exception e) {// 重置responseresponse.reset();response.setContentType("application/json");response.setCharacterEncoding("utf-8");Map<String, String> map = new HashMap<String, String>();map.put("status", "failure");map.put("message", "下载文件失败" + e.getMessage());response.getWriter().println(JSON.toJSONString(map));}}

3.2 读操作

首先我们一个监听器,因为和poi的不同,easyExcel是spring接管的,自己监控和改写方法

package com.example.easyExcel;import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import com.example.Dao.DemoDAO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.util.ArrayList;
import java.util.List;
// 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
public class DemoDataListener extends AnalysisEventListener<DemoData> {private static final Logger LOGGER = LoggerFactory.getLogger(DemoDataListener.class);/*** 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收*/private static final int BATCH_COUNT = 5;List<DemoData> list = new ArrayList<DemoData>();/*** 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。*/private DemoDAO demoDAO;public DemoDataListener() {// 这里是demo,所以随便new一个。实际使用如果到了spring,请使用下面的有参构造函数demoDAO = new DemoDAO();}/*** 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来** @param demoDAO*/public DemoDataListener(DemoDAO demoDAO) {this.demoDAO = demoDAO;}/*** 这个每一条数据解析都会来调用** @param data*            one row value. Is is same as {@link AnalysisContext#readRowHolder()}* @param context*/@Overridepublic void invoke(DemoData data, AnalysisContext context) {LOGGER.info("解析到一条数据:{}", JSON.toJSONString(data));System.out.println( JSON.toJSONString(data));list.add(data);// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOMif (list.size() >= BATCH_COUNT) {saveData();// 存储完成清理 listlist.clear();}}/*** 所有数据解析完成了 都会来调用** @param context*/@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// 这里也要保存数据,确保最后遗留的数据也存储到数据库saveData();LOGGER.info("所有数据解析完成!");}/*** 加上存储数据库*/private void saveData() {LOGGER.info("{}条数据,开始存储数据库!", list.size());demoDAO.save(list);LOGGER.info("存储数据库成功!");}
}

这里的saveData是为了给读取前台的表格之后可以执行这个然后通过下面的方法持久化到数据库,而且这里默认是5条持久一次

/*** 假设这个是你的DAO存储。当然还要这个类让spring管理,当然你不用需要存储,也不需要这个类。**/
public class DemoDAO {public void save(List<DemoData> list) {// 如果是mybatis,尽量别直接调用多次insert,自己写一个mapper里面新增一个方法batchInsert,所有数据一次性插入}
}

开始读的操作

    /*** 最简单的读* <p>1. 创建excel对应的实体对象 参照{@link DemoData}* <p>2. 由于默认一行行的读取excel,所以需要创建excel一行一行的回调监听器,参照{@link DemoDataListener}* <p>3. 直接读即可*/@Testpublic void simpleRead() {String fileName = path + "EasyTest.xlsx";EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();}

image-20200423154502718

WEB中的读

    /*** 文件上传* <p>* 1. 创建excel对应的实体对象 参照{@link UploadData}* <p>* 2. 由于默认一行行的读取excel,所以需要创建excel一行一行的回调监听器,参照{@link UploadDataListener}* <p>* 3. 直接读即可*/@PostMapping("upload")@ResponseBodypublic String upload(MultipartFile file) throws IOException {EasyExcel.read(file.getInputStream(), UploadData.class, new UploadDataListener(uploadDAO)).sheet().doRead();return "success";}

总结

  • easyExcel的确比poi方便,但是它的读需要编写监听器
  • 建议大数据用easyExcel,因为大数据时poi对于内存消耗非常大
  • 由于apache poi和jxl,excelPOI都有一个严重的问题,就是非常消耗内存,特别处理数据量多时,速度慢并且时有异常发生,所以改用由阿里研发的easyExcel更可靠一些,它的官方建议对于1000行以内的采用原来poi的写法一次读写,但于1000行以上的数据,有用了一行行进行解析的方案,这样避免了内存的溢出。
  • asyExcel扩展功能很多,且Api式调用真的轻松很多

笔记参考自:https://blog.csdn.net/weixin_44544465/article/details/110393211

笔记参考自:https://blog.csdn.net/jiohfgj/article/details/105724073

这篇关于POI及EasyExcel学习笔记(狂神说)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/853076

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件