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代…

CentOS安装MySQL详细教程

1.下载 MySQL yum包 wget http://repo.mysql.com/mysql57-community-release-el7-10.noarch.rpm 2.安装MySQL源 rpm -Uvh mysql57-community-release-el7-10.noarch.rpm 3.安装MySQL服务端 yum install -y mysql-community-server 4.启动MySQL systemctl start mysqld.service …

flink重温笔记(十八): flinkSQL 顶层 API ——时态表实现表数据动态变化(涵盖全面实用的 API )

Flink学习笔记 前言&#xff1a;今天是学习 flink 的第 18 天啦&#xff01;很多小伙伴私信说&#xff0c;自己只会SQL语法来编写flinkSQL&#xff0c;如何使用代码来操作呢&#xff1f;因为工作中都是要用到代码编写的。还有小伙伴说&#xff0c;想要实现表是动态变化的&#…

【小白刷leetcode】第15题

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

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

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

mysql笔记:15. 事务和锁

文章目录 一、事务概述二、事务基本操作三、事务保存点四、事务的隔离级别1. READ UNCOMMITTED设置事务的隔离级别 2. READ COMMITTED3. REPEATABLE READ4. SERIALIZABLE 五、MySQL的锁InnoDB的锁类型1. InnoDB的行级锁2. InnoDB的表级锁 死锁 在开发过程中&#xff0c;我们经常…

配置服务器SSH

在终端中&#xff0c;运行以下命令以检查SSH服务器的状态&#xff1a; sudo service ssh status安装SSH服务器。您可以运行以下命令来安装OpenSSH服务器&#xff0c;这是SSH服务的一个流行实现&#xff1a; sudo apt install openssh-server如果SSH服务器正在运行&#xff0c…

Acwing100 --- 增减序列(差分)

给定一个长度为 n 的数列 a1,a2,…,an&#xff0c;每次可以选择一个区间 [l,r]&#xff0c;使下标在这个区间内的数都加一或者都减一。 求至少需要多少次操作才能使数列中的所有数都一样&#xff0c;并求出在保证最少次数的前提下&#xff0c;最终得到的数列可能有多少种。 输入…

记录些实际应用开发过程中的prompt

Text2SQL 假设你是{dbType}的专家&#xff0c;需要通过问题描述和指令语句两部分内容帮忙生成对应查询SQL语句。第一部分问题说明&#xff1a; {queryContent} 第二部分指令内容&#xff1a; 1&#xff0c;不能幻觉出现新的字段&#xff0c;schema字段、表名称、表字段名称必须…

Vue组件中引入jQuery

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

KGCN---pytorch代码(2)---aggregator

代码&#xff1a; import torch import torch.nn.functional as Fclass Aggregator(torch.nn.Module):Aggregator classMode in [sum, concat, neighbor]#最后一个 neighbor 的聚合器直接就是利用邻域表示来代替 v 结点的表示def __init__(self, batch_size, dim, aggregator)…

vue组件基础及注册

1、组件的命名 kebab-case&#xff08;短横线&#xff09;命名法&#xff1a;字母全小写且必须包含一个连字符&#xff1b;例&#xff1a;my-component-namePascalCase&#xff08;帕斯卡&#xff09;命名法&#xff1a;首字符大写&#xff1b;例&#xff1a;MyComponentName …

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字符…

【python小技能】使用Python发送电子邮件的完整指南(适合零基础)

前言 在现代通信中&#xff0c;电子邮件是一种不可或缺的工具。使用Python编程语言&#xff0c;我们可以轻松地编写代码来发送电子邮件。本文将为零基础的读者提供一个完整的指南&#xff0c;教你如何使用Python发送电子邮件 安装库 首先&#xff0c;我们需要安装smtplib库。…

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

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

Clickhouse MergeTree原理(二)—— 表和分区的维护

作者&#xff1a;俊达 引言 MergeTree是Clickhouse中最核心的存储引擎。上一篇文章中&#xff0c;我们介绍了MergeTree的基本结构。 1、MergeTree由分区&#xff08;partiton&#xff09;和part组成。 2、Part是MergeTree可操作的基本数据单元。 当插入数据时&#xff0c;会…

MySQL 中的“两阶段提交”机制

在MySQL数据库中&#xff0c;为了确保redo log&#xff08;重做日志&#xff09;和binlog&#xff08;二进制日志&#xff09;之间的数据安全性和一致性&#xff0c;引入了“两阶段提交”这一重要概念。MySQL将redo log的写入过程细分为“prepare”和“commit”两个步骤&#x…

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

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