Java导入、导出excel保姆级教程(附封装好的工具类)

前言

我们在日常开发中,一定遇到过要将数据导出为Excel的需求,那么怎么做呢?在做之前,我们需要思考下Excel的组成。Excel是由四个元素组成的分别是:WorkBook(工作簿)、Sheet(工作表)、Row(行)、Cell(单元格),其中包含关系是从左至右,一个WorkBook可以包含多个Sheet,一个Sheet又是由多个Row组成,一个Row是由多个Cell组成。知道这些后那么我们就使用java来将数据以Excel的方式导出。让我们一起来学习吧!

一、引入Apache POI依赖

使用Java实现将数据以Excel的方式导出,需要依赖第三方的库。我们需要再pom.xml中引入下面的依赖:

 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency>

二、用法&步骤

2.1 创建Excel的元素

1)创建WokrBook

Workbook workbook = new XSSFWorkbook();

2)创建Sheet

 Sheet sheet = workbook.createSheet();

 设置sheet的名称

 Sheet sheet = workbook.createSheet("sheet名称");

3)创建行Row

      Row row = sheet.createRow(0);

4)创建单元格Cell

      Cell cell = row.createCell(0, CellType.STRING);

可以指定单元格的类型,支持的类型有下面7种:

      _NONE(-1),
NUMERIC(0),
STRING(1),
//公式
FORMULA(2),
BLANK(3),
//布尔
BOOLEAN(4),
ERROR(5);

5) 填充数据

       cell.setCellValue("苹果");

2.3 样式和字体

如果我们需要导出的Excel美观一些,如设置字体的样式加粗、颜色、大小等等,就需要创建样式和字体。

创建样式:

      CellStyle cellStyle = workbook.createCellStyle();

1)左右垂直居中

      //左右居中
excelTitleStyle.setAlignment(HorizontalAlignment.CENTER);
// 设置垂直居中
excelTitleStyle.setVerticalAlignment(VerticalAlignment.CENTER);

2)字体加粗、颜色

创建加粗样式并设置到CellStyle 中:

      Font font = workbook.createFont();
//字体颜色为红色
font.setColor(IndexedColors.RED.getIndex());
//字体加粗
font.setBold(true);
cellStyle.setFont(font);

指定Cell单元格使用该样式:

      cell.setCellStyle(style);

3)调整列宽和高

      Sheet sheet = workbook.createSheet();
//自动调整列的宽度来适应内容
sheet.autoSizeColumn(int column); 
// 设置列的宽度
sheet.setColumnWidth(2, 20 * 256); 

autoSizeColumn()传递的参数就是要设置的列索引。setColumnWidth()第一个参数是要设置的列索引,第二参数是具体的宽度值,宽度 = 字符个数 * 256(例如20个字符的宽度就是20 * 256

4)倾斜、下划线

      Font font = workbook.createFont();
font.setItalic(boolean italic); 设置倾斜
font.setUnderline(byte underline); 设置下划线

2.4 进阶用法

1)合并单元格

      Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet(fileName);
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 5));

CellRangeAddress()方法四个参数分别是fristRow:起始行、lastRow:结束行、fristCol:起始列、lastCol:结束列。

如果你想合并从第一行到第二行从一列到第十列的单元格(一共合并20格),那么就是CellRangeAddress(0,1,0,10)

2)字段必填

      //创建数据验证
DataValidationHelper dvHelper = sheet.getDataValidationHelper();
//创建要添加校验的单元格对象
CellRangeAddressList addressList = new CellRangeAddressList(0, 0, 0, 10);
//创建必填校验规则
DataValidationConstraint constraint = validationHelper.createCustomConstraint("NOT(ISBLANK(A1))");
//设置校验
DataValidation validation = dvHelper.createValidation(constraint, addressList);
//校验不通过 提示
validation.setShowErrorBox(true);
sheet.addValidationData(validation);

CellRangeAddressList()方法传递四个参数,分别是:fristRow:起始行、lastRow:结束行、fristCol:起始列、lastCol:结束列。CellRangeAddressList(0, 0, 0, 10)表示的就是给第一行从第一列开始到第十列一共十个单元格添加数据校验。

3)添加公式

SUM:求和函数

      //创建SUM公式
FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
Cell sumCell = row.createCell(0);
sumCell.setCellFormula("SUM(A1:A10)");
//计算SUM公式结果
Cell sumResultCell = row.createCell(1);
sumResultCell.setCellValue(evaluator.evaluate(sumCell).getNumberValue());

AVERAGE:平均数函数

      //创建AVERAGE公式
FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
Cell averageCell = row.createCell(0);
averageCell.setCellFormula("AVERAGE(A1:A10)");//计算AVERAGE公式结果
Cell averageResultCell = row.createCell(1);
averageResultCell.setCellValue(evaluator.evaluate(averageCell).getNumberValue());

COUNT:计数函数

      //创建COUNT公式
FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
Cell countCell = row.createCell(0);
countCell.setCellFormula("COUNT(A1:A10)");//计算COUNT公式结果
Cell countResultCell = row.createCell(1);
countResultCell.setCellValue(evaluator.evaluate(countCell).getNumberValue());

IF:条件函数

      //创建IF公式
FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
Cell ifCell = row.createCell(0);
ifCell.setCellFormula("IF(A1>B1,\"Yes\",\"No\")");//计算IF公式结果
Cell ifResultCell = row.createCell(1);
ifResultCell.setCellValue(evaluator.evaluate(ifCell).getStringValue());

CONCATENATE:连接函数

      //创建CONCATENATE公式
FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
Cell concatenateCell = row.createCell(0);
concatenateCell.setCellFormula("CONCATENATE(A1,\" \",B1)");//计算CONCATENATE公式结果
Cell concatenateResultCell = row.createCell(1);
concatenateResultCell.setCellValue(evaluator.evaluate(concatenateCell).getStringValue());

4)下拉选择

      //下拉值
private List<String> grade = Arrays.asList("高", "中", "低");
(此处省略n行代码)
Sheet sheet = workbook.createSheet("sheet");
DataValidation dataValidation = this.addPullDownConstraint(i, sheet, grade );
sheet.addValidationData(dataValidation);

5)设置单元格的数据类型

数字格式

      // 设置单元格样式 - 数字格式
CellStyle numberCellStyle = workbook.createCellStyle();
numberCellStyle.setDataFormat(workbook.createDataFormat().getFormat("#,##0.00"));
//指定单元格
Row row = sheet.createRow(0);
Cell cell = row.createCell(0);
cell.setCellStyle(numberCellStyle);

日期格式

      // 设置单元格样式 - 日期格式
CellStyle dateCellStyle = workbook.createCellStyle();
dateCellStyle.setDataFormat(workbook.createDataFormat().getFormat("yyyy-MM-dd"));
//指定单元格
Row row = sheet.createRow(0);
Cell cell = row.createCell(0);
cell.setCellStyle(dateCellStyle);

三、导出完整示例

下面的示例使用SpringBoot项目来演示:

pom.xml依赖:

       <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.7.5</version>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>2.7.5</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version>
</dependency>
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.16</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.fastjson2/fastjson2 -->
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.21</version>
</dependency>
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version>
</dependency>

Controller层代码:

      package shijiangdiya.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import shijiangdiya.utils.ExportUtils;
import javax.servlet.http.HttpServletResponse;@RestController
@RequestMapping("/sync")
public class ExportController {
}

1)代码

      @Autowired
private HttpServletResponse response;@PostMapping("/export")
public void export() {//模拟json数据String data = "[{\n" +"    \"studentId\": \"20210101\",\n" +"    \"name\": \"Alice\",\n" +"    \"age\": 20,\n" +"    \"credit\": 80\n" +"  },\n" +"  {\n" +"    \"studentId\": \"20210102\",\n" +"    \"name\": \"Bob\",\n" +"    \"age\": 21,\n" +"    \"credit\": 85\n" +"  },\n" +"  {\n" +"    \"studentId\": \"20210103\",\n" +"    \"name\": \"Charlie\",\n" +"    \"age\": 22,\n" +"    \"credit\": 90\n" +"  },\n" +"  {\n" +"    \"studentId\": \"20210104\",\n" +"    \"name\": \"David\",\n" +"    \"age\": 20,\n" +"    \"credit\": 75\n" +"  },\n" +"  {\n" +"    \"studentId\": \"20210105\",\n" +"    \"name\": \"Emily\",\n" +"    \"age\": 21,\n" +"    \"credit\": 82\n" +"  },\n" +"  {\n" +"    \"studentId\": \"20210106\",\n" +"    \"name\": \"Frank\",\n" +"    \"age\": 22,\n" +"    \"credit\": 88\n" +"  },\n" +"  {\n" +"    \"studentId\": \"20210107\",\n" +"    \"name\": \"Grace\",\n" +"    \"age\": 20,\n" +"    \"credit\": 81\n" +"  },\n" +"  {\n" +"    \"studentId\": \"20210108\",\n" +"    \"name\": \"Henry\",\n" +"    \"age\": 21,\n" +"    \"credit\": 89\n" +"  },\n" +"  {\n" +"    \"studentId\": \"20210109\",\n" +"    \"name\": \"Isaac\",\n" +"    \"age\": 22,\n" +"    \"credit\": 92\n" +"  },\n" +"  {\n" +"    \"studentId\": \"20210110\",\n" +"    \"name\": \"John\",\n" +"    \"age\": 20,\n" +"    \"credit\": 78\n" +"  },\n" +"  {\n" +"    \"studentId\": \"20210111\",\n" +"    \"name\": \"Kelly\",\n" +"    \"age\": 21,\n" +"    \"credit\": 84\n" +"  },\n" +"  {\n" +"    \"studentId\": \"20210112\",\n" +"    \"name\": \"Linda\",\n" +"    \"age\": 22,\n" +"    \"credit\": 87\n" +"  },\n" +"  {\n" +"    \"studentId\": \"20210113\",\n" +"    \"name\": \"Mike\",\n" +"    \"age\": 20,\n" +"    \"credit\": 77\n" +"  },\n" +"  {\n" +"    \"studentId\": \"20210114\",\n" +"    \"name\": \"Nancy\",\n" +"    \"age\": 21,\n" +"    \"credit\": 83\n" +"  },\n" +"  {\n" +"    \"studentId\": \"20210115\",\n" +"    \"name\": \"Oscar\",\n" +"    \"age\": 22,\n" +"    \"credit\": 91\n" +"  },\n" +"  {\n" +"    \"studentId\": \"20210116\",\n" +"    \"name\": \"Paul\",\n" +"    \"age\": 20,\n" +"    \"credit\": 76\n" +"  },\n" +"  {\n" +"    \"studentId\": \"20210117\",\n" +"    \"name\": \"Queen\",\n" +"    \"age\": 21,\n" +"    \"credit\": 86\n" +"  },\n" +"  {\n" +"    \"studentId\": \"20210118\",\n" +"    \"name\": \"Rachel\",\n" +"    \"age\": 22,\n" +"    \"credit\": 94\n" +"  },\n" +"  {\n" +"    \"studentId\": \"20210119\",\n" +"    \"name\": \"Sarah\",\n" +"    \"age\": 20,\n" +"    \"credit\": 79\n" +"  },\n" +"  {\n" +"    \"studentId\": \"20210120\",\n" +"    \"name\": \"Tom\",\n" +"    \"age\": 21,\n" +"    \"credit\": 80\n" +"  }\n" +"]\n";ExportUtils.exportExcel("学生信息", data, Student.class, response);
}

2)工具类

        /*** 数据导出* @param fileName 导出excel名称* @param data 导出的数据* @param c 导出数据的实体class* @param response 响应* @throws Exception*/
public static void exportExcel(String fileName, String data, Class<?> c, HttpServletResponse response) throws Exception {try {// 创建表头// 创建工作薄Workbook workbook = new XSSFWorkbook();Sheet sheet = workbook.createSheet();// 创建表头行Row rowHeader = sheet.createRow(0);if (c == null) {throw new RuntimeException("Class对象不能为空!");}Field[] declaredFields = c.getDeclaredFields();List<String> headerList = new ArrayList<>();if (declaredFields.length == 0) {return;}for (int i = 0; i < declaredFields.length; i++) {Cell cell = rowHeader.createCell(i, CellType.STRING);String headerName = String.valueOf(declaredFields[i].getName());cell.setCellValue(headerName);headerList.add(i, headerName);}// 填充数据List<?> objects = JSONObject.parseArray(data, c);Object obj = c.newInstance();if (!CollectionUtils.isEmpty(objects)) {for (int o = 0; o < objects.size(); o++) {Row rowData = sheet.createRow(o + 1);for (int i = 0; i < headerList.size(); i++) {Cell cell = rowData.createCell(i);Field nameField = c.getDeclaredField(headerList.get(i));nameField.setAccessible(true);String value = String.valueOf(nameField.get(objects.get(o)));cell.setCellValue(value);}}}response.setContentType("application/vnd.ms-excel");String resultFileName = URLEncoder.encode(fileName, "UTF-8");response.setHeader("Content-disposition", "attachment;filename=" + resultFileName + ";" + "filename*=utf-8''" + resultFileName);workbook.write(response.getOutputStream());workbook.close();response.flushBuffer();} catch (Exception e) {throw new RuntimeException(e);}
}

3)结果

49e92167697a79385766d0ff9329bb75.webp

四、导入完整示例

1)代码

      @PostMapping("/import")
public void importExcel(@RequestParam("excel") MultipartFile excel){Workbook workbook = null;try {workbook = WorkbookFactory.create(excel.getInputStream());Sheet sheet = workbook.getSheetAt(0);List<Student> students = new ArrayList<>();int i = 0;for (Row row : sheet) {Row row1 = sheet.getRow(i + 1);if(row1 != null){Student data = new Student();data.setStudentId(Integer.parseInt(row1.getCell(0).getStringCellValue()));data.setName(row1.getCell(1).getStringCellValue());data.setAge(Integer.parseInt(row1.getCell(2).getStringCellValue()));data.setCredit(Integer.parseInt(row1.getCell(3).getStringCellValue()));students.add(data);}}System.out.println(students);workbook.close();} catch (IOException e) {throw new RuntimeException(e);}

2)工具类

       /*** 导入* @param workbook 工作簿* @param c 实体类* @return 实体类集合*/public static <T> List<T> importExcel(Workbook workbook,Class<?> c){List<T> dataList = new ArrayList<>();try {Sheet sheet = workbook.getSheetAt(0);int i = 0;T o = null;for (Row row : sheet) {Row row1 = sheet.getRow(i + 1);if(row1 != null){o = (T) c.newInstance();Field[] declaredFields = c.getDeclaredFields();for (int i1 = 0; i1 < declaredFields.length; i1++) {String name = declaredFields[i1].getName();Field declaredField1 = o.getClass().getDeclaredField(name);declaredField1.setAccessible(true);Cell cell = row1.getCell(i1);String type = declaredFields[i1].getType().getName();String value = String.valueOf(cell);if(StringUtils.equals(type,"int") || StringUtils.equals(type,"Integer")){declaredField1.set(o,Integer.parseInt(value));} else if(StringUtils.equals(type,"java.lang.String") || StringUtils.equals(type,"char") || StringUtils.equals(type,"Character") ||StringUtils.equals(type,"byte") || StringUtils.equals(type,"Byte")){declaredField1.set(o,value);} else if(StringUtils.equals(type,"boolean") || StringUtils.equals(type,"Boolean")){declaredField1.set(o,Boolean.valueOf(value));} else if(StringUtils.equals(type,"double") || StringUtils.equals(type,"Double")){declaredField1.set(o,Double.valueOf(value));} else if (StringUtils.equals(type,"long") || StringUtils.equals(type,"Long")) {declaredField1.set(o,Long.valueOf(value));} else if(StringUtils.equals(type,"short") || StringUtils.equals(type,"Short")){declaredField1.set(o,Short.valueOf(value));} else if(StringUtils.equals(type,"float") || StringUtils.equals(type,"Float")){declaredField1.set(o,Float.valueOf(value));}}}dataList.add(o);}workbook.close();return dataList;}catch (Exception e){e.printStackTrace();}return dataList;}

注意:导入工具类仅限Java的八大基础数据类型和String类型。如果还有其他类型需要自己扩展。

3)结果

学生信息集合:

e6d56cd21f3dcafbb17abd48c11e95ed.webp

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

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

相关文章

linux入门到实操-1 Linux概述、诞生过程、发行版本,如何安装?

教程来源&#xff1a;B站视频BV1WY4y1H7d3 3天搞定Linux&#xff0c;1天搞定Shell&#xff0c;清华学神带你通关_哔哩哔哩_bilibili 整理汇总的课程内容笔记和课程资料&#xff0c;供大家学习交流下载&#xff1a;夸克网盘分享 本文内容为完整笔记的入门篇 概述部分历史内容…

使用LSTM(长短期记忆网络)模型预测股票价格的实例分析

一&#xff1a;LSTM与RNN的区别 LSTM&#xff08;Long Short-Term Memory&#xff09;是一种特殊的循环神经网络&#xff08;RNN&#xff09;架构。LSTM是为了解决传统RNN在处理长序列数据时遇到的梯度消失或梯度爆炸问题而设计的。 在传统的RNN中&#xff0c;信息通过隐藏状…

使用虚拟信用卡WildCard轻松订阅POE:全面解析平台功能与订阅方式

POE&#xff08;Platform of Engagement&#xff09;是一个由Quora推出的人工智能聊天平台&#xff0c;汇集了多个强大的AI聊天机器人&#xff0c;如GPT-4、Claude、Sage等。POE提供了一个简洁、统一的界面&#xff0c;让用户能够便捷地与不同的AI聊天模型进行互动。这种平台的…

基于SpringBoot的社团管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于JavaSpringBootVueMySQL的社团管理系统【附源码文档】、…

HashTable哈希表

概念 散列表(Hash Table)&#xff0c;又称哈希表。是一种数据结构&#xff0c;特点是:数据元素的关键字与其存储地址直接相关 在顺序结构以及树型结构中&#xff0c;数据元素的关键字与其存储位置没有对应的关系&#xff0c;因此在查找一个元素时&#xff0c;必须要经过关键码…

Windows 平台安装 Nacos 2.x

环境准备 64 位操作系统&#xff0c;Windows 10 / Linux Centos 7JDK 1.8 安装包下载 安装包下载官方地址&#xff1a;https://github.com/alibaba/nacos/releases 启动 将安装包解压到安装的目录下&#xff0c;改名为 nacos-2.0.4。然后进行到 bin 目录下&#xff0c;打开…

软件测试服务公司出具第三方软件测试报告流程和周期简析

随着信息技术的飞速发展&#xff0c;软件已成为各行各业不可或缺的重要工具。然而&#xff0c;软件的质量直接影响到企业的效率和用户体验&#xff0c;因此&#xff0c;软件测试服务的重要性日益凸显。软件测试服务公司&#xff0c;顾名思义&#xff0c;就是专门提供专业的软件…

工业机器人9公里远距离图传模块,无人机低延迟高清视界,跨过距离限制

在科技日新月异的今天&#xff0c;无线通信技术正以未有的速度发展&#xff0c;其中&#xff0c;图传模块作为连接现实与数字世界的桥梁&#xff0c;正逐步展现出其巨大的潜力和应用价值。今天&#xff0c;我们将聚焦一款引人注目的产品——飞睿智能9公里远距离图传模块&#x…

LiveKit的agent介绍

概念 LiveKit核心概念&#xff1a; Room&#xff08;房间&#xff09;Participant&#xff08;参会人&#xff09;Track&#xff08;信息流追踪&#xff09; Agent 架构图 ​ 订阅信息流 ​ agent交互流程 客户端操作 加入房间 房间创建方式 手动 赋予用户创建房间的…

JavaScript - Api学习 Day03 (日期对象、节点操作、两种定时器、本地存储)

文章目录 一、日期对象1.1 实例化1.2 日期对象方法 二、节点操作2.1 父子兄弟节点1. 父节点查找2. 子节点查找3. 兄弟关系查找 2.2 增删节点1. 创建节点 - createElement2. 添加节点2.1 appendChild() 方法2.2 insertBefore() 方法2.3. 克隆节点 - cloneNode 3. 删除节点3.1 re…

[数据集][目标检测]抽烟检测数据集VOC+YOLO格式22559张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;22559 标注数量(xml文件个数)&#xff1a;22559 标注数量(txt文件个数)&#xff1a;22559 标…

VisualStudio环境搭建C++

Visual Studio环境搭建 说明 C程序编写中&#xff0c;经常需要链接头文件(.h/.hpp)和源文件(.c/.cpp)。这样的好处是&#xff1a;控制主文件的篇幅&#xff0c;让代码架构更加清晰。一般来说头文件里放的是类的申明&#xff0c;函数的申明&#xff0c;全局变量的定义等等。源…

echarts图 图例跑上面去了 不在右边

legend 中缺少 "right": "1%", "top": "center",

PyTorch----模型运维与实战

一、PyTorch是什么 PyTorch 由Facebook开源的神经网络框架&#xff0c;专门针对 GPU 加速的深度神经网络&#xff08;DNN&#xff09;编程。 二、PyTorch安装 首先确保你已经安装了GPU环境&#xff0c;即Anaconda、CUDA和CUDNN 随后进入Pytorch官网​​​​​​PyTorch 官…

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

引言 高斯网络&#xff08;Gaussian Network&#xff09;通常指的是一个概率图模型&#xff0c;其中所有的随机变量&#xff08;或节点&#xff09;都遵循高斯分布 文章目录 引言一、高斯网络&#xff08;Gaussian Network&#xff09;1.1 高斯过程&#xff08;Gaussian Proces…

细说STM32F407通用定时器的基础知识

目录 一、通用定时器功能概述 二、细说2通道定时器的功能 1.时钟信号和触发控制器 2.时基单元工作原理 (1)计数寄存器(CNT) (2)预分频寄存器(PSC) (3)自动重载寄存器(ARR) (4)时基单元的控制位 3.捕获/比较通道 三、生成PWM波 1.生成PWM波的原理 2.与生成PWM波相关的HA…

2023下半年软考网络规划

【考情分析】2023下半年软考网络规划设计师机考考情分析-真题解析公开课视频&#xff01;_哔哩哔哩_bilibili2023年11月软考网络规划设计师案例分析解析与考后复盘_哔哩哔哩_bilibili全网首发&#xff01;2023年下半年软考【高级】网规真题试卷--案例分析&#xff08;部分回忆版…

表观遗传系列1:DNA 甲基化以及组蛋白修饰

1. 表观遗传 表观遗传信息很多为化学修饰&#xff0c;包括 DNA 甲基化以及组蛋白修饰&#xff0c;即DNA或蛋白可以通过化学修饰添加附加信息。 DNA位于染色质&#xff08;可视为微环境&#xff09;中&#xff0c;并不是裸露的&#xff0c;因此DNA分子研究需要跟所处环境结合起…

Tuxera NTFS for Mac破解版下载 Tuxera NTFS for Mac2023激活码 mac电脑ntfs磁盘软件

Tuxera NTFS for Mac是一款优秀的Mac系统完全读写软件&#xff0c;提供Fat32、NTFS、Exfat、mac os扩展格式的转换&#xff0c;稳定性好&#xff0c;传输速度极快。Tuxera NTFS for Mac功能丰富&#xff0c;能修复NTFS卷、创建NTFS磁盘映像、创建NTFS分区等等。同时软件支持所有…

【EI会议末轮截稿通知】第三届电子信息技术国际学术会议(EIT 2024)

第三届电子信息技术国际学术会议&#xff08;EIT 2024&#xff09; The 3rd International Conference on Electronic Information Technology 重要信息 大会官网&#xff1a;www.ic-eit.net 三轮截稿时间&#xff1a;2024年9月16日23:59分&#xff08;后续不再征稿&#x…