Java-easyExcel入门教程

文章目录

  • 前言
  • 一、简介
  • 二、使用步骤
    • 1. 引入依赖
    • 2. 前提准备
    • 3. 实现导出
    • 4. 实现导入
  • 三、我所遇到的问题
  • 四、总结


前言

在日常开发中经常会遇到一些 excel 表导入导出的需求,以往会使用 POI 封装成工具类来处理这些导入导出的需求,但是 POI 在导入大文件时非常占用内存,甚至出现 OOM,所以目前很多公司都会使用节省内存的 EasyExcel,虽然说在网上关于 EasyExcel 的教程五花八门的有很多,我从中也学到不少,不过这里我还是将目前我项目中使用的方式总结一下分享出来。


一、简介

官网:https://easyexcel.opensource.alibaba.com/
官方文档:https://easyexcel.opensource.alibaba.com/docs/current/

在这里插入图片描述

EasyExcelalibaba 开源的一个 excel 处理框架,底层是对 POI 的封装,其最大的特点就是 使用简单、节省内存,不同于 POI 的一次性将 excel 文件内容全部读取然后加载到内存中再做处理,EasyExcel 是从磁盘中一行行读取数据,逐个解析,并将解析后的结果以观察者的模式通知处理。

特点:

  • 性能高效:采用了异步导入导出的方式,并且底层使用了 NIO 技术实现,使其在导入导出大量数据时的性能非常高效
  • 易于使用:提供了简单易用的 API ,用户可以通过少量的代码实现导入导出功能
  • 功能强大:除了最基本的导入导出功能,还可以进行合并单元格、数据校验、自定义样式等增强功能
  • 扩展性好:用户可以自定义 Converter 对自定义类型进行转换,或者继承 EasyExcelListener 来自定义监听器实现更加灵活的需求

二、使用步骤

1. 引入依赖

在这里插入图片描述

        <!-- easyExcel 表格依赖 --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.2</version></dependency><!-- lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></dependency>

当引入了 easyexcel 的依赖之后,相当于间接的引入了 poipoi-ooxml 的依赖,如果你项目中已经引入了 POI 的话,就可能出现兼容问题,所以我推荐引入较高版本的 easyexcel,这里我是使用了 easyexcel-3.3.2 最新一版的依赖解决了这一冲突的。


2. 前提准备

这里我使用我数据库中的 访问日志 - t_access_log 作为导入和导出的数据,表数据如下:

select * from t_access_log;

在这里插入图片描述

实体类:

package com.mike.bean.inner.entity;import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.mike.common.core.domain.web.entity.BaseEntity;
import com.mike.common.core.domain.web.entity.GaeaBaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;/*** <p>* 访问记录表* </p>** @author mike* @since 2023-05-30*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName("t_access_log")
@EqualsAndHashCode(callSuper = true)
@ApiModel(value="AccessLog对象", description="访问记录表")
public class AccessLog extends BaseEntity {private static final long serialVersionUID = 1L;@ApiModelProperty(value = "自增主键")@TableId(value = "id", type = IdType.AUTO)private Integer id;@ApiModelProperty(value = "登录名")private String loginName;@ApiModelProperty(value = "访问路径")private String accessPath;@ApiModelProperty(value = "访问IP")private String accessIp;@ApiModelProperty(value = "创建时间")@TableField(value = "create_time", fill = FieldFill.INSERT)@JsonFormat(pattern = DateFormatConstant.NORMAL)private Date createTime;@ApiModelProperty(value = "访问状态:0已拦截;1已放行")private Boolean state;}

3. 实现导出

easyExcel 实现导出功能还是比较简单的,几行代码就能解决,就是需要定义一个输出的对象,如果我要导出我的访问记录表数据,那么我的输出对象可以这么写:

package com.mike.server.system.domain.vo;import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.*;
import com.alibaba.excel.enums.poi.BorderStyleEnum;
import com.alibaba.excel.enums.poi.FillPatternTypeEnum;
import com.alibaba.excel.enums.poi.HorizontalAlignmentEnum;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
// 头背景设置
@HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, horizontalAlignment = HorizontalAlignmentEnum.CENTER, borderLeft = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN)
//标题高度
@HeadRowHeight(40)
//内容高度
@ContentRowHeight(30)
//内容居中,左、上、右、下的边框显示
@ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, borderLeft = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN)
public class AccessLogEasyVo {@ApiModelProperty(value = "自增主键")@ExcelProperty("自增主键")// 格子宽度@ColumnWidth(15)private Integer id;@ApiModelProperty(value = "登录名")@ExcelProperty("登录名")@ColumnWidth(15)private String loginName;@ApiModelProperty(value = "访问路径")@ExcelProperty("访问路径")@ColumnWidth(15)private String accessPath;@ApiModelProperty(value = "访问IP")@ExcelProperty("访问IP")@ColumnWidth(15)private String accessIp;@ApiModelProperty(value = "创建时间")@ExcelProperty("创建时间")@DateTimeFormat("yyyy-MM-dd HH:mm:ss")@ColumnWidth(15)private Date createTime;@ApiModelProperty(value = "访问状态:0已拦截;1已放行")@ExcelProperty("访问状态")@ColumnWidth(15)private Boolean state;}

表头信息用注解 @ExcelProperty("表头名称") 表示,其它注解就不一一说明了,可查阅官方文档

代码编写:

TestController.java

    @GetMapping("/export/easy")@ApiOperation(value = "示例:导出", produces = "application/octet-stream")public ResponseBean<String> easyExport(HttpServletResponse response) {testService.easyExport(response);return ResponseBean.success();}

TestService.java

    void easyExport(HttpServletResponse response);

TestServiceImpl.java

    @Overridepublic void easyExport(HttpServletResponse response) {/** 以导出 access-log 中的数据为例** 使用 阿里 的 easyExcel 框架进行导出*/// 设置响应体String finalFileName = "文件名称" + "_(截止"+ StringUtils.getNowTimeStr(DateFormatConstant.Y0M0D)+")";// 设置content—type 响应类型response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");try {// 这里URLEncoder.encode可以防止中文乱码finalFileName = URLEncoder.encode(finalFileName, "UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}response.setHeader("Content-disposition", "attachment;filename=" + finalFileName + ".xlsx");// 先将需要导出的数据查出来List<AccessLog> accessLogs = accessLogMapper.selectAll();// 封装 vo 对象,vo 对象中的字段上添加了 @ExcelProperty,与 excel 表头相对应List<AccessLogEasyVo> accessLogEasyVos = CopyUtils.copyList(accessLogs, AccessLogEasyVo.class);try {EasyExcel.write(response.getOutputStream(), AccessLogEasyVo.class).sheet("Sheet1").doWrite(accessLogEasyVos);} catch (IOException e) {log.error("export excel error:",e);throw new CommonException(ExceptionEnum.EXPORT_EXCEL_ERROR);}}

因为设置响应体这段代码基本上是固定格式的,所以可以抽出来

package com.mike.common.core.utils.excel;import com.mike.common.core.constant.DateFormatConstant;
import com.mike.common.core.utils.StringUtils;
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;public class EasyExcelUtil {/*** 初始化响应体* @param response 请求头* @param fileName 导出名称*/public static void initResponse(HttpServletResponse response, String fileName) {// 最终文件名:文件名_(截止yyyy-MM-dd)  --> 这块地方得根据你们自己项目做更改了String finalFileName = fileName + "_(截止"+ StringUtils.getNowTimeStr(DateFormatConstant.Y0M0D)+")";// 设置content—type 响应类型response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");try {// 这里URLEncoder.encode可以防止中文乱码finalFileName = URLEncoder.encode(finalFileName, "UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}response.setHeader("Content-disposition", "attachment;filename=" + finalFileName + ".xlsx");}
}

TestService.java 简化为:

    @Overridepublic void easyExport(String loginName) {// 设置响应体EasyExcelUtil.initResponse(response, "文件名称");// 先将需要导出的数据查出来List<AccessLog> accessLogs = accessLogMapper.selectAll();// 封装 vo 对象,vo 对象中的字段上添加了 @ExcelProperty,与 excel 表头相对应List<AccessLogEasyVo> accessLogEasyVos = CopyUtils.copyList(accessLogs, AccessLogEasyVo.class);try {EasyExcel.write(response.getOutputStream(), AccessLogEasyVo.class).sheet("Sheet1").doWrite(accessLogEasyVos);} catch (IOException e) {log.error("export excel error:",e);throw new CommonException(ExceptionEnum.EXPORT_EXCEL_ERROR);}}

基本套路就是:① 设置下导出文件响应体信息;② 查询数据;③ 转换成 easyExcel 的输出对象;④ 使用 EasyExcel 导出

相关工具类:CopyUtils.java

package com.mike.common.core.utils;import com.mike.common.core.utils.bean.BeanUtils;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;public class CopyUtils {/*** 复制集合*/public static <T,K> List<T> copyList(List<K> sourceList, Class<T> clazz) {if (CollectionUtils.isEmpty(sourceList)) {return null;}ArrayList<T> target = new ArrayList<>();sourceList.forEach(k -> target.add(convert(k, clazz)));return target;}/*** 复制对象*/public static <T,K> T convert(K source, Class<T> clazz) {T t = BeanUtils.instantiateClass(clazz);BeanUtils.copyProperties(source, t);return t;}}

测试:

在这里插入图片描述

在这里插入图片描述


4. 实现导入

导入的代码相对于导出而已会复杂一点,前面说到 EasyExcel 会一行行的从表格当中读取数据并进行解析,再将解析后的结果以观察者模式通知处理,再官方的文档中是使用到了 ReadListener 这样的一个监听器来处理这些结果数据

在这里插入图片描述

我们可以按照官方文档的方式去实现 ReadListener 类,或者去继承ReadListener 的抽象类 AnalysisEventListener,这里我是采用了继承 AnalysisEventListener 的写法,代码如下:

ExcelDateListener.java

package com.mike.common.core.domain.excel;import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.exception.ExcelDataConvertException;
import com.alibaba.excel.metadata.CellExtra;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@Slf4j
public class ExcelDateListener<M> extends AnalysisEventListener<M> {private final ExcelReaderListenerCallback<M> callback;// 每隔50条存储数据库,实际使用中可以3000条,然后清理list,方便内存回收private static final int BATCH_COUNT = 50;// 表头数据Map<Integer,String> headMap=new HashMap<>();// 缓存数据List<M> cacheList = new ArrayList<>();public ExcelDateListener(ExcelReaderListenerCallback<M> callback) {this.callback = callback;}/*** 这里会一行行的返回头*/@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {this.headMap=headMap;log.info("解析到一条头数据:{}", JSON.toJSONString(headMap));}@Overridepublic void invoke(M data, AnalysisContext analysisContext) {cacheList.add(data);// 在这里可以做一些其他的操作,就靠自己去拓展了// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOMif (cacheList.size() >= BATCH_COUNT) {// 这里是存数据库的操作callback.convertData(cacheList,headMap);// 存储完成清理 listcacheList.clear();}}/*** 所有数据解析完成了 都会来调用*/@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {callback.convertData(cacheList,headMap);cacheList.clear();}/*** 在转换异常 获取其他异常下会调用本接口。抛出异常则停止读取。如果这里不抛出异常则 继续读取下一行*/@Overridepublic void onException(Exception exception, AnalysisContext context) {// 如果是某一个单元格的转换异常 能获取到具体行号// 如果要获取头的信息 配合invokeHeadMap使用if (exception instanceof ExcelDataConvertException) {ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException)exception;log.error("第{}行,第{}列解析异常", excelDataConvertException.getRowIndex(),excelDataConvertException.getColumnIndex());}}/*** 读取条额外信息:批注、超链接、合并单元格信息等*/@Overridepublic void extra(CellExtra extra, AnalysisContext context) {log.info("读取到了一条额外信息:{}", JSON.toJSONString(extra));switch (extra.getType()) {case COMMENT:log.info("额外信息是批注,在rowIndex:{},columnIndex;{},内容是:{}", extra.getRowIndex(), extra.getColumnIndex(),extra.getText());break;case HYPERLINK:if ("Sheet1!A1".equals(extra.getText())) {log.info("额外信息是超链接,在rowIndex:{},columnIndex;{},内容是:{}", extra.getRowIndex(),extra.getColumnIndex(), extra.getText());} else if ("Sheet2!A1".equals(extra.getText())) {log.info("额外信息是超链接,而且覆盖了一个区间,在firstRowIndex:{},firstColumnIndex;{},lastRowIndex:{},lastColumnIndex:{},"+ "内容是:{}",extra.getFirstRowIndex(), extra.getFirstColumnIndex(), extra.getLastRowIndex(),extra.getLastColumnIndex(), extra.getText());} else {log.error("Unknown hyperlink!");}break;case MERGE:log.info("额外信息是超链接,而且覆盖了一个区间,在firstRowIndex:{},firstColumnIndex;{},lastRowIndex:{},lastColumnIndex:{}",extra.getFirstRowIndex(), extra.getFirstColumnIndex(), extra.getLastRowIndex(),extra.getLastColumnIndex());break;default:}}
}

ExcelReaderListenerCallback.java

package com.mike.common.core.domain.excel;import java.util.List;
import java.util.Map;public interface ExcelReaderListenerCallback<T> {/*** 数据处理* @param data 数据* @param headMap 表头*/void convertData(List<T> data, Map<Integer,String> headMap);
}

代码编写:

这里我准备了一张表格如下所示:

在这里插入图片描述

现在我要将这张表格数据导入到日志访问记录 t_access_log 表中

TestController.java

    @ApiOperation(value = "示例:导入")@PostMapping("/importDate/easy")@ApiImplicitParam(name = "file", value = "文件", dataTypeClass = MultipartFile.class, required = true)public ResponseBean<String> easyImportDate(@RequestPart("file") MultipartFile file) {testService.easyImportDate(file);return ResponseBean.success();}

TestService.java

    void easyImportDate(MultipartFile file);

TestServiceImpl.java

    @Overridepublic void easyImportDate(MultipartFile file) {/** 以导出 access-log 中的数据为例** 使用 阿里 的 easyExcel 框架进行导入*/try {EasyExcel.read(file.getInputStream(), AccessLogEasyVo.class,new ExcelDateListener<AccessLogEasyVo>(new ExcelReaderListenerCallback<AccessLogEasyVo>() {@Overridepublic void convertData(List<AccessLogEasyVo> data, Map<Integer, String> headMap) {//导入文件表头:登录名   访问路径   访问IP   创建时间   访问状态ArrayList<AccessLog> accessLogs = new ArrayList<>();for (AccessLogEasyVo o : data) {accessLogs.add(AccessLog.builder().loginName(o.getLoginName()).accessPath(o.getAccessPath()).accessIp(o.getAccessIp()).state(o.getState()).build());}if (!CollectionUtils.isEmpty(accessLogs)) {int row = accessLogMapper.insertBatchSomeColumn(accessLogs);log.info("insert access-log row: {}", row);}}}))//.extraRead(CellExtraTypeEnum.COMMENT) // 需要读取批注 默认不读取//.extraRead(CellExtraTypeEnum.HYPERLINK) // 需要读取超链接 默认不读取//.extraRead(CellExtraTypeEnum.MERGE) // 需要读取合并单元格信息 默认不读取.sheet().doRead();} catch (IOException e) {log.error("import excel error:",e);throw new CommonException(ExceptionEnum.IMPORT_EXCEL_ERROR);}}

这里用到了导出时所封装的输出对象 AccessLogEasyVo 类,我们要自己去编写 convertData() 处理表格数据的逻辑,这里我只是做了一个简单的数据类型转换。

测试:

在这里插入图片描述

从日志的打印信息中就能看到数据已经插入成功了

在这里插入图片描述


三、我所遇到的问题

问题一:EasyExcelPOI 依赖冲突问题

当导入 easyexcel 依赖后,如果你项目中以前也有导入过 poi 相关的依赖就可能会出现这个问题,主要会表现在两个方面,一个是你项目中有些关于 poi 的有些类爆红导入包失败,一个就是你在运行的时候出现报错,例如:

我项目中开始的包如下:

        <!-- easyExcel 表格依赖 --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.1</version></dependency><!-- excel工具 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency>

引入依赖的时候项目没有报错,启动项目也没有,但是执行导入时候就报错了

在这里插入图片描述

然后我将 easyexcel 的版本替换成 3.3.2 就解决了这个问题

如果你还是有冲突的话,不妨看看试试以下方法:

        <!-- easyexcel --><!-- 3+ 版本的 easyexcel,使用 poi 5+ 版本时,需要自己引入 poi 5+ 版本的包,且手动排除:poi-ooxml-schemas --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version><exclusions><exclusion><artifactId>poi-ooxml-schemas</artifactId><groupId>org.apache.poi</groupId></exclusion></exclusions></dependency><!-- Excel 97-2003 工作簿 --><!-- 这是遵循二进制文件格式的旧 Excel 文件。该格式的文件扩展名为 .xls --><!-- 为了兼容性,这个依赖项也是要加的 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.2</version></dependency><!-- 用于操作 Excel 2007+ 工作簿 --><!-- 这是 Excel 2007 和更高版本的默认基于 XML 的文件格式。该格式的文件扩展名为 .xlsx --><!-- 它遵循 Office Open XML (OOXML) 格式,这是一种由 Microsoft 开发的基于 XML 的压缩文件格式,用于表示办公文档 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.2</version></dependency>

问题二:org.springframework.http.converter.HttpMessageNotWritableException: No converter for ...

导出文件时出错,但是文件还是能够正常导出,文件内容也是正常的

在这里插入图片描述

这个问题的原因就是我项目是整合了 swagger,所以在接口上我有添加 produces = "application/octet-stream",表示以流的方式输出

在这里插入图片描述

然后在代码中又设置了一次

在这里插入图片描述

所以才会出现以上问题

我最后将 response.setContentType("application/vnd.ms-excel"); 这段代码注释掉就解决了

在这里插入图片描述


四、总结

以上就是我如何整合 EasyExcel 的全部过程以及基础的使用方法,日后如果工作中遇到关于 EasyExcel 的其它一些问题或者写法我也会分享出来,比如说复杂表头的编写、动态表头的实现、合并单元格和修改单元格样式等等。


参考博客:
EasyExcel 的基本使用:https://www.cnblogs.com/aitiknowledge/archive/2022/02/28/15937517.html
EasyExcel 入门使用教程:https://backend.devrank.cn/traffic-information/7301271005489367077
EasyExcel 的基本使用:https://blog.csdn.net/weixin_42001592/article/details/128402350

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

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

相关文章

Docker 环境中 Spring Boot 应用的 Arthas 故障排查与性能优化实战

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

【零基础入门Docker】Dockerfile中的USER指令以及dockerfile命令详解

✍面向读者&#xff1a;所有人 ✍所属专栏&#xff1a;Docker零基础入门专栏 目录 第 1 步&#xff1a;创建 Dockerfile 第 2 步&#xff1a;构建 Docker 镜像 第 3 步&#xff1a;运行 Docker 容器 第 4 步&#xff1a;验证输出 dockerfile命令详解 最佳实践 默认情况下…

matlab 基于卡尔曼滤波的GPS-INS的数据融合的导航

1、内容简介 略 25-可以交流、咨询、答疑 2、内容说明 基于卡尔曼滤波的GPS-INS的数据融合的导航 "基于卡尔曼滤波的GPS-INS的数据融合的导航 基于卡尔曼滤波实现GPS-INS组合导航系统" 卡尔曼滤波、GPS、INS、数据融合、导航 3、仿真分析 4、参考论文 略 …

[github全教程]github版本控制最全教学------- 大厂找工作面试必备!

作者&#xff1a;20岁爱吃必胜客&#xff08;坤制作人&#xff09;&#xff0c;近十年开发经验, 跨域学习者&#xff0c;目前于新西兰奥克兰大学攻读IT硕士学位。荣誉&#xff1a;阿里云博客专家认证、腾讯开发者社区优质创作者&#xff0c;在CTF省赛校赛多次取得好成绩。跨领域…

如何精准操作无人机自动停机坪?

无人机自动停机坪通过自主导航和避障功能&#xff0c;实现了无人机的自主降落和起飞&#xff0c;在无人机技术领域起到了至关重要的作用。停机坪不仅仅是无人机的起降平台&#xff0c;还具备自动换电或充电等功能&#xff0c;为无人机的自动化提供了关键支持。为更有效地操作无…

ESP32-Web-Server编程-CSS 基础 2

ESP32-Web-Server编程-CSS 基础 2 概述 如上节所述&#xff0c;可以使用外部 CSS 文件来修饰指定的 HTML 文件。 外部引用 - 使用外部 CSS 文件。 当样式需要被应用到很多页面的时候&#xff0c;外部样式表将是理想的选择。使用外部样式表&#xff0c;就可以通过更改一个文件…

SQL Server 2016(基本概念和命令)

1、文件类型。 【1】主数据文件&#xff1a;数据库的启动信息。扩展名为".mdf"。 【2】次要&#xff08;辅助&#xff09;数据文件&#xff1a;主数据之外的数据都是次要数据文件。扩展名为".ndf"。 【3】事务日志文件&#xff1a;包含恢复数据库的所有事务…

python高级练习题库实验1(B)部分

文章目录 题目1代码实验结果题目2代码实验结果题目3代码实验结果题目4代码实验结果题目5代码实验结果题目总结题目1 打包糖果小游戏,用户输入糖果品牌与个数,还有一个盒子里面可以装多少个糖果,输出一些打印信息,如下图所示: 代码 print("Packaging lollies into…

CF1877 E. Autosynthesis 基环树dp

传送门:CF [前题提要]:一道基环树dp,但是题目有点绕,当时卡了我整整半天,到了第二天换了和清醒的脑子然后和别人讨论才整明白,故记录一下 题目很绕,故不再介绍. 首先对于这种下标和值有关系的题目.其实不难想到建图(CF上有大量这种 t r i c k trick trick),随便举个类似的题…

12月1日作业

代码整理&#xff0c;将学过的三种运算符重载&#xff0c;每个至少实现一个运算符的重载 #include <iostream>using namespace std;class Cloudy {friend bool operator!(const Cloudy &L,const Cloudy &R); private:int a; public:int b; public:Cloudy(){}Clo…

【Java】浅析FutureTask的核心方法get

前言 在进行多线程编程时&#xff0c;我们离不开两个重要的任务接口&#xff1a;Runnable、Callable。一个线程想要运行&#xff0c;首先它得知道它的任务是什么&#xff08;它要做什么&#xff09;&#xff0c;而这两个接口恰好是用于表示一个线程需要执行的任务。 Runnable和…

SHAP(三):在解释预测模型以寻求因果见解时要小心

SHAP&#xff08;三&#xff09;&#xff1a;在解释预测模型以寻求因果见解时要小心 与 Microsoft 的 Eleanor Dillon、Jacob LaRiviere、Scott Lundberg、Jonathan Roth 和 Vasilis Syrgkanis 合作撰写的关于因果关系和可解释机器学习的文章。 当与 SHAP 等可解释性工具配合…

Mac 安装 Django 并连接 MySQL

一、下载安装运行Django看官方教程就好了&#xff0c;网址&#xff1a;Django 安装_w3cschool 二、连接MySQL&#xff08;我用的是pymysql和mysqlclient&#xff09;&#xff1a; 1、创建好项目后找到这个文件 2、修改当中的连接信息&#xff0c;将这些信息改成你自己的就好了…

2023-12-01 AIGC-自动生成ppt的AI工具

摘要: 2023-12-01 AIGC-自动生成ppt-记录 自动生成ppt: BoardMix boardmix 一键生成ppt boardmix是一款基于云的ai设计软件&#xff0c;允许创建用于各种目的的自定义演示文稿、ai绘画&#xff0c;ai生成思维导图等。以下是它的一些功能&#xff1a; 可定制的模板 - 它有一个…

Redis基本命令

文章目录 第1关&#xff1a;字符串、列表与集合第2关&#xff1a;哈希与有序集合第3关&#xff1a;Redis基本事务与其他命令 第1关&#xff1a;字符串、列表与集合 编程要求 根据提示&#xff0c;在右侧Begin-End区域补充代码&#xff0c;完成任务分配的后端处理逻辑&#xff…

Python-docx 深入word源码 自定义页码页脚以动态显示总页数和当前页数

代码和效果图 先上能够正常显示页码页脚的Python代码和效果图&#xff0c;之后再解释原理和思路 from docx import Document from docx.shared import Pt from docx.oxml import OxmlElement from docx.enum.text import WD_PARAGRAPH_ALIGNMENT from docx.oxml.ns import qn…

Elasticsearch:什么是非结构化数据?

非结构化数据定义 非结构化数据是指未按照设计的模型或结构组织的数据。 非结构化数据通常被归类为定性数据&#xff0c;可以是人类或机器生成的。 非结构化数据是最丰富的可用数据类型&#xff0c;经过分析后&#xff0c;可用于指导业务决策并在许多其他用例中实现业务目标。…

java原子类型

AtomicBoolean AtomicInteger AtomicLong AtomicReference<V> StringBuilder - 不是原子类型。StringBuilder 是 java.lang 包下的类 用法&#xff1a;无需回调改变数值

【学习记录】从0开始的Linux学习之旅——应用开发(helloworld)

一、概述 Linux操作系统通常是基于Linux内核&#xff0c;并结合GNU项目中的工具和应用程序而成。Linux操作系统支持多用户、多任务和多线程&#xff0c;具有强大的网络功能和良好的兼容性。本文主要讲述如何在linux系统上进行应用开发。 二、概念及原理 应用程序通过系统调用与…

今日现货黄金最新建议

近期现货黄金价格再度逼近历史高位&#xff0c;很多本来在场外观望的投资者&#xff0c;都纷纷希望进场一试身手。然而大涨大跌的行情并不是很适合新手投资者参与&#xff0c;如果大家还没做好技术上的准备&#xff0c;可以多听听正规交易平台的专业人士的意见。 在正式入市之前…