easyExcel 导入、导出Excel 封装公共的方法

文档包含三部分功能

1、easyExcel 公共导出list<对象>方法,可以自定义excel中第一行和样式
2、easyExcel 导入逻辑,结合spring Validator 验证导入数据是否符合规范
3、easyExcel 自定义导出 list<map> 、 list<对象> (可优化),可把sql.date,sql.time在excel转换正常显示

1、easyExcel 公共导出方法

1)依赖:

<!-- hutool -->
<!-- 阿里开源的excel处理包 -->
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.3</version>
</dependency>
<!-- poi -->
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.0.0</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.0.0</version>
</dependency>

 2)封装的公共导出方法:

# 其中 templateBool 代表第一行是否为标题行
# 其中 firstRowContent 代码第一行写入的内容
FileUtil.exportExcel(response, "导出应用表列表", "sheet1", App.class, appList, templateBool,firstRowContent);

其中 App.class 实体类属性添加 @ExcelIgnore 忽略导出,@ExcelProperty("*excel列明") 指出导出列表

@ExcelIgnore
@ExcelProperty("*excel列明")

导出代码参考 

easyExcel自定义导入头实现icon-default.png?t=N7T8https://www.cnblogs.com/Dog1363786601/p/17352096.html

3)实现easyExcel 导入导出依赖公共文件方法

import cn.hutool.core.codec.Base64;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.util.IOUtils;
import org.springframework.web.multipart.MultipartFile;import java.io.*;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;/*** 项目名称:base** <p>功能: 功能描述。</p>** @author:yht* @version:V1.0 2023/5/30*/
@Slf4j
public class FileUtil {/*** 设置导出为excel 的 Response 中的描述** @param response    响应结果对象* @param rawFileName 文件名*/public static void setExcelResponse(HttpServletResponse response, String rawFileName) {//设置响应格式response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8"); // 设置字符编码// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系String fileName = Base64.encode(rawFileName, Charset.defaultCharset());response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");}/*** MultipartFile对象转成File对象** @param multipartFile* @return*/public static File transferToFile(MultipartFile multipartFile) {
//        选择用缓冲区来实现这个转换即使用java 创建的临时文件 使用 MultipartFile.transferto()方法 。File file = null;try {String originalFilename = multipartFile.getOriginalFilename();String[] filename = originalFilename.split("\\.");file = File.createTempFile(filename[0], filename[1] + ".");multipartFile.transferTo(file);file.deleteOnExit();} catch (IOException e) {e.printStackTrace();}return file;}/*** 断面数据导出Excel* <a href="https://www.cnblogs.com/Dog1363786601/p/17352096.html">EasyExcelSheetWriteHandler 参考:包含map导出样例</a>** @param response:response* @param fileName:文件名* @param sheetName:sheet              页签名称* @param targetClass:目标对象Class* @param dateList:对象数据* @param firstRowDocBool:第一行是不是填写文档说明* @param firstRowContent:第一行的内容*/public static void exportExcel(HttpServletResponse response, String fileName, String sheetName,Class<?> targetClass, List<?> dateList, Boolean firstRowDocBool, String firstRowContent) throws IOException {if (StrUtil.isBlank(fileName)) {//当前日期fileName = DateUtil.format(new DateTime(), DatePattern.CHINESE_DATE_TIME_FORMATTER);}setExcelResponse(response, fileName);// 设置表头字体样式WriteCellStyle headWriteCellStyle = new WriteCellStyle();WriteFont headWriteFont = new WriteFont();headWriteFont.setFontHeightInPoints((short) 12); // 设置字体大小为16headWriteCellStyle.setWriteFont(headWriteFont);headWriteCellStyle.setFillForegroundColor(IndexedColors.LIGHT_GREEN.getIndex());// 设置表头 和内容样式HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, (List<WriteCellStyle>) null);ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), targetClass).registerWriteHandler(new EasyExcelSheetWriteHandler(firstRowDocBool, firstRowContent)).registerWriteHandler(horizontalCellStyleStrategy).relativeHeadRowIndex(1).excelType(ExcelTypeEnum.XLSX).build();WriteSheet writeSheet = EasyExcel.writerSheet(0, sheetName).build();excelWriter.write(dateList, writeSheet);excelWriter.finish();}
}

 4)其中自定导入第一行 导入内容依赖类

import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;public class EasyExcelSheetWriteHandler implements SheetWriteHandler {/*** 首行是否为文档*/private final Boolean firstRowDocBool;/*** 填写文件说明*/private final String firstRowContent;public EasyExcelSheetWriteHandler(Boolean firstRowDocBool, String firstRowContent) {this.firstRowDocBool = firstRowDocBool;this.firstRowContent = firstRowContent;}@Overridepublic void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {Workbook workbook = writeWorkbookHolder.getWorkbook();//Sheet sheet = workbook.getSheetAt(0);Sheet sheet = workbook.getSheet(writeSheetHolder.getSheetName());Row row1 = sheet.getRow(0);if (row1 == null) {row1 = sheet.createRow(0);}row1.setHeight((short) 500);//25*20   实际行高*20Cell cell1 = row1.getCell(0);if (cell1 == null) {cell1 = row1.createCell(0);}cell1.setCellValue(firstRowContent);CellStyle cellStyle = workbook.createCellStyle();cellStyle.setVerticalAlignment(VerticalAlignment.BOTTOM);cellStyle.setFillBackgroundColor(IndexedColors.WHITE.getIndex());cellStyle.setBorderTop(BorderStyle.NONE);cellStyle.setBorderBottom(BorderStyle.NONE);cellStyle.setBorderLeft(BorderStyle.NONE);cellStyle.setBorderRight(BorderStyle.NONE);if (Boolean.TRUE.equals(firstRowDocBool)) {cellStyle.setAlignment(HorizontalAlignment.LEFT);} else {cellStyle.setAlignment(HorizontalAlignment.CENTER);}Font font = workbook.createFont();font.setBold(false);if (Boolean.TRUE.equals(firstRowDocBool)) {font.setFontName("宋体");font.setFontHeight((short) 220);//11*20   实际字号(字高)*20} else {font.setFontHeight((short) 360);//18*20   实际字号(字高)*20font.setFontName("黑体");}cellStyle.setFont(font);cell1.setCellStyle(cellStyle);sheet.addMergedRegionUnsafe(new CellRangeAddress(0, 0, 0, 15));}
}

2、easyExcel 导入逻辑

1)依赖于 fileutil,将  MultipartFile 转为file

File file = FileUtil.transferToFile(multipartFile);

2)拿到文件以后,导入实现逻辑如下 

EasyExcel.read(file, App.class, new ReadListener<App>() {//临时存储数据对象private final List<App> cachedDataList = ListUtils.newArrayList();@Overridepublic void invoke(App data, AnalysisContext context) {cachedDataList.add(data);}@Transactional@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {StringBuffer errorCheckMsg = new StringBuffer();AtomicBoolean isPass = new AtomicBoolean(true);if (CollUtil.isEmpty(cachedDataList)) {throw new CommonException("导入Excel列表为空");}//数据行是从第三行开始AtomicInteger rowIndex = new AtomicInteger(3);cachedDataList.forEach((app) -> {//spring validator 验证每行数据是否合规BindingResult result = new BeanPropertyBindingResult(app, "app");validator.validate(app, result);if (result.hasErrors()) {isPass.set(false);// 处理验证错误,例如返回错误消息errorCheckMsg.append("第").append(rowIndex).append("行:");StringBuilder sb = new StringBuilder();for (ObjectError error : result.getAllErrors()) {sb.append(error.getDefaultMessage()).append(";");}errorCheckMsg.append(sb).append("\n");}rowIndex.getAndIncrement();});if (isPass.get()) {//mybatis 插入数据方法saveBatch(cachedDataList);}if (!StrUtil.isEmpty(errorCheckMsg.toString())) {throw new CommonException(errorCheckMsg.toString());}}}).sheet().headRowNumber(2)//设置标题行的行号.doRead();

3、easyExcel 自定义 list<map> 导出

1)导出工具类的使用

/*** 导出采购订单列表*/@PreAuthorize("@ss.hasPermi('mes:ec:purorder:export')")@Log(title = "采购订单", businessType = BusinessType.EXPORT)@PostMapping("acsEnvMonitHis/export")public void export(BaseEntity baseEntity, HttpServletResponse response) throws IOException {String[][] headMap = {{"AA"}, {"BB"}, {"CC"}, {"DD"}};String[] dataStrMap = {"CC", "EE"};int[] witdhMap = {15, 20};List<Map<String, Object>> listDatas = 获取数据的service方法NoModelWriteData nmwDate = new NoModelWriteData();nmwDate.setFileName("历史生产数据");nmwDate.setHeadMap(headMap);nmwDate.setDataStrMap(dataStrMap);nmwDate.setWitdhArray(witdhMap);nmwDate.setDataList(listDatas);EasyExcelUtils.noModleExportExcel(nmwDate, response);}

2)依赖工具类:EasyExcelUtils

package com.hy.common.utils.poi;import cn.hutool.core.util.ArrayUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.converters.ConverterKeyBuild;
import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder;
import com.alibaba.excel.write.metadata.WriteSheet;
import org.apache.poi.util.IOUtils;
import org.springframework.web.bind.annotation.RequestBody;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;public class EasyExcelUtils {//不创建对象的导出public static void noModleExportExcel(@RequestBody NoModelWriteData data, HttpServletResponse response) throws IOException {response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系String fileName = URLEncoder.encode(data.getFileName(), "UTF-8");response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");OutputStream out = null;try {out = response.getOutputStream();// 这里需要设置不关闭流ExcelWriter excelWriter = EasyExcel.write(out).charset(StandardCharsets.UTF_8).build();SqlDateConverter converterSqlDate = new SqlDateConverter();excelWriter.writeContext().currentWriteHolder().converterMap().put(ConverterKeyBuild.buildKey(converterSqlDate.supportJavaTypeKey()), converterSqlDate);excelWriter.writeContext().currentWriteHolder().converterMap().put(ConverterKeyBuild.buildKey(converterSqlDate.supportJavaTypeKey(), converterSqlDate.supportExcelTypeKey()), converterSqlDate);ExcelWriterSheetBuilder writerSheetBuilder = EasyExcel.writerSheet();writerSheetBuilder.registerConverter(new SqlDateConverter());writerSheetBuilder.registerConverter(new SqlTimeConverter());if (ArrayUtil.isNotEmpty(data.getWitdhArray())) {writerSheetBuilder.registerWriteHandler(new ColumnWidthStyleStrategy(data.getWitdhArray()));}WriteSheet writeSheet = writerSheetBuilder.build();writeSheet.setHead(head(data.getHeadMap()));writeSheet.setSheetName(data.getFileName());excelWriter.write(dataList(data.getDataList(), data.getDataStrMap()), writeSheet);excelWriter.finish();} catch (Exception e) {throw e;} finally {IOUtils.closeQuietly(out);}}//创建对象的导出public <T> void simpleWrite(@RequestBody SimpleWriteData data, Class<T> clazz, HttpServletResponse response) throws IOException {// 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman//response.setContentType("application/vnd.ms-excel");response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系String fileName = URLEncoder.encode(data.getFileName(), "UTF-8");response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");EasyExcel.write(response.getOutputStream(), clazz).sheet(data.getFileName()).doWrite(data.getDataList());}//设置表头private static List<List<String>> head(String[][] headMap) {List<List<String>> list = new ArrayList<List<String>>();for (String[] headArray : headMap) {List<String> headList = new ArrayList<String>();for (String headStr : headArray) {headList.add(headStr);}list.add(headList);}return list;}//设置导出的数据内容private static List<List<Object>> dataList(List<Map<String, Object>> dataList, String[] dataStrMap) {List<List<Object>> list = new ArrayList<List<Object>>();for (Map<String, Object> map : dataList) {List<Object> data = new ArrayList<Object>();for (int i = 0; i < dataStrMap.length; i++) {data.add(map.get(dataStrMap[i]));}list.add(data);}return list;}
}

3)导出工具类、共依赖5个类,有不同作用,可根据实际情况删减

依赖3个类:2种参数,1个列宽策略

NoModelWriteData :导出数据,类型为List<MAP>
SimpleWriteData:导出数据,类型为List<对象>
ColumnWidthStyleStrategy:导出的列样式宽度策略

其中解决显示异常的数据类型依赖于2个类

SqlDateConverter :sqldate显示异常
SqlTimeConverter:sqltime显示异常
类1:NoModelWriteData :导出的第1种参数
import java.io.Serializable;
import java.util.Arrays;
import java.util.List;
import java.util.Map;public class NoModelWriteData implements Serializable {/** 文件名 **/private String fileName;/** 表头数组 **/private String[][] headMap;/** 对应数据字段数组 **/private String[] dataStrMap;/** 列宽数组 **/private int[] witdhArray;/** 数据集合 **/private List<Map<String, Object>> dataList;public String getFileName() {return fileName;}public void setFileName(String fileName) {this.fileName = fileName;}public String[][] getHeadMap() {return headMap;}public void setHeadMap(String[][] headMap) {this.headMap = headMap;}public String[] getDataStrMap() {return dataStrMap;}public void setDataStrMap(String[] dataStrMap) {this.dataStrMap = dataStrMap;}public int[] getWitdhArray() {return witdhArray;}public void setWitdhArray(int[] witdhArray) {this.witdhArray = witdhArray;}public List<Map<String, Object>> getDataList() {return dataList;}public void setDataList(List<Map<String, Object>> dataList) {this.dataList = dataList;}@Overridepublic String toString() {return "NoModelWriteData{" +"fileName='" + fileName + '\'' +", headMap=" + Arrays.toString(headMap) +", dataStrMap=" + Arrays.toString(dataStrMap) +", witdhArray=" + Arrays.toString(witdhArray) +", dataList=" + dataList +'}';}
}
类2:SimpleWriteData,导出的第2种参数
import java.io.Serializable;
import java.util.List;public class SimpleWriteData implements Serializable {/** 文件名 **/private String fileName;/** 数据列表 **/private List<?> dataList;public String getFileName() {return fileName;}public void setFileName(String fileName) {this.fileName = fileName;}public List<?> getDataList() {return dataList;}public void setDataList(List<?> dataList) {this.dataList = dataList;}@Overridepublic String toString() {return "SimpleWriteData{" +"fileName='" + fileName + '\'' +", dataList=" + dataList +'}';}
}
 类3:ColumnWidthStyleStrategy :列宽度策略设置
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.style.column.AbstractHeadColumnWidthStyleStrategy;import java.util.HashMap;
import java.util.Map;public class ColumnWidthStyleStrategy extends AbstractHeadColumnWidthStyleStrategy {private Map<Integer,Integer> columnWidth = new HashMap<>();public ColumnWidthStyleStrategy() {}public ColumnWidthStyleStrategy(int[] widthArray) {for (int i = 0; i < widthArray.length; i++) {columnWidth.put(i,widthArray[i]);}}@Overrideprotected Integer columnWidth(Head head, Integer columnIndex) {return columnWidth.getOrDefault(columnIndex,25);}
}
 类四:SqlDateConverter:为了 sql.date 类型在excel中显示正常
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
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.math.BigDecimal;
import java.sql.Date;
import java.text.ParseException;/*** Date and string converter** @author Jiaju Zhuang*/
public class SqlDateConverter implements Converter<Date> {@Overridepublic Class<?> supportJavaTypeKey() {return Date.class;}@Overridepublic CellDataTypeEnum supportExcelTypeKey() {return CellDataTypeEnum.STRING;}@Overridepublic Date convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty,GlobalConfiguration globalConfiguration) throws ParseException {switch (cellData.getType()) {case NUMBER:BigDecimal numberValue = cellData.getNumberValue();return new Date(numberValue.longValue());case STRING:String stringValue = cellData.getStringValue();if (StrUtil.isBlank(stringValue) || "NA".equals(stringValue)) {return null;}try {return new Date(DateUtil.parse(cellData.getStringValue()).getTime());} catch (NumberFormatException e) {return null;}default:return null;}}@Overridepublic WriteCellData<?> convertToExcelData(Date value, ExcelContentProperty contentProperty,GlobalConfiguration globalConfiguration) {if (contentProperty == null || contentProperty.getDateTimeFormatProperty() == null) {return new WriteCellData<>(DateUtil.formatDate(value));} else {return new WriteCellData<>(DateUtil.format(value, contentProperty.getDateTimeFormatProperty().getFormat()));}}
}
类五:SqlTimeConverter :为了 sql.time 类型在excel中显示正常
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
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.math.BigDecimal;
import java.sql.Time;
import java.text.ParseException;/*** Date and string converter** @author Jiaju Zhuang*/
public class SqlTimeConverter implements Converter<Time> {@Overridepublic Class<?> supportJavaTypeKey() {return Time.class;}@Overridepublic CellDataTypeEnum supportExcelTypeKey() {return CellDataTypeEnum.STRING;}@Overridepublic Time convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty,GlobalConfiguration globalConfiguration) throws ParseException {switch (cellData.getType()) {case NUMBER:BigDecimal numberValue = cellData.getNumberValue();return new Time(numberValue.longValue());case STRING:String stringValue = cellData.getStringValue();if (StrUtil.isBlank(stringValue) || "NA".equals(stringValue)) {return null;}try {return new Time(DateUtil.parseTime(cellData.getStringValue()).getTime());} catch (NumberFormatException e) {return null;}default:return null;}}@Overridepublic WriteCellData<?> convertToExcelData(Time value, ExcelContentProperty contentProperty,GlobalConfiguration globalConfiguration) {if (contentProperty == null || contentProperty.getDateTimeFormatProperty() == null) {return new WriteCellData<>(DateUtil.formatTime(value));} else {return new WriteCellData<>(DateUtil.format(value, contentProperty.getDateTimeFormatProperty().getFormat()));}}
}

4、你可能用到其他教程

1)poi 导出自定义样式excel

springboot、springmvc,excel上传解析、下载excel工具类_mediatype中适合excel-CSDN博客文章浏览阅读376次。工具类共7个方法: /** * 1)对外方法:解析上传的excel,只含一个sheet kly * @example: List strArrayList = ExcelUtil.getExcelData(MultipartFile); */ /** * 2)对外方法:获取第几个sheet页的数据..._mediatype中适合excel[]>https://blog.csdn.net/qq_26408545/article/details/103713665

2)poi 导出word

POI 导出横版A4word,并设置excel宽度(固定不变形)_a4 poi 宽度设置-CSDN博客文章浏览阅读2.6k次,点赞4次,收藏8次。1.maven依赖 org.apache.poipoi3.17 &_a4 poi 宽度设置https://blog.csdn.net/qq_26408545/article/details/110669104

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

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

相关文章

【论文阅读】Improved Denoising Diffusion Probabilistic Models

Improved Denoising Diffusion Probabilistic Models 文章目录 Improved Denoising Diffusion Probabilistic Models概述Improving the Log-likelihoodLearning ∑ θ ( x t , t ) \sum_{\theta}(x_{t}, t) ∑θ​(xt​,t)Improving the Noise ScheduleReducing Gradient Nois…

Kotlin 中List,Set,Map的创建与使用

目录 1. List 的使用 1.1 不可变 List 1.2 可变 List 2. Set 的使用 2.1 不可变 Set 2.2 可变 Set 3. Map 的使用 3.1 不可变Map 3.2 可变Map 本篇主要为已经有Java基础的同学展示Kotlin语言中的List&#xff0c;Set&#xff0c;Map的创建和使用&#xff0c;所以Java代…

【小白刷leetcode】第15题

【小白刷leetcode】第15题 动手刷leetcode&#xff0c;正在准备蓝桥&#xff0c;但是本人算法能力一直是硬伤。。。所以做得一直很痛苦。但是不熟练的事情像练吉他一样&#xff0c;就需要慢速&#xff0c;多练。 题目描述 看这个题目&#xff0c;说实在看的不是很懂。索性我们直…

uniapp 对video视频组件嵌套倍速按钮

这次接了需求是要求有倍速功能&#xff0c;去看了文档发现并没有倍速按钮的属性&#xff0c;想着手写一个吧 可最后发现原生层级太高&#xff0c;无论怎么样都迭不上去&#xff0c;就只能去找插件看看咯 找了好多插件发现都不可用&#xff0c;因为我这是app端&#xff0c;有些视…

Vue组件中引入jQuery

两种在vue中引入jQuery的方式 1、普通html中使用jQuery 将jQuer的文件导入到项目中&#xff0c;然后直接使用<script src"jQuery.js"></script>即可。 <script src"jQuery.js"></script> 2、vue组件中使用jQuery 安装依赖 c…

C语言数据结构基础笔记——树、二叉树简介

1.树 树是一种 非线性 的数据结构&#xff0c;它是由 n &#xff08; n>0 &#xff09;个有限结点组成一个具有层次关系的集合。 把它叫做树是因 为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 &#xff08;图片来源于网络&#xff09;…

【OJ】string类题目

个人主页 &#xff1a; zxctscl 如有转载请先通知 题目 1. 415字符串相加1.1 分析1.2 代码 2. 344反转字符串2.1 分析2.2 代码 3. HJ1字符串最后一个单词的长度3.1 分析3.2 代码 4. 387.字符串中的第一个唯一字符4.1 分析4.2 代码 5. 125验证回文串5.1 分析5.2 代码 1. 415字符…

wordpress被恶意搜索攻击(网址/?s=****)解决方法。

源地址&#xff1a;https://www.ctvol.com/seoomethods/1413686.html 什么叫恶意搜索攻击&#xff1f; wordpress恶意搜索攻击并不是像病毒一样的攻击&#xff0c;而是一种seo分支黑帽手段&#xff0c;通过被攻击网站搜索功能中长尾关键词来实现攻击&#xff0c;通过网址不断…

【LeetCode热题100】146. LRU 缓存(链表)

一.题目要求 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0c…

Jenkins插件Parameterized Scheduler用法

Jenkins定时触发构建的同时设定参数。可以根据不同的定时构建器设置不同参数或环境变量的值。可以设置多个参数。并结合when控制stage流程的执行。结合when和triggeredBy区分定时构建的stage和手动执行的stage。 目录 什么是Parameterized Scheduler&#xff1f;如何配置实现呢…

代码随想录训练营Day24:● 理论基础 ● 77. 组合

理论基础 回溯算法解决的问题 回溯法&#xff0c;一般可以解决如下几种问题&#xff1a; 组合问题&#xff1a;N个数里面按一定规则找出k个数的集合 切割问题&#xff1a;一个字符串按一定规则有几种切割方式 子集问题&#xff1a;一个N个数的集合里有多少符合条件的子集 排列…

yolo项目中如何训练自己的数据集

1.收集自己需要标注的图片 2.打开网站在线标注网站 2.1 点击右下角Get Start 2.2点击这里上传自己的图片 上传成功后有英文的显示 点击左边的Object Detection&#xff0c;表示用于目标检测 2.3选择新建标签还是从本地加载标签 如果是本地加载标签&#xff08;左边&#…

基本常用函数help()

Python内置函数 help()函数&#xff1a;查看对象的帮助信息 print()函数&#xff1a;用于打印输出 input()函数&#xff1a;根据输入内容返回所输入的字符串类型 format()函数&#xff1a;格式化显示 len()函数&#xff1a;返回对象的长度或项目个数 slice()函数&#xf…

26-Java访问者模式 ( Visitor Pattern )

Java访问者模式 摘要实现范例 访问者模式&#xff08;Visitor Pattern&#xff09;使用了一个访问者类&#xff0c;它改变了元素类的执行算法&#xff0c;通过这种方式&#xff0c;元素的执行算法可以随着访问者改变而改变访问者模式中&#xff0c;元素对象已接受访问者对象&a…

TouchGFX之MVP

TouchGFX用户接口遵循Model-View-Presenter&#xff08;MVP&#xff09;架构模式&#xff0c;它是Model-View-Controller&#xff08;MVC&#xff09;模式的派生模式。 两者都广泛用于构建用户接口应用。 MVP模式的主要优势是&#xff1a; 关注点分离&#xff1a;将代码分成不…

mysql 排序底层原理解析

前言 本章详细讲下排序&#xff0c;排序在我们业务开发非常常见&#xff0c;有对时间进行排序&#xff0c;又对城市进行排序的。不合适的排序&#xff0c;将对系统是灾难性的&#xff0c;这个不是危言耸听。可能有些人会想&#xff0c;对于排序mysql 是怎么实现的&#xff0c;…

Android 地图SDK 绘制点 删除 指定

问题 Android 地图SDK 删除指定绘制点 详细问题 笔者进行Android 项目开发&#xff0c;对于已标记的绘制点&#xff0c;提供撤回按钮&#xff0c;即删除绘制点&#xff0c;如何实现。 解决方案 新增绘制点 private List<Marker> markerList new ArrayList<>…

Oracle数据库:使用 bash脚本 + 定时任务 自动备份数据

Oracle数据库&#xff1a;使用 bash脚本 定时任务 自动备份数据 1、前言2、为什么需要自动化备份&#xff1f;3、编写备份脚本4、备份脚本授权5、添加定时任务6、重启 crond / 检查 crond 服务状态7、备份文件检查 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收…

AI赋能写作:AI大模型高效写作一本通

❤️作者主页&#xff1a;小虚竹 ❤️作者简介&#xff1a;大家好,我是小虚竹。2022年度博客之星评选TOP 10&#x1f3c6;&#xff0c;Java领域优质创作者&#x1f3c6;&#xff0c;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;掘金年度人气作…

Java学习笔记(15)

JDK7前时间相关类 Date时间类 Simpledateformat Format 格式化 Parse 解析 默认格式 指定格式 EE&#xff1a;表示周几 Parse&#xff1a;把字符串时间转成date对象 注意&#xff1a;创建对象的格式要和字符串的格式一样 Calendar日历类 不能创建对象 Getinstance 获取当…