EasyExcel是一款阿里开源的一款非常优秀Excel导入导出工具,使用内存小,处理速度快,使用方便,正好最近项目中有用到多个excel导出下载的功能,便记录下

EasyExcel使用git地址:GitHub - alibaba/easyexcel: 快速、简洁、解决大文件内存溢出的java处理Excel工具​​​​​​https://github.com/alibaba/easyexcel

1. 首先导出pom依赖

        <!--poi工具--><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>${poi.version}</version></dependency><!--easyexcel工具--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version></dependency><!--hutool工具--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>${hutool.version}</version></dependency><!--lombok工具--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>

2. 添加使用的工具类

@Slf4j
public class ExcelBigNumberConvert implements Converter<Long> {@Overridepublic Class<Long> supportJavaTypeKey() {return Long.class;}@Overridepublic CellDataTypeEnum supportExcelTypeKey() {return CellDataTypeEnum.STRING;}@Overridepublic Long convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {return Convert.toLong(cellData.getData());}@Overridepublic WriteCellData<Object> convertToExcelData(Long object, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {if (ObjectUtil.isNotNull(object)) {String str = Convert.toStr(object);if (str.length() > 15) {return new WriteCellData<>(str);}}WriteCellData<Object> cellData = new WriteCellData<>(new BigDecimal(object));cellData.setType(CellDataTypeEnum.NUMBER);return cellData;}}
@AllArgsConstructor
@Slf4j
public class CellMergeStrategy extends AbstractMergeStrategy {private List<?> list;private boolean hasTitle;@Overrideprotected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {List<CellRangeAddress> cellList = handle(list, hasTitle);// judge the list is not nullif (CollectionUtils.isNotEmpty(cellList)) {// the judge is necessaryif (cell.getRowIndex() == 1 && cell.getColumnIndex() == 0) {for (CellRangeAddress item : cellList) {sheet.addMergedRegion(item);}}}}@SneakyThrowsprivate static List<CellRangeAddress> handle(List<?> list, boolean hasTitle) {List<CellRangeAddress> cellList = new ArrayList<>();if (CollectionUtils.isEmpty(list)) {return cellList;}Class<?> clazz = list.get(0).getClass();Field[] fields = clazz.getDeclaredFields();// 有注解的字段List<Field> mergeFields = new ArrayList<>();List<Integer> mergeFieldsIndex = new ArrayList<>();for (int i = 0; i < fields.length; i++) {Field field = fields[i];if (field.isAnnotationPresent(CellMerge.class)) {CellMerge cm = field.getAnnotation(CellMerge.class);mergeFields.add(field);mergeFieldsIndex.add(cm.index() == -1 ? i : cm.index());}}// 行合并开始下标int rowIndex = hasTitle ? 1 : 0;Map<Field, RepeatCell> map = new HashMap<>();// 生成两两合并单元格for (int i = 0; i < list.size(); i++) {for (int j = 0; j < mergeFields.size(); j++) {Field field = mergeFields.get(j);String name = field.getName();String methodName = "get" + name.substring(0, 1).toUpperCase() + name.substring(1);Method readMethod = clazz.getMethod(methodName);Object val = readMethod.invoke(list.get(i));int colNum = mergeFieldsIndex.get(j);if (!map.containsKey(field)) {map.put(field, new RepeatCell(val, i));} else {RepeatCell repeatCell = map.get(field);Object cellValue = repeatCell.getValue();if (cellValue == null || "".equals(cellValue)) {// 空值跳过不合并continue;}if (cellValue != val) {if (i - repeatCell.getCurrent() > 1) {cellList.add(new CellRangeAddress(repeatCell.getCurrent() + rowIndex, i + rowIndex - 1, colNum, colNum));}map.put(field, new RepeatCell(val, i));} else if (i == list.size() - 1) {if (i > repeatCell.getCurrent()) {cellList.add(new CellRangeAddress(repeatCell.getCurrent() + rowIndex, i + rowIndex, colNum, colNum));}}}}}return cellList;}@Data@AllArgsConstructorstatic class RepeatCell {private Object value;private int current;}
}

@Slf4j
@NoArgsConstructor
public class DefaultExcelListener<T> extends AnalysisEventListener<T> implements ExcelListener<T> {/*** 是否Validator检验,默认为是*/private Boolean isValidate = Boolean.TRUE;/*** excel 表头数据*/private Map<Integer, String> headMap;/*** 导入回执*/private ExcelResult<T> excelResult;public DefaultExcelListener(boolean isValidate) {this.excelResult = new DefautExcelResult<>();this.isValidate = isValidate;}/*** 处理异常** @param exception ExcelDataConvertException* @param context   Excel 上下文*/@Overridepublic void onException(Exception exception, AnalysisContext context) throws Exception {String errMsg = null;if (exception instanceof ExcelDataConvertException) {// 如果是某一个单元格的转换异常 能获取到具体行号ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException) exception;Integer rowIndex = excelDataConvertException.getRowIndex();Integer columnIndex = excelDataConvertException.getColumnIndex();errMsg = StrUtil.format("第{}行-第{}列-表头{}: 解析异常<br/>",rowIndex + 1, columnIndex + 1, headMap.get(columnIndex));if (log.isDebugEnabled()) {log.error(errMsg);}}if (exception instanceof ConstraintViolationException) {ConstraintViolationException constraintViolationException = (ConstraintViolationException) exception;Set<ConstraintViolation<?>> constraintViolations = constraintViolationException.getConstraintViolations();String constraintViolationsMsg = constraintViolations.stream().map(ConstraintViolation::getMessage).collect(Collectors.joining(", "));errMsg = StrUtil.format("第{}行数据校验异常: {}", context.readRowHolder().getRowIndex() + 1, constraintViolationsMsg);if (log.isDebugEnabled()) {log.error(errMsg);}}excelResult.getErrorList().add(errMsg);throw new ExcelAnalysisException(errMsg);}@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {this.headMap = headMap;//log.debug("解析到一条表头数据: {}", JsonUtils.toJsonString(headMap));}@Overridepublic void invoke(T data, AnalysisContext context) {if (isValidate) {ValidatorUtils.validate(data);}excelResult.getList().add(data);}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {log.debug("所有数据解析完成!");}@Overridepublic ExcelResult<T> getExcelResult() {return excelResult;}}

public interface ExcelListener<T> extends ReadListener<T> {ExcelResult<T> getExcelResult();}
public interface ExcelResult<T> {/*** 对象列表*/List<T> getList();/*** 错误列表*/List<String> getErrorList();/*** 导入回执*/String getAnalysis();
}

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class FileUtils extends FileUtil {/*** 下载文件名重新编码** @param response     响应对象* @param realFileName 真实文件名*/public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) throws UnsupportedEncodingException {String percentEncodedFileName = percentEncode(realFileName);StringBuilder contentDispositionValue = new StringBuilder();contentDispositionValue.append("attachment; filename=").append(percentEncodedFileName).append(";").append("filename*=").append("utf-8''").append(percentEncodedFileName);response.addHeader("Access-Control-Expose-Headers", "Content-Disposition,download-filename");response.setHeader("Content-disposition", contentDispositionValue.toString());response.setHeader("download-filename", percentEncodedFileName);}/*** 百分号编码工具方法** @param s 需要百分号编码的字符串* @return 百分号编码后的字符串*/public static String percentEncode(String s) throws UnsupportedEncodingException {String encode = URLEncoder.encode(s, StandardCharsets.UTF_8.toString());return encode.replaceAll("\\+", "%20");}
}
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.resource.ClassPathResource;
import cn.hutool.core.util.IdUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.fill.FillConfig;
import com.alibaba.excel.write.metadata.fill.FillWrapper;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import com.ruoyi.common.convert.ExcelBigNumberConvert;
import com.ruoyi.common.excel.CellMergeStrategy;
import com.ruoyi.common.excel.DefaultExcelListener;
import com.ruoyi.common.excel.ExcelListener;
import com.ruoyi.common.excel.ExcelResult;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.file.FileUtils;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.Collection;
import java.util.List;
import java.util.Map;/*** Excel处理工具类*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class ExcelUtil {/*** 同步导入(适用于小数据量)** @param is 输入流* @return 转换后集合*/public static <T> List<T> importExcel(InputStream is, Class<T> clazz) {return EasyExcel.read(is).head(clazz).autoCloseStream(false).sheet().doReadSync();}/*** 使用校验监听器 异步导入 同步返回** @param is         输入流* @param clazz      对象类型* @param isValidate 是否 Validator 检验 默认为是* @return 转换后集合*/public static <T> ExcelResult<T> importExcel(InputStream is, Class<T> clazz, boolean isValidate) {DefaultExcelListener<T> listener = new DefaultExcelListener<>(isValidate);EasyExcel.read(is, clazz, listener).sheet().doRead();return listener.getExcelResult();}/*** 使用自定义监听器 异步导入 自定义返回** @param is       输入流* @param clazz    对象类型* @param listener 自定义监听器* @return 转换后集合*/public static <T> ExcelResult<T> importExcel(InputStream is, Class<T> clazz, ExcelListener<T> listener) {EasyExcel.read(is, clazz, listener).sheet().doRead();return listener.getExcelResult();}/*** 导出excel** @param list      导出数据集合* @param sheetName 工作表的名称* @param clazz     实体类* @param response  响应体*/public static <T> void exportExcel(List<T> list, String sheetName, Class<T> clazz, HttpServletResponse response) {exportExcel(list, sheetName, clazz, false, response);}/*** 导出excel** @param list      导出数据集合* @param sheetName 工作表的名称* @param clazz     实体类* @param merge     是否合并单元格* @param response  响应体*/public static <T> void exportExcel(List<T> list, String sheetName, Class<T> clazz, boolean merge, HttpServletResponse response) {try {resetResponse(sheetName, response);ServletOutputStream os = response.getOutputStream();ExcelWriterSheetBuilder builder = EasyExcel.write(os, clazz).autoCloseStream(false)// 自动适配.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())// 大数值自动转换 防止失真.registerConverter(new ExcelBigNumberConvert()).sheet(sheetName);if (merge) {// 合并处理器builder.registerWriteHandler(new CellMergeStrategy(list, true));}builder.doWrite(list);} catch (IOException e) {throw new RuntimeException("导出Excel异常");}}/*** 单表多数据模板导出 模板格式为 {.属性}* {属性}直接填充单个值* {.属性}填充的为list** @param filename     文件名* @param templatePath 模板路径 resource 目录下的路径包括模板文件名*                     例如: excel/temp.xlsx*                     重点: 模板文件必须放置到启动类对应的 resource 目录下* @param data         模板需要的数据*/public static void exportTemplate(List<Object> data, String filename, String templatePath, HttpServletResponse response) {try {resetResponse(filename, response);ClassPathResource templateResource = new ClassPathResource(templatePath);ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(templateResource.getStream()).autoCloseStream(false)// 大数值自动转换 防止失真.registerConverter(new ExcelBigNumberConvert()).build();WriteSheet writeSheet = EasyExcel.writerSheet().build();if (CollUtil.isEmpty(data)) {throw new IllegalArgumentException("数据为空");}// 单表多数据导出 模板格式为 {.属性}for (Object d : data) {excelWriter.fill(d, writeSheet);}excelWriter.finish();} catch (IOException e) {throw new RuntimeException("导出Excel异常");}}/*** 多表多数据模板导出 模板格式为 {key.属性}* {属性}直接填充单个值* {.属性}填充的为list** @param filename     文件名* @param templatePath 模板路径 resource 目录下的路径包括模板文件名*                     例如: excel/temp.xlsx*                     重点: 模板文件必须放置到启动类对应的 resource 目录下* @param data         模板需要的数据*/public static void exportTemplateMultiList(Map<String, Object> data, String filename, String templatePath, HttpServletResponse response) {try {resetResponse(filename, response);ClassPathResource templateResource = new ClassPathResource(templatePath);ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(templateResource.getStream()).autoCloseStream(false)// 大数值自动转换 防止失真.registerConverter(new ExcelBigNumberConvert()).build();WriteSheet writeSheet = EasyExcel.writerSheet().build();if (CollUtil.isEmpty(data)) {throw new IllegalArgumentException("数据为空");}for (Map.Entry<String, Object> map : data.entrySet()) {// 设置列表后续还有数据FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();if (map.getValue() instanceof Collection) {// 多表导出必须使用 FillWrapperexcelWriter.fill(new FillWrapper(map.getKey(), (Collection<?>) map.getValue()), fillConfig, writeSheet);} else {excelWriter.fill(map.getValue(), writeSheet);}}excelWriter.finish();} catch (IOException e) {throw new RuntimeException("导出Excel异常");}}/*** 单表数据多excel导出打包为zip 模板格式为 {key.属性}* {属性}直接填充单个值* {.属性}填充的为list** @param filename     文件名* @param templatePath 模板路径 resource 目录下的路径包括模板文件名*                     例如: excel/导出使用的模板.xlsx*                     重点: 模板文件必须放置到启动类对应的 resource 目录下* @param data         模板需要的数据*/public static void exportTemplateZip(Map<String, Object> objects, String excelName, String templateNamePath, HttpServletResponse response) throws Exception {// 这里URLEncoder.encode可以防止中文乱码String zipFileName = URLEncoder.encode("导出zip包名", "UTF-8");response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + zipFileName + ".zip");response.setContentType("application/x-msdownload");response.setCharacterEncoding("utf-8");ClassPathResource templateResource = new ClassPathResource(templateNamePath);//开始存入try (ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream())) {List<PerformanceAppraisal> performanceAppraisals = appraisalMapper.selectList(new LambdaQueryWrapper<PerformanceAppraisal>().eq(PerformanceAppraisal::getGradeStatus, ScoreStatus.FIN.getCode()));if (CollectionUtil.isEmpty(performanceAppraisals)) {throw new RuntimeException("暂无打分数据生成!");}for (PerformanceAppraisal performanceAppraisal : performanceAppraisals) {ByteArrayOutputStream outputStream = new ByteArrayOutputStream();ExcelWriter excelWriter = EasyExcel.write(outputStream).withTemplate(templateResource.getStream()).build();zipOut.putNextEntry(new ZipEntry(IdUtil.fastSimpleUUID()+excelName));//开始写入excelWriteSheet writeSheet = EasyExcel.writerSheet().build();if (CollUtil.isEmpty(objects)) {throw new IllegalArgumentException("数据为空");}// 单表多数据导出 模板格式为 {.属性}for (Object d : objects) {excelWriter.fill(d, writeSheet);}excelWriter.finish();outputStream.writeTo(zipOut);zipOut.closeEntry();}} catch (Exception e) {// 重置responseresponse.reset();response.setContentType("application/json");response.setCharacterEncoding("utf-8");response.getWriter().println("下载文件失败" + e.getMessage());}}/*** 重置响应体*/private static void resetResponse(String sheetName, HttpServletResponse response) throws UnsupportedEncodingException {String filename = encodingFilename(sheetName);response.reset();FileUtils.setAttachmentResponseHeader(response, filename);response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8");}/*** 导出文件名*/public static String encodingFilename(String filename) {return IdUtil.fastSimpleUUID() + "_" + filename + ".xlsx";}}

3. 添加导出模板,注意一定要添加在resource下面!!

  • 单表导出模板     
  • 多表导出模板   
  • 单表数据打包模板(和单表的模板是一样的,同理,也可以多表打包导出)    

4. 测试excelUtil工具类以及导出结果

import cn.hutool.core.collection.CollUtil;
import com.包名.ExcelUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** 测试Excel功能** @author lgd*/
@Api(value = "测试Excel功能", tags = {"测试Excel功能"})
@RestController
@RequestMapping("/demo/excel")
public class TestExcelController {/*** 单列表多数据*/@ApiOperation(value = "单列表多数据")@GetMapping("/exportTemplateOne")public void exportTemplateOne(HttpServletResponse response) {Map<String,String> map = new HashMap<>();map.put("title","单列表多数据");map.put("test1","数据测试1");map.put("test2","数据测试2");map.put("test3","数据测试3");map.put("test4","数据测试4");map.put("testTest","666");List<TestObj> list = new ArrayList<>();list.add(new TestObj("单列表测试1", "列表测试1", "列表测试2", "列表测试3", "列表测试4"));list.add(new TestObj("单列表测试2", "列表测试5", "列表测试6", "列表测试7", "列表测试8"));list.add(new TestObj("单列表测试3", "列表测试9", "列表测试10", "列表测试11", "列表测试12"));ExcelUtil.exportTemplate(CollUtil.newArrayList(map,list),"单列表.xlsx", "excel/单列表.xlsx", response);}/*** 多列表多数据*/@ApiOperation(value = "多列表多数据")@GetMapping("/exportTemplateMuliti")public void exportTemplateMuliti(HttpServletResponse response) {Map<String,String> map = new HashMap<>();map.put("title1","标题1");map.put("title2","标题2");map.put("title3","标题3");map.put("title4","标题4");map.put("author","lgd");List<TestObj1> list1 = new ArrayList<>();list1.add(new TestObj1("list1测试1", "list1测试2", "list1测试3"));list1.add(new TestObj1("list1测试4", "list1测试5", "list1测试6"));list1.add(new TestObj1("list1测试7", "list1测试8", "list1测试9"));List<TestObj1> list2 = new ArrayList<>();list2.add(new TestObj1("list2测试1", "list2测试2", "list2测试3"));list2.add(new TestObj1("list2测试4", "list2测试5", "list2测试6"));List<TestObj1> list3 = new ArrayList<>();list3.add(new TestObj1("list3测试1", "list3测试2", "list3测试3"));List<TestObj1> list4 = new ArrayList<>();list4.add(new TestObj1("list4测试1", "list4测试2", "list4测试3"));list4.add(new TestObj1("list4测试4", "list4测试5", "list4测试6"));list4.add(new TestObj1("list4测试7", "list4测试8", "list4测试9"));list4.add(new TestObj1("list4测试10", "list4测试11", "list4测试12"));Map<String,Object> multiListMap = new HashMap<>();multiListMap.put("map",map);multiListMap.put("data1",list1);multiListMap.put("data2",list2);multiListMap.put("data3",list3);multiListMap.put("data4",list4);ExcelUtil.exportTemplateMultiList(multiListMap, "多列表.xlsx", "excel/多列表.xlsx", response);}/*** 单列表多数据*/@ApiOperation(value = "测试单表数据打包zip")@GetMapping("/exportTemplateZip")public void exportTemplateZip(HttpServletResponse response) {Map<String,String> map = new HashMap<>();map.put("title","单列表多数据");map.put("test1","数据测试1");map.put("test2","数据测试2");map.put("test3","数据测试3");map.put("test4","数据测试4");map.put("testTest","666");List<TestObj> list = new ArrayList<>();list.add(new TestObj("单列表测试1", "列表测试1", "列表测试2", "列表测试3", "列表测试4"));list.add(new TestObj("单列表测试2", "列表测试5", "列表测试6", "列表测试7", "列表测试8"));list.add(new TestObj("单列表测试3", "列表测试9", "列表测试10", "列表测试11", "列表测试12"));ExcelUtil.exportTemplateZip(CollUtil.newArrayList(map,list),"多个单列表打包.xlsx", "excel/导出使用的模板.xlsx", response);}@Data@AllArgsConstructorstatic class TestObj1 {private String test1;private String test2;private String test3;}@Data@AllArgsConstructorstatic class TestObj {private String name;private String list1;private String list2;private String list3;private String list4;}}

5. 导出功能完毕!有什么不懂的,欢迎留言~

Java使用EasyExcel导出简单、复杂excel,以及多个excel打包导出下载zip相关推荐

  1. yii2 php excel 导出,简单,易用的yii2导入和导出组件( illusion/yii2-excel)

    Uncaught TypeError: last.size is not a function 先来说说写这个组件的初衷,接触yii2不是很久,在项目中刚好有这样一个excel导入导出的需求,筛选了多 ...

  2. EasyPoi的excel模板预览与下载、导出简单/复杂数据

    官方文档地址:easypoi官网,官方仅供参考,部分描述有问题 excel模板预览 准备工作 事先将整理好的excel模板存在项目中,如图 excel模板预览代码 @GetMapping(" ...

  3. Java使用EasyExcel导出Excel

    功能背景 简单的说下这个功能的背景需求吧,有类似需求的可以复用,果然导入还没写完,导出的功能接踵而来,一块写了吧 实现excel导出(依旧废话-) 多个sheet页一起导出 第一个sheet页数据表头 ...

  4. Java 使用EasyExcel导出excel文件

    Java 使用EasyExcel导出excel文件 一.引入pom依赖 二.导出实体 三. 生成excelController 四.效果 一.引入pom依赖 <dependency>< ...

  5. 使用java解析和读取excel表格(EasyExcel的简单使用)

    ** 解析excel的工具 ** Apache POI.JXL.Alibaba EasyExcel等.其中Apache POI基于DOM方式进行解析,将文件直接加载内存,所以速度较快,适合Excel文 ...

  6. 【java学习】EasyExcel的简单使用

    EasyExcel的简单使用 前言 Excel读 1.实体类 2.读监听器与测试类 3.输出结果 Excel写 1.实体类 2.写入Excel的测试类 3.输出结果 填充Excel 1.Excel模板 ...

  7. java利用EasyExcel操作Excel

    EasyExcel EasyExcel读写Excel的基本使用 Excel导入导出的应用场景 数据导入:减轻录入工作量 数据导出:统计信息归档 数据传输:异构系统之间数据传输 EasyExcel简介 ...

  8. Java使用EasyExcel操作Excel表格

    1 EasyExcel简介 EasyExcel是阿里巴巴开源的一个基于Java的简单.省内存的读写Excel的开源项目.在尽可能节约内存的情况下支持读写百M的Excel. github地址:https ...

  9. java使用EasyExcel实现导入导出几种方式(导入、模板导出、和不需要模板的导出)

    java通过EasyExcel实现导入导出(导入.模板导出.和不需要模板的导出) 此文章只是涉及到简单的导入导出 通过实体模板导入数据 无实体模板导入数据 导出数据 通过模板导出数据 使用到的mave ...

最新文章

  1. 线段树分裂与合并 ---- 树上差分 P4556 [Vani有约会]雨天的尾巴 /【模板】线段树合并
  2. QTP---Recovery Scenario没有被触发的原因汇总
  3. 机器学习、数据挖掘及其他
  4. linux shell IFS分隔符 简介 IFS=$‘\n‘ 使用换行符做分隔符
  5. Spring JDBC-混合框架的事务管理
  6. 队列化栈栈化队列(力扣)
  7. 嵌入式Linux中的根文件系统
  8. 揭秘!一个高准确率的Flutter埋点框架如何设计
  9. InnoDB的内存结构和特性
  10. c语言的表达式2 4 6 8的值,C语言程序设计测试题二
  11. World Wind Java开发之十四——添加WMS地图服务资源(转)
  12. 如何进行时间序列的特征工程?
  13. 医学实验室质量和能力认可准则在实验室信息系统的应用说明CNAS-CL35
  14. 和是java语言字符常量吗_在 JAVA 语言中,下列正确的字符型常量是_电路原理答案_学小易找答案...
  15. 比较JPG、PNG、GIF、BMP图片格式
  16. HTML5期末大作业:漫画网站设计——海贼王基地(5页) 学生动漫网页设计模板下载 海贼王大学生HTML网页制作作品 简单漫画网页设计成品 dreamweaver学生网站模板
  17. acwing1148——秘密的牛奶运输(求次小生成树)
  18. Mac:VSCode 批量替换快捷键
  19. Python:画三角形
  20. vs运行程序时报错:“XXX处有未经处理的异常: 0xC0000374: 堆已损坏”

热门文章

  1. 修复WIN7系统开机黑屏,只剩下鼠标能动的问题。
  2. vscode报错之 对修饰器的实验支持功能在将来的版本中可能更改。在 “tsconfig“ 或 “jsconfig“ 中设置 “experimentalDecorators“ 选项以删除此警告。
  3. css 友情链接效果,SEO:友情链接是什么?友情链接检查样式方位排版
  4. 刘磨叽恶狠狠地瞪了了张s
  5. 珍珠bead_珍珠果酱直播
  6. 博客管理系统php教程,Wblog博客程序管理系统
  7. RESTFUL API API身份认证
  8. 深度缓冲中的深度值计算及可视化
  9. 电视剧植入式广告的植入方式有哪些
  10. Markdownpad2错误This view has crashed问题解决记录