让AI帮我用java实现EasyExel读取图片—支持WPS嵌入图片
🌈 场景概述
java 小伙伴相信都使用 EasyExcel 以及 POI 库实现过 Excel 批量导入、导出功能,但只有部分人实现过 excel 导入带图片数据的场景。这个技术实现手段网上也有很多案例和demo,最常见的就是通过 XSSFPictureData 来实现。但是在 WPS 单元格嵌入图片场景下,本法无效。
本文讲解:如何利用 AI 在5分钟内实现用 Java EasyExcel 针对 WPS Excel 单元格嵌入图片的读取。
🎯 本节你将学到:
- 什么?凡是用过电脑的人99%都会数据库?
- Excel 真的是你平时见到的那个样子么?
- 用 AI 5分钟搞定Java EasyExcel 针对 WPS Excel 单元格嵌入图片的读取。
👇 视频版教程
(喜欢看视频教程就看视频,喜欢看图文教程就继续往下滑)
让AI帮我用java实现EasyExel读取图片(支持WPS嵌入图片),AI 5分钟搞定普通程序员5天工作量
👉🏻 笔记原文👉🏻 让AI帮我用java实现EasyExel读取图片—支持WPS嵌入图片 · 语雀
1、常规Excel读取图片的问题
最常见的通过 java + easyexcel 实现excel图片读取的方法,基本都是通过Apache POI库XSS*方法实现:
import org.apache.poi.xssf.usermodel.XSSFPictureData;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;// 假设你已经有了一个MultipartFile类型的Excel文件
XSSFWorkbook workbook = new XSSFWorkbook(file.getInputStream());
Sheet sheet = workbook.getSheetAt(0);
Map<String, XSSFPictureData> pictures = new HashMap<>();for (XSSFPictureData picture : workbook.getAllPictures()) {pictures.put(picture.getPackagePart().getPartName().getName(), picture);
}// 遍历sheet中的所有形状,找到图片并处理
for (POIXMLDocumentPart dr : sheet.getRelations()) {if (dr instanceof XSSFDrawing) {XSSFDrawing drawing = (XSSFDrawing) dr;for (XSSFShape shape : drawing.getShapes()) {if (shape instanceof XSSFPicture) {XSSFPicture picture = (XSSFPicture) shape;XSSFPictureData picData = pictures.get(picture.getPackagePart().getPartName().getName());// 处理图片数据,例如保存到服务器或数据库}}}
}
但是,本法对于 WPS 内嵌图片无效,因为 WPS 内嵌图片使用了 DISPIMG函数,我们用上面的方法解析后,得到的只是函数信息,并非图片信息。如下图的 =DISPIMG("ID_79A9B2935BEA4B1B8836ECE25C09D573",1)

2、揭开 Excel 的神秘面纱
🧑🎓 你以为的Excel 🆚 真实的Excel
你以为的Excel

真实的Excel

📚 这里要讲一个知识,就是 Excel 可以被理解为一种简单的数据库:
因为它具有存储和组织数据的能力,并且可以通过公式、查询和宏等功能来处理数据。以下是一些将 Excel 视为数据库的理由:
- 数据存储:Excel 文件(.xlsx 或 .xls)可以存储大量的数据,类似于数据库中的表。
- 表格结构:Excel 中的工作表类似于数据库中的表,它们都有行和列的结构。
- 数据操作:Excel 提供了排序、筛选和查找等基本的数据操作功能,这些也是数据库管理系统(DBMS)中常见的操作。
- 数据查询:Excel 允许使用公式和函数(如 VLOOKUP、HLOOKUP、INDEX 和 MATCH)来查询和分析数据。
- 数据验证:Excel 提供数据验证功能,可以限制输入的数据类型,类似于数据库中的数据完整性约束。
- 宏和自动化:Excel 的宏功能可以用来自动化重复性的数据操作任务,类似于数据库中的存储过程和触发器。
然而,尽管 Excel 具有这些数据库的特性,它也有一些限制,使其不适合作为大型或复杂的数据库解决方案:
- 性能问题:对于大型数据集,Excel 的性能可能会下降,因为它不是为处理大规模数据而设计的。
- 数据安全和权限管理:Excel 在数据安全和权限管理方面不如专业的数据库管理系统强大。
- 数据一致性和完整性:Excel 缺乏数据库管理系统中的数据一致性和完整性约束。
- 多用户访问:Excel 文件通常不适合多用户同时访问和编辑,而数据库管理系统支持多用户并发访问。
- 扩展性和可伸缩性:随着数据量的增长,Excel 的扩展性和可伸缩性不如专业的数据库系统。
因此,虽然 Excel 可以被视为一种数据库,但它更适合于小型、简单的数据管理和分析任务。对于需要高性能、高安全性、复杂查询和大规模数据处理的场景,专业的数据库管理系统(如 MySQL、PostgreSQL、Oracle 等)会是更合适的选择。
前面我们截图中的“真实的Excel”是怎么回事?
其实很简单:
我们将 WPS 创建的.xlsx文件后缀名改为.zip后解压缩文件,得到的就是这个效果。

3、EasyExcel 读取WPS内嵌图片如何解决
3.1 先来找到图片位置以及绑定方式
根据前面的分析,我们可以看到 wps 的内嵌图片是通过DISPIMG函数加载的,同时我们通过 Excel 神秘面纱中看到了其“Excel 数据的底层文件构造”,接下来我们找到这个函数与图片之间的逻辑关系,然后通过代码找到这个图片就行了。
- 文件:/xl/cellimages.xml

- 文件:/xl/_rels/cellimages.xml.rels

- 最后找到图片

3.2 让AI帮助我们用java实现
- 首先打开领航AGI聚合平台:领航AGI
- 点击 playground 进入 AI 工具
- 输入提示要求(第一次没有提到wps问题,所以生成的代码仍存在问题,这里不做演示,直接下一步)

- 告诉他wps内嵌图片问题,并把文件xml给AI

AI完整对话内容(点击查看全部)

3.3 看最终代码
这里面我后来把文件名称调整了下,方便后期大家检索
WPSExcelImportImgListener.java
package com.sinosoft.hanlin.jyy.handler;import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.sinosoft.hanlin.jyy.core.vo.common.WPSExcelImportImgDemoVo;
import lombok.Getter;import java.util.ArrayList;
import java.util.List;/*** @author 微信 LHYYH0001* @description: Excel带图片导入* 处理图片与数据行的关联。由于图片的对应顺序已在 ExcelImageExtractor 中提供,这里可以通过行号进行匹配。* @create 2024-11-05 09:07**/
@Getter
public class WPSExcelImportImgListener extends AnalysisEventListener<WPSExcelImportImgDemoVo> {private List<WPSExcelImportImgDemoVo> dataList = new ArrayList<>();@Overridepublic void invoke(WPSExcelImportImgDemoVo data, AnalysisContext context) {// 处理每一行的数据dataList.add(data);}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// 所有数据解析完成后执行}
}
WPSExcelImportImgDemoVo.java
package com.sinosoft.hanlin.jyy.core.vo.common;import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;@Data
public class WPSExcelImportImgDemoVo {@ExcelProperty("标题")private String title;// // 将图片字段设置为 List<ImageData> 类型,用于接收多张图片
// @ExcelProperty(value = "图片")
// private List<ImageData> picture;@ExcelProperty(value = "图片")private String picture;
}
WPSExcelImportImgExtractor.java
package com.sinosoft.hanlin.jyy.handler;import org.apache.commons.io.IOUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;public class WPSExcelImportImgExtractor {/*** 提取 Excel 中的图片,并返回单元格与图片路径的映射* <p>* WPS 的内置函数无法提取图片,需要使用第三方库解析XML文件。* WPS 内嵌图片会把图片做DISPIMG函数处理,如=DISPIMG("ID_9D6E8C240C8945178DFF238232B217BF",1)* 我们可以将.xlsx 文件后缀改成.zip后解压,即可看到* 在xl路径下的cellimages.xml文件中,可以看到函数中的id值* 并且在cellimages.xml.rels中可以看到函数与图片之间的关系,而图片就位于xl/media路径下** @param inputStream Excel 文件的输入流* @param outputDir 图片保存的目标目录* @return 单元格位置(如 A1)与图片路径的映射* @throws Exception 异常*/public Map<String, String> extractImages(InputStream inputStream, String outputDir) throws Exception {Map<String, String> cellImageMap = new HashMap<>();Map<String, String> relsMap = new HashMap<>();Map<String, byte[]> imagesData = new HashMap<>();// 创建目标目录File dir = new File(outputDir);if (!dir.exists()) {dir.mkdirs();}ZipInputStream zis = new ZipInputStream(inputStream);ZipEntry zipEntry;ByteArrayOutputStream baos = null;String sheetXml = null;String cellImagesXml = null;String cellImagesRelsXml = null;// 首先遍历所有的Zip条目,找到需要的XML和图片文件while ((zipEntry = zis.getNextEntry()) != null) {String entryName = zipEntry.getName();if ("xl/cellimages.xml".equals(entryName)) {baos = new ByteArrayOutputStream();IOUtils.copy(zis, baos);cellImagesXml = baos.toString("UTF-8");baos.close();} else if ("xl/_rels/cellimages.xml.rels".equals(entryName)) {baos = new ByteArrayOutputStream();IOUtils.copy(zis, baos);cellImagesRelsXml = baos.toString("UTF-8");baos.close();} else if (entryName.startsWith("xl/media/")) {byte[] imageBytes = IOUtils.toByteArray(zis);String imageName = entryName.substring("xl/media/".length());imagesData.put(imageName, imageBytes);}zis.closeEntry();}zis.close();// 解析cellimages.xml.rels,建立rId到图片文件名的映射if (cellImagesRelsXml != null) {DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document relsDoc = builder.parse(new ByteArrayInputStream(cellImagesRelsXml.getBytes("UTF-8")));NodeList relNodes = relsDoc.getElementsByTagName("Relationship");for (int i = 0; i < relNodes.getLength(); i++) {Element relElement = (Element) relNodes.item(i);String rId = relElement.getAttribute("Id");// e.g., "media/image1.png"String target = relElement.getAttribute("Target");relsMap.put(rId, target.substring("media/".length()));}}// 解析cellimages.xml,提取图片与单元格的关系if (cellImagesXml != null) {DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document cellImagesDoc = builder.parse(new ByteArrayInputStream(cellImagesXml.getBytes("UTF-8")));NodeList cellImageNodes = cellImagesDoc.getElementsByTagName("etc:cellImage");for (int i = 0; i < cellImageNodes.getLength(); i++) {Element cellImageElement = (Element) cellImageNodes.item(i);// 获取图片 name 属性,如 "ID_6C483737A6AC427DAA4E4974252FB8A8"Element picElement = (Element) cellImageElement.getElementsByTagName("xdr:pic").item(0);Element cNvPr = (Element) picElement.getElementsByTagName("xdr:cNvPr").item(0);// e.g., "ID_6C483737A6AC427DAA4E4974252FB8A8"String imageName = cNvPr.getAttribute("name");// 获取 r:embed 属性,如 "rId1"Element blipFill = (Element) picElement.getElementsByTagName("xdr:blipFill").item(0);Element blip = (Element) blipFill.getElementsByTagName("a:blip").item(0);// e.g., "rId1"String rId = blip.getAttribute("r:embed");// e.g., "image1.png"String imageFileName = relsMap.get(rId);// TODO: 根据需要确定图片对应的单元格位置// 由于cellimages.xml中没有直接包含单元格位置的信息,这里需要通过其他途径获取// 例如,可以通过图片的位置信息(如x, y坐标)与单元格的位置对应// 但是这需要解析更多的XML信息,这里假设图片对应的顺序与数据行对应// 保存图片到本地byte[] imageBytes = imagesData.get(imageFileName);if (imageBytes != null) {String savedImagePath = outputDir + File.separator + imageFileName;FileOutputStream fos = new FileOutputStream(savedImagePath);fos.write(imageBytes);fos.close();// 由于缺少单元格位置信息,这里需要自定义逻辑进行映射// 例如,可以将图片顺序与数据行顺序对应// 这里将图片名存储到一个列表中,后续与数据行进行关联cellImageMap.put(imageName, savedImagePath);}}}return cellImageMap;}
}
ImportImgDemoApi.java
// ImportImgDemoApi.java
package com.sinosoft.hanlin.jyy.core.api;import com.alibaba.excel.EasyExcel;
import com.sinosoft.hanlin.jyy.annotation.NoAuth;
import com.sinosoft.hanlin.jyy.core.vo.common.WPSExcelImportImgDemoVo;
import com.sinosoft.hanlin.jyy.handler.WPSExcelImportImgExtractor;
import com.sinosoft.hanlin.jyy.handler.WPSExcelImportImgListener;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.util.List;
import java.util.Map;/*** 数据+图片导入*/
@Slf4j
@RestController
@RequestMapping("/easy")
public class ImportImgDemoApi {/*** 从输入流中读取 Excel 文件并解析数据,包括图片* @author 微信 LHYYH0001** @param filePath Excel 文件* @return 包含解析后数据的列表*/@ApiOperation(value = "Excel导入带图片demo", notes = "Excel导入带图片demo", produces = MediaType.APPLICATION_JSON_VALUE)@PostMapping(value = "/import", produces = MediaType.APPLICATION_JSON_VALUE)@NoAuthpublic List<WPSExcelImportImgDemoVo> importExcel(@RequestParam("filePath") MultipartFile filePath, HttpServletResponse httpServletResponse) throws Exception {// 创建监听器WPSExcelImportImgListener listener = new WPSExcelImportImgListener();// 获取文件输入流InputStream inputStreamForData = filePath.getInputStream();// 使用 EasyExcel 读取数据EasyExcel.read(inputStreamForData, WPSExcelImportImgDemoVo.class, listener).sheet().doRead();List<WPSExcelImportImgDemoVo> dataList = listener.getDataList();// 重置输入流以供图片提取InputStream inputStreamForImages = filePath.getInputStream();// 提取图片并保存WPSExcelImportImgExtractor extractor = new WPSExcelImportImgExtractor();// 修改为您希望保存图片的目录String imageOutputDir = "/Users/javastarboy/Desktop/京东自营/";Map<String, String> cellImageMap = extractor.extractImages(inputStreamForImages, imageOutputDir);// 遍历数据并关联图片// 假设图片的顺序与数据行的顺序一致int imageIndex = 0;for (int i = 0; i < dataList.size(); i++) {WPSExcelImportImgDemoVo vo = dataList.get(i);// 获取对应的图片String imagePath = null;if (i < cellImageMap.size()) {imagePath = (String) cellImageMap.values().toArray()[i];// 将图片路径设置到实体类vo.setPicture(imagePath);log.info("图片 {} 已关联到标题 {}", imagePath, vo.getTitle());}}// 关闭输入流inputStreamForImages.close();// 返回数据列表return dataList;}
}
验证一下
请求后,excel的图片会存储在 imageOutputDir路径下。
存储逻辑可以根据你的业务逻辑做对应调整,上面imageOutputDir只是demo演示


分享不易,点赞、关注,支持下哦~
相关文章:
让AI帮我用java实现EasyExel读取图片—支持WPS嵌入图片
🌈 场景概述 java 小伙伴相信都使用 EasyExcel 以及 POI 库实现过 Excel 批量导入、导出功能,但只有部分人实现过 excel 导入带图片数据的场景。这个技术实现手段网上也有很多案例和demo,最常见的就是通过 XSSFPictureData 来实现。但是在 W…...
C# 实现对指定句柄的窗口进行键盘输入的实现
在C#中实现对指定句柄的窗口进行键盘操作,可以通过多种方式来实现。以下是一篇详细的指南,介绍如何在C#中实现这一功能。 1. 使用Windows API函数 在C#中,我们可以通过P/Invoke调用Windows API来实现对指定窗口的键盘操作。以下是一些关键的…...
深度学习之卷积问题
1 卷积在图像中有什么直观作用 在卷积神经网络中,卷积常用来提取图像的特征,但不同层次的卷积操作提取到的特征类型是不相同的,特征类型粗分如表1所示。 表1 卷积提取的特征类型 卷积层次特征类型浅层卷积边缘特征中层卷积局部特征深…...
yum安装zabbix5.0升级php到74的办法
【背景】 公司时不时有扫描漏洞,之前发现了php漏洞,因开启防火墙,限定IP+端口,暂时躲过升级;现在,老话重提,开启了KPI考核,躲是躲不过去的了,升级吧 【难题】 服务器为centos7,因操作系统问题,只能安装zabbix5.0。当时图省力,官网的办法,都是yum安装,很是简便。…...
JavaWeb合集23-文件上传
二十三 、 文件上传 实现效果:用户点击上传按钮、选择上传的头像,确定自动上传,将上传的文件保存到指定的目录中,并重新命名,生成访问链接,返回给前端进行回显。 1、前端实现 vue3AntDesignVue实现 <tem…...
当AI遇上时尚:未来的衣橱会由机器人来打理吗?
内容概要 在当今这个快速发展的时代,人工智能与时尚的结合正在逐渐改写我们对衣橱管理的认知。传统的衣橱管理常常面临着空间不足、穿搭单调及库存过多等挑战,许多人在挑选服饰时难以做出决策。然而,随着技术的进步,智能推荐和自…...
【初阶数据结构篇】二叉树OJ题
文章目录 须知 💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力! 👍 点赞、收藏与分享:觉得这篇文章对你有帮助吗࿱…...
Windows系统中Oracle VM VirtualBox的安装
一.背景 公司安排了师带徒,环境搭建问题一直是初级程序员头疼的事情,我记录一下这些基础的内容,方便初学者。大部分开发者的机器还是windows系统,所以写了怎么安装。 二.版本信息及 操作系统:windows11 家庭版…...
go语言使用总结(持续更新)
整理后的内容如下: 1. 先了解函数签名,再了解传入参数以及调用 函数签名是函数的声明部分,包括函数名、参数列表和返回值列表。理解函数签名是理解函数行为的第一步,尤其是在了解参数类型、参数数量和返回值类型等方面。通过了解…...
如何在Android中自定义property
在Android中创建自定义的属性(Android property)通常用于调试、性能调优或传递应用和系统之间的信息。 以下是如何在Android中创建和使用自定义属性的步骤: 1. 定义属性 在Android中,属性是以“属性名称属性值”形式定义的键值对…...
机器学习5_支持向量机_原问题和对偶问题——MOOC
目录 原问题与对偶问题的定义 定义该原问题的对偶问题如下 在定义了函数 的基础上,对偶问题如下: 综合原问题和对偶问题的定义得到: 定理一 对偶差距(Duality Gap) 强对偶定理(Strong Duality Theo…...
索引的细节
目录 什么是线性 搜索算法? 算法:二进制搜索算法 二进制搜索如何工作? 什么是二叉排序树? 构建二叉排序树 什么是AVL树? AVL树的性能分析 什么是线性 搜索算法? 线性搜索是一种非常简单的搜索算法。在…...
LeetCode 540.有序数组中的单一元素
思路一:hash,键存入元素,值存入次数,然后遍历,不是最优解 思路二:二分查找 假设数组为 [1, 1, 2, 2, 3, 4, 4],其中唯一出现一次的元素是 3。在一个有序数组中,如果没有唯一的元素&…...
【图文】【DIY便签】如何自行编译OPENCV使用动态库
1 去官网下载安装包和源码 下面红色圈中的是源码,绿色圈中的是安装包: 2 配置工具链 安装过程不说了,教程到处都是。编译的话使用CMAKE,配置如下: 上面两个路径分别是: 源码目录编译生成的文件放置的位…...
WordPress文章自动提交Bing搜索引擎:PHP推送脚本教程
随着网站SEO优化的重要性日益增加,将新发布的内容快速提交到搜索引擎显得尤为重要。尤其对于Bing站长平台,自动化推送能让Bing尽快发现和索引我们网站的新内容。本文将详细介绍如何通过PHP脚本自动推送WordPress当天发布的文章至Bing站长平台,确保新文章被Bing及时收录。 前…...
C++题目分享
嗨嗨嗨,我又来更新这个系列了,很久没更新了。让我们看一看有那些有趣的题目: 题目一: 1.以单链表作为存储结构,实现线性表的就地逆置(提示,就地逆置:在不使用额外的数据结构或空间…...
【Spring 框架】初识 Spring
文章目录 前言1. 什么是 Spring2. 什么是 Maven3. 第一个 SpringBoot 项目4. 项目讲解结语 前言 在前面我们一起学习了 JavaSE 的基础知识,随着学习的深入,我们也将逐步介绍 JavaEE 的内容,像 Spring 框架,Mybatis 等等。在本篇博…...
链表(Linkedlist)
序言 我们都了解链表是一种数据的存储结构,在Java使用中逻辑与c,c语言数据结构别无二致,但主要由于Java中不存在指针的说法,从而导致在实现过程中的代码不同,所以在学习的过程中我们无需过于担心,逻辑都是…...
信息安全工程师(79)网络安全测评概况
一、定义与目的 网络安全测评是指参照一定的标准规范要求,通过一系列的技术、管理方法,获取评估对象的网络安全状况信息,并对其给出相应的网络安全情况综合判定。其对象主要为信息系统的组成要素或信息系统自身。网络安全测评的目的是为了提高…...
保研考研机试攻略:python笔记(3)
🐨🐨🐨11sort 与 sorted 区别 sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。 list 的 sort 方法返回的是对已经存在的列表进行操作, 无返回值,而内建函数 sorted 方法返回的…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...
CTF show 数学不及格
拿到题目先查一下壳,看一下信息 发现是一个ELF文件,64位的 用IDA Pro 64 打开这个文件 然后点击F5进行伪代码转换 可以看到有五个if判断,第一个argc ! 5这个判断并没有起太大作用,主要是下面四个if判断 根据题目…...
MySQL基本操作(续)
第3章:MySQL基本操作(续) 3.3 表操作 表是关系型数据库中存储数据的基本结构,由行和列组成。在MySQL中,表操作包括创建表、查看表结构、修改表和删除表等。本节将详细介绍这些操作。 3.3.1 创建表 在MySQL中&#…...
机器学习复习3--模型评估
误差与过拟合 我们将学习器对样本的实际预测结果与样本的真实值之间的差异称为:误差(error)。 误差定义: ①在训练集上的误差称为训练误差(training error)或经验误差(empirical error&#x…...
