Excel 导入、导出的封装

最近在封装公司统一使用的组件,主要目的是要求封装后开发人员调用简单,不用每个项目组中重复去集成同一个依赖l,写的五花八门,代码不规范,后者两行泪。

为此,我们对EasyExcel进行了二次封装,我会先来介绍下具体使用,然后再给出封装过程

环境准备
开发环境:SpringBoot+mybatis-plus+db

数据库:

-- `dfec-tcht-platform-dev`.test definitionCREATE TABLE `test` (`num` decimal(10,0) DEFAULT NULL COMMENT '数字',`sex` varchar(100) DEFAULT NULL COMMENT '性别',`name` varchar(100) DEFAULT NULL COMMENT '姓名',`born_date` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

使用
第一步、在接口类中引入以下

@Aurowired 
ExcelService excelService;

第二步、标注字段
这些个注解是EasyExcel的注解,我们做了保留,仍然使用他的注解

/*** 【请填写功能名称】对象 test**/
@Data
@TableName("test")
public class TestEntity  {/*** 数字*/@Schema(description = "数字")@ExcelProperty("数字")private BigDecimal num;/*** 性别*/@Schema(description = "性别")@ExcelProperty("性别")private String sex;/*** 姓名*/@Schema(description = "姓名")@ExcelProperty("姓名")private String name;/*** 创建时间*/@Schema(description = "创建时间")@ExcelProperty(value = "创建时间")private Date bornDate;}

第三步、使用

@PostMapping("/importExcel")
public void importExcel(@RequestParam MultipartFile file){excelService.importExcel(file, TestEntity.class,2,testService::saveBatch);
}@PostMapping("/exportExcel")
public void exportExcel(HttpServletResponse response) throws IOException {excelService.exportExcel(testService.list(),TestEntity.class,response);
} 

完整代码

/*** @title: TestController* @projectName df-platform* @description: TODO*/@RestController
@RequestMapping("test")
@RequiredArgsConstructor
public class TestController {private  final ExcelService excelService;private final TestService testService;@PostMapping("/importExcel")public void importExcel(@RequestParam MultipartFile file){excelService.importExcel(file, TestEntity.class,2,testService::saveBatch);}@PostMapping("/exportExcel")public void exportExcel(HttpServletResponse response) throws IOException {excelService.exportExcel(testService.list(),TestEntity.class,filePath,response);}}

哈哈哈,是不是非常简洁

以上只是一个简单的使用情况,我们还封装了支持模板的导入、导出,数据转换等问题,客官请继续向下看。

如果遇到有读取到的数据和实际保存的数据不一致的情况下,可以使用如下方式导入,这里给出一个示例

@PostMapping("/importExcel")
public void importExcel(@RequestParam MultipartFile file){Function<TestEntity, TestVo> map = new Function<TestEntity, TestVo>() {@Overridepublic TestVo apply(TestEntity testEntities) {TestVo testVo = new TestVo();testVo.setNum(testEntities.getNum());testVo.setSex(testEntities.getSex());testVo.setBaseName(testEntities.getName());return testVo;}};excelService.importExcel(file, TestEntity.class,2,map,testService::saveBatchTest);
}

封装过程

核心思想:

对导入和导出提供接口、保持最少依赖原则

我们先从ExcelService接口类出发,依次看下封装的几个核心类

/*** ExcelService** @interfaceName ExcelService**/
public interface ExcelService {/*** 导出Excel,默认* @param list 导出的数据* @param tClass 带有excel注解的实体类* @param response 相应* @return T*/<T> void exportExcel(List<T> list, Class<T> tClass, HttpServletResponse response) throws IOException;/*** 导出Excel,增加类型转换* @param list 导出的数据* @param tClass 带有excel注解的实体类* @param response 相应* @return T*/<T, R> void exportExcel(List<T> list, Function<T, R> map, Class<R> tClass, HttpServletResponse response) throws IOException;/*** 导出Excel,按照模板导出,这里是填充模板* @param list 导出的数据* @param tClass 带有excel注解的实体类* @param template 模板* @param response 相应* @return T*/<T> void exportExcel(List<T> list, Class<T> tClass, String template, HttpServletResponse response) throws IOException;/*** 导入Excel* @param file 文件* @param tClass 带有excel注解的实体类* @param headRowNumber 表格头行数据* @param map 类型转换* @param consumer 消费数据的操作* @return T*/<T, R> void importExcel(MultipartFile file, Class<T> tClass, Integer headRowNumber, Function<T, R> map, Consumer<List<R>> consumer);/*** 导入Excel* @param file 文件* @param tClass 带有excel注解的实体类* @param headRowNumber 表格头行数据* @param consumer 消费数据的操作* @return T*/<T> void importExcel(MultipartFile file, Class<T> tClass, Integer headRowNumber, Consumer<List<T>> consumer);}

以上接口只有个导入、导出,只是加了几个重载方法而已

再看下具体的实现类

package com.dfec.framework.excel.service.impl;import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.dfec.framework.excel.convert.LocalDateTimeConverter;
import com.dfec.framework.excel.service.ExcelService;
import com.dfec.framework.excel.util.ExcelUtils;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;/*** DefaultExcelServiceImpl** @className DefaultExcelServiceImpl**/
@Service
public class DefaultExcelServiceImpl implements ExcelService {@Overridepublic <T> void exportExcel(List<T> list, Class<T> tClass, HttpServletResponse response) throws IOException {setResponse(response);EasyExcel.write(response.getOutputStream()).head(tClass).excelType(ExcelTypeEnum.XLSX).registerConverter(new LocalDateTimeConverter()).sheet("工作簿1").doWrite(list);}@Overridepublic <T, R> void exportExcel(List<T> list, Function<T, R> map, Class<R> tClass, HttpServletResponse response) throws IOException {setResponse(response);List<R> result = list.stream().map(map::apply).collect(Collectors.toList());exportExcel(result, tClass, response);}@Overridepublic <T> void exportExcel(List<T> list, Class<T> tClass,String template, HttpServletResponse response) throws IOException {setResponse(response);EasyExcel.write(response.getOutputStream()).withTemplate(template).excelType(ExcelTypeEnum.XLS).useDefaultStyle(false).registerConverter(new LocalDateTimeConverter()).sheet(0).doFill(list) ;}@Overridepublic <T,R> void importExcel(MultipartFile file, Class<T> tClass,Integer headRowNumber, Function<T, R> map,Consumer<List<R>> consumer) {List<T> excelData = ExcelUtils.readExcelData(file,tClass,headRowNumber);List<R> result = excelData.stream().map(map::apply).collect(Collectors.toList());consumer.accept(result);}@Overridepublic <T> void importExcel(MultipartFile file, Class<T> tClass,Integer headRowNumber, Consumer<List<T>> consumer) {List<T> excelData = ExcelUtils.readExcelData(file,tClass,headRowNumber);consumer.accept(excelData);}public void setResponse(HttpServletResponse response) throws UnsupportedEncodingException {response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系String fileName = URLEncoder.encode("data", "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xls");}
}

ExcelUtils

package com.dfec.framework.excel.util;import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.read.builder.ExcelReaderBuilder;
import com.alibaba.excel.read.metadata.ReadSheet;
import com.alibaba.excel.util.MapUtils;
import com.alibaba.fastjson.JSON;
import com.dfec.common.exception.ServiceException;
import com.dfec.framework.excel.listener.ExcelListener;
import com.dfec.framework.excel.service.ExcelBaseService;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.Set;/*** @description: Excel 工具类* @title: ExcelUtils*/
public class ExcelUtils {/*** 将列表以 Excel 响应给前端** @param response  响应* @param fileName  文件名* @param sheetName Excel sheet 名* @param head      Excel head 头* @param data      数据列表哦* @param <T>       泛型,保证 head 和 data 类型的一致性* @throws IOException 写入失败的情况*/public static <T> void excelExport(HttpServletResponse response, String fileName, String sheetName,Class<T> head, List<T> data) throws IOException {write(response, fileName);// 这里需要设置不关闭流EasyExcel.write(response.getOutputStream(), head).autoCloseStream(Boolean.FALSE).sheet(sheetName).doWrite(data);}/*** 根据模板导出** @param response     响应* @param templatePath 模板名称* @param fileName     文件名* @param sheetName    Excel sheet 名* @param head         Excel head 头* @param data         数据列表哦* @param <T>          泛型,保证 head 和 data 类型的一致性* @throws IOException 写入失败的情况*/public static <T> void excelExport(HttpServletResponse response, String templatePath, String fileName, String sheetName,Class<T> head, List<T> data) throws IOException {write(response, fileName);// 这里需要设置不关闭流EasyExcel.write(response.getOutputStream(), head).withTemplate(templatePath).autoCloseStream(Boolean.FALSE).sheet(sheetName).doWrite(data);}/*** 根据参数,只导出指定列** @param response                响应* @param fileName                文件名* @param sheetName               Excel sheet 名* @param head                    Excel head 头* @param data                    数据列表哦* @param excludeColumnFiledNames 排除的列* @param <T>                     泛型,保证 head 和 data 类型的一致性* @throws IOException 写入失败的情况*/public static <T> void excelExport(HttpServletResponse response, String fileName, String sheetName,Class<T> head, List<T> data, Set<String> excludeColumnFiledNames) throws IOException {write(response, fileName);// 这里需要设置不关闭流EasyExcel.write(response.getOutputStream(), head).autoCloseStream(Boolean.FALSE).excludeColumnFiledNames(excludeColumnFiledNames).sheet(sheetName).doWrite(data);}private static void write(HttpServletResponse response, String fileName) {try {response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");} catch (Exception e) {// 重置responseresponse.reset();response.setContentType("application/json");response.setCharacterEncoding("utf-8");Map<String, String> map = MapUtils.newHashMap();map.put("status", "failure");map.put("message", "下载文件失败" + e.getMessage());try {response.getWriter().println(JSON.toJSONString(map));} catch (IOException ex) {throw new RuntimeException(ex);}}}public static <T> List<T> read(MultipartFile file, Class<T> head) throws IOException {return EasyExcel.read(file.getInputStream(), head, null)// 不要自动关闭,交给 Servlet 自己处理.autoCloseStream(false).doReadAllSync();}/*** 读取 Excel(多个 sheet)** @param excel    文件* @param rowModel 实体类映射* @return Excel 数据 list*/public static <T> List<T> readExcelData(MultipartFile excel, Class<T> rowModel, Integer headRowNumber) {ExcelListener excelListener = new ExcelListener();ExcelReaderBuilder readerBuilder = getReader(excel, excelListener);if (readerBuilder == null) {return null;}if (headRowNumber == null) {headRowNumber = 1;}readerBuilder.head(rowModel).headRowNumber(headRowNumber).doReadAll();return excelListener.getData();}/*** 读取 Excel(多个 sheet)** @param excel    文件* @param rowModel 实体类映射* @return Excel 数据 list*/public static <T> List<T> excelImport(MultipartFile excel, ExcelBaseService excelBaseService, Class rowModel) {ExcelListener excelListener = new ExcelListener(excelBaseService);ExcelReaderBuilder readerBuilder = getReader(excel, excelListener);if (readerBuilder == null) {return null;}readerBuilder.head(rowModel).doReadAll();return excelListener.getData();}/*** 读取某个 sheet 的 Excel** @param excel       文件* @param rowModel    实体类映射* @param sheetNo     sheet 的序号 从1开始* @param headLineNum 表头行数,默认为1* @return Excel 数据 list*/public static <T> List<T> excelImport(MultipartFile excel, ExcelBaseService excelBaseService, Class rowModel, int sheetNo,Integer headLineNum) {ExcelListener excelListener = new ExcelListener(excelBaseService);ExcelReaderBuilder readerBuilder = getReader(excel, excelListener);if (readerBuilder == null) {return null;}ExcelReader reader = readerBuilder.headRowNumber(headLineNum).build();ReadSheet readSheet = EasyExcel.readSheet(sheetNo).head(rowModel).build();reader.read(readSheet);return excelListener.getData();}/*** 返回 ExcelReader** @param excel         需要解析的 Excel 文件* @param excelListener 监听器*/private static ExcelReaderBuilder getReader(MultipartFile excel,ExcelListener excelListener) {String filename = excel.getOriginalFilename();if (filename == null || (!filename.toLowerCase().endsWith(".xls") && !filename.toLowerCase().endsWith(".xlsx"))) {throw new ServiceException("文件格式错误!");}InputStream inputStream;try {inputStream = new BufferedInputStream(excel.getInputStream());return EasyExcel.read(inputStream, excelListener);} catch (IOException e) {e.printStackTrace();}return null;}}

ExcelListener.java

package com.dfec.framework.excel.listener;import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import com.dfec.framework.excel.service.ExcelBaseService;
import lombok.extern.slf4j.Slf4j;import java.util.ArrayList;
import java.util.List;
import java.util.Map;/*** @description: Excel导入的监听类* @title: ExcelListener* @projectName df-platform*/
@Slf4j
public  class  ExcelListener<T> extends AnalysisEventListener<T> {private ExcelBaseService excelBaseService;public ExcelListener(){}public ExcelListener(ExcelBaseService excelBaseService){this.excelBaseService = excelBaseService;}/*** 每隔1000条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收*/private static final int BATCH_COUNT = 1000;List<T> list = new ArrayList<>();@Overridepublic void invoke(T data, AnalysisContext context) {list.add(data);log.info("解析到一条数据:{}", JSON.toJSONString(data));}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {log.info("所有数据解析完成!");}/*** 返回list*/public  List<T> getData() {return this.list;}}

遇到的问题

1、通过模板导出数据作为导入数据再导入进来,日期格式不正确
解决方法:

package com.dfec.server;import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.converters.ReadConverterContext;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.dfec.common.utils.str.StringUtils;import java.util.Date;/*** DateConverter** @className DateConverter**/
public class DateConverter implements Converter<Date> {@Overridepublic Date convertToJavaData(ReadConverterContext<?> context) throws Exception {Class<?> aClass = context.getContentProperty().getField().getType();CellDataTypeEnum type = context.getReadCellData().getType();String stringValue = context.getReadCellData().getStringValue();if(aClass.equals(Date.class) && type.equals(CellDataTypeEnum.STRING)  && StringUtils.isBlank(stringValue)){return null;}return Converter.super.convertToJavaData(context);}
}

实体类上添加

/*** 创建时间*/
@Schema(description = "创建时间")
@ExcelProperty(value = "创建时间",converter = DateConverter.class)
private Date bornDate;

同理,这块

注意这里也是可以用相同的方法去做字典值类型的转换的

2、POI版本
这里切记POI版本和ooxml的版本一堆要保持一致,不然会出现各种问题

3、日期类型 LocalDateTime 转换的问题

package com.dfec.framework.excel.convert;import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;/*** 解决 EasyExcel 日期类型 LocalDateTime 转换的问题*/
public class LocalDateTimeConverter implements Converter<LocalDateTime> {@Overridepublic Class<LocalDateTime> supportJavaTypeKey() {return LocalDateTime.class;}@Overridepublic CellDataTypeEnum supportExcelTypeKey() {return CellDataTypeEnum.STRING;}@Overridepublic LocalDateTime convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty,GlobalConfiguration globalConfiguration) {return LocalDateTime.parse(cellData.getStringValue(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));}@Overridepublic WriteCellData<String> convertToExcelData(LocalDateTime value, ExcelContentProperty contentProperty,GlobalConfiguration globalConfiguration) {return new WriteCellData(value.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));}}

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

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

相关文章

flutter const InviteFriendReward(),用setState刷新不了

列布局里面添加了InviteFriendReward()&#xff0c;InviteFriendReward()里面有请求接口的开关是否显示&#xff0c;但是因为里面有波浪形&#xff0c;所以加了const&#xff0c;导致setState时&#xff0c;即使开关是开的&#xff0c;也没有再显示了 const InviteFriendRewar…

python怎样打开一个pdf文件?

要在Python中打开PDF文件&#xff0c;可以使用PyPDF2库。 首先&#xff0c;确保已安装PyPDF2库&#xff0c;可以使用以下命令安装&#xff1a; pip install PyPDF2 然后&#xff0c;可以按照以下步骤打开PDF文件&#xff1a; 导入PyPDF2库&#xff1a; import PyPDF2 打开…

《机器学习:引领数字化时代的技术革命》

随着科技的不断发展&#xff0c;机器学习作为人工智能的重要支柱之一&#xff0c;正迅速崛起并引领着数字化时代的技术革命。本文将从机器学习的技术进展、技术原理、行业应用案例、面临的挑战与机遇以及未来趋势预测和学习路线等方面展开探讨&#xff0c;为您揭示机器学习的神…

人工智能时代如何高效完成营销内容计划

智能对话升级&#xff01;【Kompas AI】AI对话助手&#xff0c;让沟通更高效 在人工智能时代&#xff0c;要高效完成营销计划&#xff0c;我们可以利用人工智能的多种能力来增强营销策略的精准度和执行效率。借助人工智能的力量&#xff0c;企业不仅可以提高营销计划的执行效率…

python项目练习——4.手写数字识别

使用Python和Scikit-learn库进行机器学习模型训练的项目——手写数字识别。 项目分析&#xff1a; 数据准备&#xff1a;使用公开数据集&#xff08;如MNIST&#xff09;作为训练和测试数据。数据预处理&#xff1a;对图像数据进行归一化、展平等操作&#xff0c;以便输入到机…

DMA知识

提示&#xff1a;文章 文章目录 前言一、背景二、 2.1 2.2 总结 前言 前期疑问&#xff1a; 本文目标&#xff1a; 一、背景 2024年3月26日23:32:43 今天看了DMA存储器到存储器的DMA传输和存储器到外设的DMA实验&#xff0c;在keil仿真可以看到效果。还没有在protues和开发…

Linux(CentOS)/Windows-C++ 云备份项目(服务器数据管理模块设计)

数据管理模块功能&#xff1a; 后续项目需要使用的数据如下 文件实际存储路径&#xff1a;当客户端需要下载文件时&#xff0c;从这个文件中进行读取响应文件压缩包存放路径名&#xff1a;如果文件是非热点文件会被压缩 如果客户端需要下载这些文件&#xff0c;需要先进行解压…

使用Flask实现:基于midjourney-proxy的MJ绘画实现(开源)

文章目录 实现效果实现步骤完整源码 实现效果 运行mj.py&#xff0c;如下所示。输入中文&#xff0c;自动生成提示词&#xff0c;自动开始下载。用户选择是否需要变换图片&#xff0c;选择需要对哪个图片变换&#xff0c;自动保存。 之前想做一个网页版&#xff0c;只实现了…

一些常见的ClickHouse问题和答案

什么是ClickHouse&#xff1f;它与其他数据库系统有什么区别&#xff1f; ClickHouse是一个开源的列式数据库管理系统&#xff08;DBMS&#xff09;&#xff0c;专门用于高性能、大规模数据分析。与传统的行式数据库相比&#xff0c;ClickHouse具有更高的查询性能、更高的数据…

新书速览|Django 5企业级Web应用开发实战:视频教学版

掌握Django框架开发技能&#xff0c;实战投票应用系统和内容管理系统 本书内容 《Django 5企业级Web应用开发实战&#xff1a;视频教学版》精选当前简单、实用和流行的Django实例代码&#xff0c;帮助读者学习和掌握Django 5框架及其相关技术栈的开发知识。本书系统全面、内容…

【STM32学习计划】

项目名称&#xff1a;STM32学习计划 项目目标&#xff1a; 熟悉STM32单片机的基本概念和应用掌握STM32的软硬件开发流程完成一个基于STM32的简单项目 项目任务和交付物&#xff1a; 任务 1&#xff1a;熟悉STM32单片机基本概念 学习STM32单片机的基本架构和功能特性交付物…

mysql如何存Emoji表情

如何存Emoji表情 背景解决方案一&#xff1a; 如果是自己搭建的数据库&#xff0c;参考如下。 1&#xff1a;先创建数据库&#xff0c;utf8编码2&#xff1a; 修改mysql 的配置文件 /etc/my.cnf 文件3&#xff1a;然后把你的表和字段也要支持utf8md4编码4&#xff1a;修改你连…

javaWeb教务查询系统

一、简介 在教育管理领域&#xff0c;教务管理系统是一个至关重要的工具&#xff0c;它能够有效地协调学校、教师和学生之间的各种活动。我设计了一个基于JavaWeb的教务管理系统&#xff0c;该系统包括三个角色&#xff1a;管理员、教师和学生。管理员拥有课程管理、学生管理、…

Spark重温笔记(五):SparkSQL进阶操作——迭代计算,开窗函数,结合多种数据源,UDF自定义函数

Spark学习笔记 前言&#xff1a;今天是温习 Spark 的第 5 天啦&#xff01;主要梳理了 SparkSQL 的进阶操作&#xff0c;包括spark结合hive做离线数仓&#xff0c;以及结合mysql&#xff0c;dataframe&#xff0c;以及最为核心的迭代计算逻辑-udf函数等&#xff0c;以及演示了几…

JWT(JSON Web Token)

JSON Web Token 是一种开放标准&#xff0c;用于在网络上安全传输信息的简洁、自包含的方式。它通常被用于身份验证和授权机制。 JWT 由三部分组成&#xff1a;头部&#xff08;Header&#xff09;、载荷&#xff08;Payload&#xff09;和签名&#xff08;Signature&#xff…

微软开源项目Garnet:Redis的竞争者还是替代者?

对于开源社区&#xff0c;最近的一大新闻就是Redis宣布从7.4版本开始&#xff0c;将采用Redis源代码可用许可证&#xff08;RSALv2&#xff09;和服务器端公共许可证&#xff08;SSPLv1&#xff09;的双重许可证&#xff0c;取代原有的BSD三条款许可证。这一变化引发了开发者社…

阿里云子域名配置,且不带端口访问

进入阿里云控制台&#xff0c;创建一个SSL证书 # 域名名称child.domain.com创建完成后&#xff0c;将返回主机记录以及记录值&#xff0c;保存好&#xff0c;用于下一步使用 创建DNS解析 创建DNS的TXT类型解析 选择记录类型&#xff1a;TXT 填写主机记录&#xff1a;_dnsa…

一些常见的与 Vim 相关的文件类型及其描述

配置文件&#xff1a; .vimrc (Unix/Linux) 或 _vimrc (Windows)&#xff1a;这是 Vim 的主要配置文件&#xff0c;用户可以在其中设置各种选项、快捷键映射、插件加载等。Vim 在启动时会自动读取这个文件&#xff0c;并根据其中的设置来配置编辑器。init.vim&#xff1a;对于 …

【CSP试题回顾】202104-2-邻域均值(优化)

CSP-202104-2-邻域均值 关键点&#xff1a;二维前缀和数组 详见&#xff1a; 【CSP考题扩展】前缀和/差分练习【CSP考点回顾】二维前缀和数组&#xff08;代码实现&#xff09; 解题思路 1.输入和初始化 首先&#xff0c;程序从输入中获取四个整数n&#xff08;矩阵的大小…

排序(冒泡/快速/归并)

冒泡排序 时间复杂度为 O(n^2) 原理 比较相邻的元素. 如果第一个比第二个大,就交换他们两个.依次比较每一对相邻的元素—>结果 : 最后的元素是这组数中最大的重复上述步骤 , 除了最后一个[]因为最后一个已经是排好序的了(这组数中最大的那个)]持续对越来越少的元素进行如上…