当前位置: 首页 > news >正文

easyexcel调用公共导出方法导出数据

easyexcel备忘

@Slf4j
public class ConditionDownloadUtil {//扫描在xboot 包下所有IService 接口的子类, 每次启动服务后, 重新扫描public final static Class[] classesExtendsIService = ClassUtil.scanPackageBySuper("cn.exrick.xboot", IService.class).toArray(new Class[1]);public static <T, E> void nonMultiQueryDownload(Class<T> clazz,QueryWrapper<T> queryWrapper,String excelName,Class<E> excelClazz,HttpServletResponse response) {if (ObjectUtils.isNotEmpty(clazz)) {//1. 根据入参中的class 来获取对应的IService BeanIService<T> targetIService = getTargetIService(clazz);/** 2. 由于查询/排序字段在每个模块中不同, 所以需要让调用方提供, 不再统一提供* 调用IService 的list() 方法获取查询符合条件的数据*/List<T> list = targetIService.list(queryWrapper);if (list == null || list.size() == 0) {throw ExceptionUtil.wrapRuntime("数据为空, 无法下载excel!");}//3. 将实体类List 转换为Excel 类ListList<E> excelList = list.stream().map(x -> BeanUtil.toBean(x, excelClazz, CopyOptions.create().setIgnoreError(true))).collect(Collectors.toList());//4. 调用EasyExcel 通用方法输出ExcelafterMultiQueryDownload(excelName, excelList, excelClazz, new CustomMergeStrategy(excelClazz, excelList.size()), response);} else {throw ExceptionUtil.wrapRuntime("实体类不能为空!");}}public static <E> void afterMultiQueryDownload(String excelName,List<E> excelList,Class<E> excelClass,WriteHandler writeHandler,HttpServletResponse response) {//1. 判断需要输入的Excel List 是否为空, 如果不为空, 则输入, 否则, 抛出异常if (CollectionUtil.isNotEmpty(excelList)) {response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");response.setHeader("Content-disposition", "attachment;filename=" + URLUtil.encode(excelName, StandardCharsets.UTF_8)  + ".xlsx");//2. 输入Exceltry {ExcelWriterSheetBuilder excelWriterSheetBuilder = EasyExcel.write(response.getOutputStream()).excelType(ExcelTypeEnum.XLSX).head(excelClass).sheet();if (ObjectUtil.isNotEmpty(writeHandler)) {excelWriterSheetBuilder.registerWriteHandler(writeHandler);}//3. 清除Convertor 中的线程变量DictConverter.removeThreadLocal();excelWriterSheetBuilder.doWrite(excelList);} catch (Exception e) {StringWriter sw = new StringWriter();PrintWriter pw = new PrintWriter(sw);e.printStackTrace(pw);log.error(sw.toString());if (e.getCause() instanceof ExcelDataConvertException) {ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException) e.getCause();String cellMsg = "";CellData cellData = excelDataConvertException.getCellData();//这里有一个celldatatype的枚举值,用来判断CellData的数据类型CellDataTypeEnum type = cellData.getType();if (type.equals(CellDataTypeEnum.NUMBER)) {cellMsg = cellData.getNumberValue().toString();} else if (type.equals(CellDataTypeEnum.STRING)) {cellMsg = cellData.getStringValue();} else if (type.equals(CellDataTypeEnum.BOOLEAN)) {cellMsg = cellData.getBooleanValue().toString();}String errorMsg = String.format("excel表格:第%s行,第%s列,数据值为:%s,该数据值不符合要求,请检验后重新导入!<span style=\"color:red\">请检查其他的记录是否有同类型的错误!</span>", excelDataConvertException.getRowIndex() + 1, excelDataConvertException.getColumnIndex(), cellMsg);log.error(errorMsg);}}} else {throw ExceptionUtil.wrapRuntime("数据为空, 无法下载excel!");}}public <T, E> void dynamicHeadDownload(List<List<String>> headList,String excelName,List data,HttpServletResponse response) {//1. 判断Head List 是否为空, 如果不为空, 则输入, 否则, 抛出异常if (ObjectUtil.isNotEmpty(headList)) {response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");response.setHeader("Content-disposition", "attachment;filename=" + excelName + ".xlsx");//2. 输入Exceltry {EasyExcel.write(response.getOutputStream()).head(headList).sheet().doWrite(data);} catch (Exception e) {StringWriter sw = new StringWriter();PrintWriter pw = new PrintWriter(sw);e.printStackTrace(pw);log.error(sw.toString());if (e.getCause() instanceof ExcelDataConvertException) {ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException) e.getCause();String cellMsg = "";CellData cellData = excelDataConvertException.getCellData();//这里有一个celldatatype的枚举值,用来判断CellData的数据类型CellDataTypeEnum type = cellData.getType();if (type.equals(CellDataTypeEnum.NUMBER)) {cellMsg = cellData.getNumberValue().toString();} else if (type.equals(CellDataTypeEnum.STRING)) {cellMsg = cellData.getStringValue();} else if (type.equals(CellDataTypeEnum.BOOLEAN)) {cellMsg = cellData.getBooleanValue().toString();}String errorMsg = String.format("excel表格:第%s行,第%s列,数据值为:%s,该数据值不符合要求,请检验后重新导入!<span style=\"color:red\">请检查其他的记录是否有同类型的错误!</span>", excelDataConvertException.getRowIndex() + 1, excelDataConvertException.getColumnIndex(), cellMsg);log.error(errorMsg);}}} else {throw new RuntimeException("数据为空, 无法下载excel!");}}/*** 添加表头* @param head* @param headers*/public static void addHead(String head, List<List<String>> headers) {ArrayList<String> list = new ArrayList<>(1);list.add(head);headers.add(list);}/*@SneakyThrowspublic void tablesDownload(ReportDownloadModel reportDownloadModel, HttpServletResponse response) {String excelName = URLEncoder.encode(reportDownloadModel.getExcelName(), "utf-8");List<ReportTableModel> tableList = reportDownloadModel.getTables();response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");response.setHeader("Content-disposition", "attachment;filename=" + excelName + ".xlsx");ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build();WriteSheet writeSheet = EasyExcel.writerSheet().registerWriteHandler(new CustomCellWriteHandler()).registerWriteHandler(new CustomCellWriteHeightConfig()).needHead(Boolean.TRUE).build();//1. 定义标题二维数组ArrayList<List<String>> titleHead = new ArrayList<>();//2. 定义最终输出的excel 二维数组ArrayList<List<Object>> finalData = new ArrayList<>();//3. 定义空行ArrayList<Object> emptyLine = new ArrayList<>();emptyLine.add("");try {for (int i = 0; i < tableList.size() * 2; i = i + 2) {ReportTableModel reportTableModel = tableList.get(i / 2);List<List<String>> heads = reportTableModel.getHeads();List<List<Object>> data = reportTableModel.getData();String title = reportTableModel.getTitle();//3. 定义表名行ArrayList<String> titleLine = new ArrayList<>();titleLine.add(title);titleHead.add(titleLine);for (int j = 0; j < heads.size() - 1; j++) {ArrayList<String> empty = new ArrayList<>();empty.add("");titleHead.add(empty);}WriteTable writeTableForTitle = EasyExcel.writerTable(i).needHead(Boolean.TRUE).head(titleHead).build();excelWriter.write(null, writeSheet, writeTableForTitle);//4. 在表数据后添加空行finalData.addAll(data);finalData.add(emptyLine);WriteTable writeTableForData = EasyExcel.writerTable(i + 1).needHead(Boolean.TRUE).head(heads).build();excelWriter.write(finalData, writeSheet, writeTableForData);titleHead.clear();finalData.clear();}} catch (Exception e) {throw new RuntimeException("导出Excel 失败, 原因:" + e.getMessage());} finally {if (excelWriter != null) {excelWriter.finish();}}}*//*** 根据入参的类, 查找IService 中第一个泛型类型为入参类型的IService Bean* @param referenceType* @return*/private static <T> IService<T> getTargetIService(Class<T> referenceType) {Class targetClass = Arrays.stream(classesExtendsIService).filter(classExtendsIService -> ClassUtil.getTypeArgument(classExtendsIService).equals(referenceType)).findFirst().orElseThrow(() -> ExceptionUtil.wrapRuntime("没有对应的类!"));return (IService<T>) SpringUtil.getBean(targetClass);}}
public class CustomMergeStrategy implements RowWriteHandler {/*** 主键下标*/private Integer pkIndex;/*** 需要合并的列的下标集合*/private List<Integer> needMergeColumnIndex = new ArrayList<>();/*** DTO数据类型*/private Class<?> elementType;private Integer total;public CustomMergeStrategy(Class<?> elementType, Integer total) {this.elementType = elementType;this.total = total;}@Overridepublic void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer relativeRowIndex, Boolean isHead) {// 如果是标题,则直接返回if (isHead) {return;}// 获取当前sheetSheet sheet = writeSheetHolder.getSheet();if (null == pkIndex) {this.lazyInit(writeSheetHolder);}// 判断是否需要和上一行进行合并// 不能和标题合并,只能数据行之间合并if (row.getRowNum() <= 1) {return;}// 获取上一行数据Row lastRow = sheet.getRow(row.getRowNum() - 1);// 将本行和上一行是同一类型的数据(通过主键字段进行判断),则需要合并if (!lastRow.getCell(pkIndex).getStringCellValue().equalsIgnoreCase(row.getCell(pkIndex).getStringCellValue())|| row.getRowNum() == total) {int maxRow = sheet.getMergedRegions().stream().max(Comparator.comparingInt(CellRangeAddressBase::getLastRow)).orElse(new CellRangeAddress(0, 0, 0, 0)).getLastRow();needMergeColumnIndex.forEach(needMerIndex -> {int rowStart = maxRow + 1;int rowEnd = row.getRowNum() == total ? row.getRowNum() : row.getRowNum() - 1;if (rowEnd > rowStart) {sheet.addMergedRegionUnsafe(new CellRangeAddress(rowStart,rowEnd,needMerIndex,needMerIndex));}});}}/*** 初始化主键下标和需要合并字段的下标*/private void lazyInit(WriteSheetHolder writeSheetHolder) {// 获取当前sheetSheet sheet = writeSheetHolder.getSheet();// 获取标题行Row titleRow = sheet.getRow(0);// 获取DTO的类型Class<?> eleType = this.elementType;// 获取DTO所有的属性Field[] fields = eleType.getDeclaredFields();// 遍历所有的字段,因为是基于DTO的字段来构建excel,所以字段数 >= excel的列数Arrays.stream(fields).forEach(field -> {// 获取@ExcelProperty注解,用于获取该字段对应在excel中的列的下标ExcelProperty easyExcelAnno = field.getAnnotation(ExcelProperty.class);// 为空,则表示该字段不需要导入到excel,直接处理下一个字段if (null == easyExcelAnno) {return;}// 获取自定义的注解,用于合并单元格CustomMerge customMerge = field.getAnnotation(CustomMerge.class);// 没有@CustomMerge注解的默认不合并if (null == customMerge) {return;}for (int index = 0; index < fields.length; index++) {Cell theCell = titleRow.getCell(index);// 当配置为不需要导出时,返回的为null,这里作一下判断,防止NPEif (null == theCell) {continue;}// 将字段和excel的表头匹配上if (easyExcelAnno.value()[0].equalsIgnoreCase(theCell.getStringCellValue())) {if (customMerge.isPk()) {pkIndex = index;}if (customMerge.needMerge()) {needMergeColumnIndex.add(index);}}}});// 没有指定主键,则异常if (null == this.pkIndex) {throw new IllegalStateException("使用@CustomMerge注解必须指定主键");}}}
@Data
@ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER, wrapped = BooleanEnum.TRUE)
public class RiskAnnualExcel implements Serializable {@ExcelProperty("风险编号")@CustomMerge(needMerge = true, isPk = true)@ColumnWidth(15)@NotNullprivate String number;@ExcelProperty(value = "风险类别", converter = DictConverter.class)@DictType("risk-type")@CustomMerge(needMerge = true)@ColumnWidth(15)@NotNullprivate String type;@ExcelProperty("风险名称")@CustomMerge(needMerge = true)@ColumnWidth(15)@NotNullprivate String name;@ExcelProperty("风险描述")@CustomMerge(needMerge = true)@ColumnWidth(30)@ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.LEFT, verticalAlignment = VerticalAlignmentEnum.CENTER, wrapped = BooleanEnum.TRUE)@NotNullprivate String description;@ExcelProperty("可能造成的后果")@CustomMerge(needMerge = true)@ColumnWidth(15)@ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.LEFT, verticalAlignment = VerticalAlignmentEnum.CENTER, wrapped = BooleanEnum.TRUE)@NotNullprivate String consequence;@ExcelProperty(value = "风险等级", converter = DictConverter.class)@DictType("risk-level-for-company")@CustomMerge(needMerge = true)@ColumnWidth(15)@NotNullprivate String level;@ExcelProperty(value = "风险性质", converter = DictConverter.class)@DictType("risk-character")@CustomMerge(needMerge = true)@ColumnWidth(15)@NotNullprivate String character;@ExcelProperty(value = "风险主要防控措施")@ColumnWidth(80)@ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.LEFT, verticalAlignment = VerticalAlignmentEnum.CENTER, wrapped = BooleanEnum.TRUE)@NotNullprivate String precaution;@ExcelProperty(value = "措施等级", converter = DictConverter.class)@DictType("risk-precaution-level")@ColumnWidth(15)@NotNullprivate String precautionLevel;@ExcelProperty("风险认领领导")@ColumnWidth(20)private String leaders;@ExcelProperty("管控部门")@ColumnWidth(20)@NotNullprivate String deptsResponsible;@ExcelProperty("风险涉及单位")@ColumnWidth(20)private String deptsInvolved;@ExcelProperty("措施类型")@ColumnWidth(15)@NotNullprivate String typeMeasures;@ExcelProperty("措施类别")@ColumnWidth(15)@NotNullprivate String categoryMeasures;@ExcelProperty("预警条件")@CustomMerge(needMerge = true)@ColumnWidth(15)@NotNullprivate String warningConditions;@ExcelProperty("风险点")@CustomMerge(needMerge = true)@ColumnWidth(15)@NotNullprivate String riskPoints;@ExcelProperty("应急措施")@CustomMerge(needMerge = true)@ColumnWidth(15)@NotNullprivate String emergencyMeasure;@ExcelProperty("备注")@CustomMerge(needMerge = true)@ColumnWidth(15)private String remark;}

调用公共导出方法导出数据

ConditionDownloadUtil.
afterMultiQueryDownload(riskBankAnnual.getName(),excelList, RiskAnnualExcel.class, new CustomMergeStrategy(RiskAnnualExcel.class,excelList.size()), httpServletResponse);

相关文章:

easyexcel调用公共导出方法导出数据

easyexcel备忘 Slf4j public class ConditionDownloadUtil {//扫描在xboot 包下所有IService 接口的子类, 每次启动服务后, 重新扫描public final static Class[] classesExtendsIService ClassUtil.scanPackageBySuper("cn.exrick.xboot", IService.class).toArra…...

C语言插入排序算法及代码

一、原理 在待排序的数组里&#xff0c;从数组的第二个数字开始&#xff0c;通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。 二、代码部分 #include<stdio.h> #include<stdlib.h> int ma…...

2023年中国法拍房用户画像和数据分析

法拍房主要平台 法拍房主要平台有3家&#xff0c;分别是阿里、京东和北交互联平台。目前官方认定纳入网络司法拍卖的平台共有7家&#xff0c;其中阿里资产司法拍卖平台的挂拍量最大。 阿里法拍房 阿里法拍房数据显示2017年&#xff0c;全国法拍房9000套&#xff1b;2018年&a…...

Android 清除临时文件,清空缓存

python 代码&#xff1a; import os import shutil import tracebackdef delete_folder(path):if os.path.exists(path):print(f"删除文件夹: {path}")shutil.rmtree(path)print("删除完成")def delete_file(path):if os.path.exists(path):print(f"删…...

Guava限流神器:RateLimiter使用指南

1. 引言 可能有些小伙伴听到“限流”这个词就觉得头大&#xff0c;感觉像是一个既复杂又枯燥的话题。别急&#xff0c;小黑今天就要用轻松易懂的方式&#xff0c;带咱们一探RateLimiter的究竟。 想象一下&#xff0c;当你去超市排队结账时&#xff0c;如果收银台开得越多&…...

【六大排序详解】开篇 :插入排序 与 希尔排序

插入排序 与 希尔排序 六大排序之二 插入排序 与 希尔排序1 排序1.1排序的概念 2 插入排序2.1 插入排序原理2.2 排序步骤2.3 代码实现 3 希尔排序3.1 希尔排序原理3.2 排序步骤3.3 代码实现 4 时间复杂度分析 Thanks♪(&#xff65;ω&#xff65;)&#xff89;下一篇文章见&am…...

凸优化问题求解

这里写目录标题 1. 线性规划基本定理2.单纯形法2.1 转轴运算 3. 内点法3.1 线性规划的内点法 1. 线性规划基本定理 首先我们指出&#xff0c;线性规划均可等价地化成如下标准形式 { min ⁡ c T x , s . t A x b , x ⪰ 0 , \begin{align}\begin{cases}\min~c^Tx,\\\mathrm{s.…...

文件操作入门指南

目录 一、为什么使用文件 二、什么是文件 2.1 程序文件 2.2 数据文件 2.3 文件名 三、文件的打开和关闭 3.1 文件指针 3.2 文件的打开和关闭 四、文件的顺序读写 ​编辑 &#x1f33b;深入理解 “流”&#xff1a; &#x1f342;文件的顺序读写函数介绍&#xff1a; …...

Axure之交互与情节与一些实例

目录 一.交互与情节简介 二.ERP登录页到主页的跳转 三.ERP的菜单跳转到各个页面的跳转 四.省市联动 五.手机下拉加载 今天就到这里了&#xff0c;希望帮到你哦&#xff01;&#xff01;&#xff01; 一.交互与情节简介 "交互"通常指的是人与人、人与计算机或物体…...

【数据库设计和SQL基础语法】--连接与联接--多表查询与子查询基础(二)

一、子查询基础 1.1 子查询概述 子查询是指在一个查询语句内部嵌套另一个查询语句的过程。子查询可以嵌套在 SELECT、FROM、WHERE 或 HAVING 子句中&#xff0c;用于从数据库中检索数据或执行其他操作。子查询通常返回一个结果集&#xff0c;该结果集可以被包含它的主查询使用…...

Android studio中导入opencv库

具体opencv库的导入流程参考链接&#xff1a;Android Studio开发之路 &#xff08;五&#xff09;导入OpenCV以及报错解决 一、出现的错误&#xff1a;NullPointerException: Cannot invoke “java.io.File.toPath()” because “this.mySdkLocation” is null 解决办法&#…...

Linux(1)_基础知识

第一部分 一、Linux系统概述 创始人&#xff1a;芬兰大学大一的学生写的Linux内核&#xff0c;李纳斯托瓦兹。 Linux时unix的类系统&#xff1b; 特点&#xff1a;多用户 多线程的操作系统&#xff1b; 开源操作系统&#xff1b; 开源项目&#xff1a;操作系统&#xff0c;应用…...

网络相关面试题

简述 TCP 连接的过程&#xff08;淘系&#xff09; 参考答案&#xff1a; TCP 协议通过三次握手建立可靠的点对点连接&#xff0c;具体过程是&#xff1a; 首先服务器进入监听状态&#xff0c;然后即可处理连接 第一次握手&#xff1a;建立连接时&#xff0c;客户端发送 syn 包…...

Vue2面试题:说一下对跨域的理解?

http请求分为两大类&#xff1a;普通http请求&#xff08;如百度请求&#xff09;和ajax请求&#xff08;跨域是出现在ajax请求&#xff09; 同源策略&#xff1a;在浏览器发起ajax请求时&#xff0c;当前的网址和被请求的网址协议、域名、端口号必须完全一致&#xff0c;目的是…...

Axure中如何使用交互样式交互事件交互动作情形

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《产品经理如何画泳道图&流程图》 ⛺️ 越努力 &#xff0c;越幸运 目录 一、Axure中交互样式 1、什么是交互样式&#xff1f; 2、交互样式的作用&#xff1f; 3、Axure中如何…...

1112. 迷宫(DFS之连通性模型)

1112. 迷宫 - AcWing题库 一天Extense在森林里探险的时候不小心走入了一个迷宫&#xff0c;迷宫可以看成是由 n∗n 的格点组成&#xff0c;每个格点只有2种状态&#xff0c;.和#&#xff0c;前者表示可以通行后者表示不能通行。 同时当Extense处在某个格点时&#xff0c;他只…...

飞天使-k8s知识点1-kubernetes架构简述

文章目录 名词功能要点 k8s核心要素CNCF 云原生框架简介k8s组建介绍 名词 CI 持续集成, 自动化构建和测试&#xff1a;通过使用自动化构建工具和自动化测试套件&#xff0c;持续集成可以帮助开发人员自动构建和测试他们的代码。这样可以快速检测到潜在的问题&#xff0c;并及早…...

linux中deadline调度原理与代码注释

简介 deadline调度是比rt调度更高优先级的调度&#xff0c;它没有依赖于优先级的概念&#xff0c;而是给了每个实时任务一定的调度时间&#xff0c;这样的好处是&#xff1a;使多个实时任务场景的时间分配更合理&#xff0c;不让一些实时任务因为优先级低而饿死。deadline调度…...

jquery、vue、uni-app、小程序的页面传参方式

jQuery、Vue、Uni-app 和小程序&#xff08;例如微信小程序&#xff09;都有它们自己的页面传参方式。下面分别介绍这几种方式的页面传参方式&#xff1a; jQuery: 在jQuery中&#xff0c;页面传参通常是通过URL的查询参数来实现的。例如&#xff1a; <a href"page2…...

ModuleNotFoundError: No module named ‘openai.error‘

ModuleNotFoundError: No module named ‘openai.error’ result self.fn(*self.args, **self.kwargs) File “H:\chatGPTWeb\chatgpt-on-wechat\channel\chat_channel.py”, line 168, in _handle reply self._generate_reply(context) File “H:\chatGPTWeb\chatgpt-on-wec…...

理解pom.xml中的parent标签

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 循序渐进学SpringBoot ✨特色专栏&…...

element ui el-avatar 源码解析零基础逐行解析

avatar功能介绍 快捷配置头像的样式 avatar 的参数配置 属性说明参数size尺寸type string 类型 &#xff08;‘large’,‘medium’,‘small’&#xff09;number类型 validator 校验shape形状circle (原型) square&#xff08;方形&#xff09;icon传入的iconsrc传入的图片st…...

Linux下c语言实现动态库的动态调用

在Linux操作系统下&#xff0c;有时候需要在不重新编译程序的情况下&#xff0c;运行时动态地加载库&#xff0c;这时可以通过Linux操作系统提供的API可以实现&#xff0c;涉及到的API主要有dlopen、dlsym和dlclose。使用时&#xff0c;需要加上头文件#include <dlfcn.h>…...

为什么MCU在ADC采样时IO口有毛刺?

大家在使用MCU内部ADC进行信号采样一个静态电压时&#xff0c;可能在IO口上看到这样的波形。这个时候大家一般会认识是信号源有问题&#xff0c;但仔细观察会发现这个毛刺的频率是和ADC触发频率一样的。 那么为什么MCU在ADC采样时IO口会出现毛刺呢&#xff1f;这个毛刺对结果有…...

C# 将 Word 转化分享为电子期刊

目录 需求 方案分析 相关库引入 关键代码 Word 转 Pdf Pdf 转批量 Jpeg Jpeg 转为电子书 实现效果演示 小结 需求 曾经的一个项目&#xff0c;要求实现制作电子期刊定期发送给企业进行阅读&#xff0c;基本的需求如下&#xff1a; 1、由编辑人员使用 Microsoft Word…...

网络世界的黑暗角落:常见漏洞攻防大揭秘

网络世界的黑暗角落&#xff1a;常见漏洞攻防大揭秘 今天带来了网站常见的漏洞总结,大家在自己的服务器上也需要好好进行防护,密码不要过于简单.不然非常容易遭到攻击,最终达到不可挽回的损失.很多黑客想网络乞丐一样将你服务器打宕机,然后要求你进行付费.不知道大家有没有遇到…...

通信领域发展方向

5G网络技术&#xff1a;随着5G网络的建设和商用推广&#xff0c;各家运营商、厂商和研究机构都在探索5G技术的应用场景和解决方案&#xff0c;如网络切片、毫米波通信、多用户MIMO等。 物联网技术&#xff1a;物联网技术已经成为通信行业的重点发展领域&#xff0c;包括传感器…...

21 3GPP中 5G NR高速列车通信标准化

文章目录 信道模型实验——物理层设计相关元素μ(与子载波间隔有关)设计参考信号(DMRS) 本文提出初始接入、移动性管理、线性小区设计等高层技术。描述3GPP采用HST场景的评估参数&#xff0c;阐释了HST应用的物理层技术&#xff0c;包括数字通信和参考信号设计&#xff0c;链路…...

【网络安全】-Linux操作系统—CentOS安装、配置

文章目录 准备工作下载CentOS创建启动盘确保硬件兼容 安装CentOS启动安装程序分区硬盘网络和主机名设置开始安装完成安装 初次登录和配置更新系统安装额外的软件仓库安装网络工具配置防火墙设置SELinux安装文本编辑器配置SSH服务 总结 CentOS是一个基于Red Hat Enterprise Linu…...

CCNP课程实验-OSPF-CFG

目录 实验条件网络拓朴需求 配置实现基础配置1. 配置所有设备的IP地址 实现目标1. 要求按照下列标准配置一个OSPF网络。 路由协议采用OSPF&#xff0c;进程ID为89 &#xff0c;RID为loopback0地址。3. R4/R5/R6相连的三个站点链路OSPF网络类型配置成广播型&#xff0c;其中R5路…...

低价机票网站建设/百度竞价优化软件

sys.argv 命令行参数List&#xff0c;第一个元素是程序本身路径 sys.exit(n) 退出程序&#xff0c;正常退出时exit(0) sys.version 获取Python解释程序的版本信息 sys.maxint 最大的Int值 sys.path 返回模块的搜索路径&#xff0c;初始化时使用PYTHONPATH环境变量的值 sys.plat…...

wordpress主题列表封面/西安seo教程

我正在尝试平均化熊猫的一组数据。csv文件中的数据。我有一个系列节目叫“轨道”。在前面的阶段中&#xff0c;我使用了dropna()方法来删除在读取csv文件时导入的一些空白行。在我使用的方法是平均5行以上的列。我不能使用滚动平均法&#xff0c;因为我希望使用当前值之前的两行…...

做b2c网站多少钱/无人区在线观看高清1080

转载于:https://www.cnblogs.com/iamCarson/p/6102719.html...

湖南企业网站制作公司/网络营销的基本内容有哪些

它是一个可以完成工作的简约编辑器&#xff0c;并以隐藏的增强功能使得事情更简单。来源&#xff1a;https://linux.cn/article-12933-1.html作者&#xff1a;Seth Kenlon译者&#xff1a;geekpi&#xff08;本文字数&#xff1a;1972&#xff0c;阅读时长大约&#xff1a;3 分…...

网站建设基础教学设计/东莞网站公司哪家好

while 1:try:_ = input()nums = list(map(int, input().split()))w = int(input(...

上海网站建设企/网站优化方案范文

电脑蓝屏原因01软件兼容性问题引起电脑蓝屏刚安装的系统&#xff0c;若驱动与硬件不兼容可能会导致蓝屏现象&#xff0c;建议安装硬件赠送光盘中的驱动(要与所用操作系统相符)&#xff0c;且驱动没必要追求最新&#xff01;长时间使用电脑都没有出现蓝屏现象&#xff0c;而某天…...