easyExcel - 按模板导出

目录

  • 前言
  • 一、情景介绍
  • 二、文档介绍
    • 2.1 读取模板
    • 2.2 填充模板
  • 三、代码示例
    • 3.1 案例一:工资表
    • 3.2 案例二:报价单
  • 四、我所遇到的问题


前言

Java-easyExcel入门教程:https://blog.csdn.net/xhmico/article/details/134714025

之前有介绍过如何使用 easyExcel,以及写了两个入门的 demo ,这两个 demo 能应付在开发中大多数的导入和导出需求,不过有时候面对一些复杂的表格,就会有点不够用,该篇是如何使用模板实现导出功能


一、情景介绍

在实际的开发过程中可能会遇到需要导出一些带有复杂表头的表格,比如:工资表和考勤表

在这里插入图片描述

在这里插入图片描述

或者是类似于发票、报价单这种具有模板性质的表格

在这里插入图片描述

在这里插入图片描述

如果仅仅通过代码去实现是比较困难的,通常情况下会写一个模板 excel,模板中的需要变动的数据用占位符替代,导出的文件按照该模板填充数据


二、文档介绍

easyexcel 也提供了根据模板写入的功能,可以用较为简单的方式实现上述功能,其基本步骤为:

  • ① 读取模板文件
  • ② 填充模板中的占位符

2.1 读取模板

官方文档:根据模板写入

在这里插入图片描述

在官方文档中给出了如何使用 easyexcel 读取模板的代码示例:

官网代码示例:

    /*** 根据模板写入* <p>1. 创建excel对应的实体对象 参照{@link IndexData}* <p>2. 使用{@link ExcelProperty}注解指定写入的列* <p>3. 使用withTemplate 写取模板* <p>4. 直接写即可*/@Testpublic void templateWrite() {String templateFileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";String fileName = TestFileUtil.getPath() + "templateWrite" + System.currentTimeMillis() + ".xlsx";// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭// 这里要注意 withTemplate 的模板文件会全量存储在内存里面,所以尽量不要用于追加文件,如果文件模板文件过大会OOM// 如果要再文件中追加(无法在一个线程里面处理,可以在一个线程的建议参照多次写入的demo) 建议临时存储到数据库 或者 磁盘缓存(ehcache) 然后再一次性写入EasyExcel.write(fileName, DemoData.class).withTemplate(templateFileName).sheet().doWrite(data());}

从上述示例代码中可以看到读取模板文件的方法为:withTemplate()

    public ExcelWriterBuilder withTemplate(InputStream templateInputStream) {this.writeWorkbook.setTemplateInputStream(templateInputStream);return this;}public ExcelWriterBuilder withTemplate(File templateFile) {this.writeWorkbook.setTemplateFile(templateFile);return this;}public ExcelWriterBuilder withTemplate(String pathName) {return this.withTemplate(new File(pathName));}

2.2 填充模板

官方文档:填充Excel

注意:这里建议先去看下官方文档中给的示例,会比较好理解

在这里插入图片描述

  • 在模板中占位符用 {变量} 表示,比如 {name}{age}
    在这里插入图片描述
  • 如果占位符为列表,则使用 {.变量} 表示,比如:{.name}{.age}
    在这里插入图片描述

进行填充的方法为:fill()

    public ExcelWriter fill(Object data, WriteSheet writeSheet) {return this.fill((Object)data, (FillConfig)null, writeSheet);}public ExcelWriter fill(Object data, FillConfig fillConfig, WriteSheet writeSheet) {this.excelBuilder.fill(data, fillConfig, writeSheet);return this;}public ExcelWriter fill(Supplier<Object> supplier, WriteSheet writeSheet) {return this.fill((Object)supplier.get(), (FillConfig)null, writeSheet);}public ExcelWriter fill(Supplier<Object> supplier, FillConfig fillConfig, WriteSheet writeSheet) {this.excelBuilder.fill(supplier.get(), fillConfig, writeSheet);return this;}

EasyExcel 中,FillConfig 类用于配置单元格填充相关的设置。

以下是一些 FillConfig 类中常用的配置项:

  • forceNewRow:是否强制写入到新行。当设置为 true 时,每次写入都会创建新的行,而不是在现有行上进行覆盖
  • direction:填充方向,可以指定是水平填充还是垂直填充
    • 属性:
      • WriteDirectionEnum.VERTICAL:垂直填充
      • WriteDirectionEnum.HORIZONTAL:水平填充

如果有多列组合填充的情况,通过 {前缀.变量} 的形式区分不同的列表,例如

使用 FillWrapper 构建 Excel 写入时的填充模板

			...excelWriter.fill(new FillWrapper("data1", data()), writeSheet);excelWriter.fill(new FillWrapper("data2", data()), writeSheet);excelWriter.fill(new FillWrapper("data3", data()), writeSheet);...

三、代码示例

简单介绍了 easyexcel 如何使用模板进行导出,接下来就通过几个简单的案例进行演示

以下案例使用的模板文件均可在文章顶部下载


3.1 案例一:工资表

编写 excel 模板:

在这里插入图片描述

实体类:

StaffSalaryEntity.java

import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class StaffSalaryEntity {@ApiModelProperty(value = "姓名")private String name;@ApiModelProperty(value = "职称")private String post;@ApiModelProperty(value = "月薪")private BigDecimal mouthSalary;@ApiModelProperty(value = "时薪")private BigDecimal hourSalary;@ApiModelProperty(value = "应出勤天数")private Double shouldAttend;@ApiModelProperty(value = "出勤天数")private Double actualAttend;@ApiModelProperty(value = "平时加班时数")private Double overtime;@ApiModelProperty(value = "周末加班时数")private Double weekOvertime;@ApiModelProperty(value = "国假天数")private Double holiday;@ApiModelProperty(value = "正班薪资")private BigDecimal normalSalary;@ApiModelProperty(value = "平时加班薪资")private BigDecimal overtimeSalary;@ApiModelProperty(value = "周末加班薪资")private BigDecimal weekOvertimeSalary;@ApiModelProperty(value = "国假薪资")private BigDecimal holidaySalary;@ApiModelProperty(value = "岗位津贴")private BigDecimal postSubsidy;@ApiModelProperty(value = "全勤补贴")private BigDecimal fullAttendSubsidy;@ApiModelProperty(value = "全勤奖")private BigDecimal award;@ApiModelProperty(value = "事假缺勤扣款")private BigDecimal deduction;@ApiModelProperty(value = "社保费用")private BigDecimal social;@ApiModelProperty(value = "应得薪资")private BigDecimal shouldSalary;@ApiModelProperty(value = "个人扣税")private BigDecimal selfTax;@ApiModelProperty(value = "实发薪资")private BigDecimal actualSalary;@ApiModelProperty(value = "员工签名")private BigDecimal sign;
}

实体类中的字段要跟模板中占位符中的变量对应

代码示例:

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.fill.FillConfig;
import com.mike.server.system.domain.excel.ProductOfferExcelEntity;
import com.mike.server.system.entity.StaffSalaryEntity;
import org.junit.jupiter.api.Test;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;public class TestDemo {/*** 案例一:工资表*/@Testpublic void salaryList() {// 模板文件路径String templateFilePath = "D:\\excel-files\\gzb-template.xlsx";// 输出文件路径String outFilePath = "D:\\excel-files\\gzb.xlsx";// 创建 ExcelWriter 实例ExcelWriter writer = EasyExcel// 写入到.write(outFilePath)// 指定模板.withTemplate(templateFilePath).build();WriteSheet sheet = EasyExcel.writerSheet().build();// 获取员工工资数据List<StaffSalaryEntity> staffSalaryEntities = getStaffSalaryEntities();FillConfig fillConfig = FillConfig.builder()// 开启填充换行.forceNewRow(true).build();// 执行填充操作writer.fill(staffSalaryEntities, fillConfig, sheet);// 结束writer.finish();}public List<StaffSalaryEntity> getStaffSalaryEntities() {List<StaffSalaryEntity> list = new ArrayList<>();list.add(StaffSalaryEntity.builder().name("米大傻").post("开发").mouthSalary(new BigDecimal(1320)).hourSalary(new BigDecimal("7.59")).shouldAttend(21.0).actualAttend(21.0).overtime(21.0).weekOvertime(8.0).holiday(0.0).normalSalary(new BigDecimal(1320)).overtimeSalary(new BigDecimal("238.97")).weekOvertimeSalary(new BigDecimal("242.76")).holidaySalary(new BigDecimal(0)).postSubsidy(new BigDecimal(0)).award(new BigDecimal(20)).deduction(new BigDecimal(0)).social(new BigDecimal("113.6")).shouldSalary(new BigDecimal("1688.12")).selfTax(new BigDecimal(0)).actualSalary(new BigDecimal("1688.1")).build());list.add(StaffSalaryEntity.builder().name("曹大力").post("店长").mouthSalary(new BigDecimal(13200)).hourSalary(new BigDecimal("7.59")).shouldAttend(21.0).actualAttend(21.0).overtime(21.0).weekOvertime(8.0).holiday(0.0).normalSalary(new BigDecimal(1320)).overtimeSalary(new BigDecimal("238.97")).weekOvertimeSalary(new BigDecimal("242.76")).holidaySalary(new BigDecimal(0)).postSubsidy(new BigDecimal(0)).award(new BigDecimal(20)).deduction(new BigDecimal(0)).social(new BigDecimal("113.6")).shouldSalary(new BigDecimal("13200.12")).selfTax(new BigDecimal(0)).actualSalary(new BigDecimal("13200.1")).build());list.add(StaffSalaryEntity.builder().name("张大仙").post("经理").mouthSalary(new BigDecimal(13200)).hourSalary(new BigDecimal("7.59")).shouldAttend(21.0).actualAttend(21.0).overtime(21.0).weekOvertime(8.0).holiday(0.0).normalSalary(new BigDecimal(1320)).overtimeSalary(new BigDecimal("238.97")).weekOvertimeSalary(new BigDecimal("242.76")).holidaySalary(new BigDecimal(0)).postSubsidy(new BigDecimal(0)).deduction(new BigDecimal(0)).social(new BigDecimal("113.6")).shouldSalary(new BigDecimal("13200.12")).selfTax(new BigDecimal(0)).actualSalary(new BigDecimal("13200.1")).build());return list;}
}

展示:

在这里插入图片描述


3.2 案例二:报价单

编写模板:

在这里插入图片描述

模板文件放在项目的 resources 目录下的 templates/excel 文件夹下

在这里插入图片描述

实体类:

OfferDetailEntity.java

import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class OfferDetailEntity {@ApiModelProperty(value = "公司名称")private String companyName;@ApiModelProperty(value = "报价日期")private String offerDate;@ApiModelProperty(value = "报价有效期")private String offerValidDate;@ApiModelProperty(value = "客户名称")private String customerName;@ApiModelProperty(value = "客户地址")private String customerAddress;@ApiModelProperty(value = "联系方式")private String contact;@ApiModelProperty(value = "合计数量")private Integer totalQty;@ApiModelProperty(value = "合计金额")private BigDecimal totalAmount;
}

ProductOfferEntity.java

import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import java.math.BigDecimal;@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ProductOfferEntity {@ApiModelProperty(value = "产品名称")private String productName;@ApiModelProperty(value = "型号及规格")private String typeSpec;@ApiModelProperty(value = "数量")private Integer quantity;@ApiModelProperty(value = "单价")private BigDecimal price;@ApiModelProperty(value = "金额")private BigDecimal amount;@ApiModelProperty(value = "备注")private String remark;}

代码示例:

TestController.java

    @GetMapping("/export/by-template")@ApiOperation(value = "导出-按模板格式", produces = "application/octet-stream")public ResponseBean<String> exportByTemplate(HttpServletResponse response) {testService.exportByTemplate(response);return ResponseBean.success();}

TestService.java

    /*** 导出-按模板格式*/void exportByTemplate(HttpServletResponse response);

TestServiceImpl.java

    @SneakyThrows@Overridepublic void exportByTemplate(HttpServletResponse response) {ServletOutputStream out = response.getOutputStream();EasyExcelUtil.initResponse(response, "报价单");// 文件模板输入流,将 excel 模板放到 resources 目录下InputStream templateFile = new ClassPathResource("templates/excel/bjd.xlsx").getInputStream();ExcelWriter writer = EasyExcel.write(out).withTemplate(templateFile).build();WriteSheet sheet = EasyExcel.writerSheet().build();/*HashMap<String, Object> offerDetail = new HashMap<>();offerDetail.put("companyName", "多加辣科技");offerDetail.put("offerDate", "2024-04-07");offerDetail.put("offerValidDate", "2024-04-11");offerDetail.put("customerName", "米大傻");offerDetail.put("customerAddress", "广东省广州市");offerDetail.put("contact", "078-182****4568");offerDetail.put("totalQty", 5);offerDetail.put("totalAmount", new BigDecimal(10300));*/OfferDetailEntity offerDetail = OfferDetailEntity.builder().companyName("多加辣科技").offerDate("2024-04-07").offerValidDate("2024-04-11").customerName("米大傻").customerAddress("广东省广州市").contact("078-182****4568").totalQty(5).totalAmount(new BigDecimal(10300)).build();// 填充普通占位符// 这里 data 使用对象或者 Map 都可以writer.fill(offerDetail, sheet);List<ProductOfferEntity> list = new ArrayList<>();list.add(ProductOfferEntity.builder().productName("电脑").typeSpec("联想").price(new BigDecimal(5000)).quantity(2).amount(new BigDecimal(10000)).build());list.add(ProductOfferEntity.builder().productName("鼠标").typeSpec("联想").price(new BigDecimal(100)).quantity(3).amount(new BigDecimal(300)).build());// 填充配置,开启组合填充换行FillConfig fillConfig = FillConfig.builder().forceNewRow(true).build();// 填充列表占位符writer.fill(list, fillConfig, sheet);//填充完成writer.finish();}

相关工具类:

EasyExcelUtil.java

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");}
}

测试:

在这里插入图片描述

在这里插入图片描述


四、我所遇到的问题

(1)驼峰命名导致填充数据失败

我在编写工资条案例时,最开始的模板如下:

在这里插入图片描述

导出效果:

在这里插入图片描述

数据都有,但是导出的表格中有些字段填充失败

这个我也不知道具体原因是为什么,不过测了几组数据之后,得出以下结论:

如果占位符中的变量采用的是驼峰命名的方式,且组成变量的 “单词” 存在过于简单的时就会出现该状况,比如说:

月薪的占位符 {.mSalary} 中的 mSalary 是由 msalary 组成,m 只有一个字母, {.mSalary} 填充不上,但是如果单独使用 {.m} 或者 {.salary} 却可以填充上去,或者把每个组成的单词写复杂一点,比如写成 {.mouthSalary} 也是可以填充上的

解决方案:要么就不要用驼峰命名,要么驼峰命名就写规范点,不要简写

(3)模板单元格样式消失

如果你使用模板导出发现有些单元格的样式消失了,比如:

在这里插入图片描述

这是因为在 write() 方法中添加了表格头的 class 对象

在这里插入图片描述

通过模板导出的方式不需要设置这个类对象,去掉即可

        ExcelWriter writer = EasyExcel.write(out).withTemplate(templateFile).build();



参考文章:

easyexcel导出excel表格:https://blog.csdn.net/qq_57732418/article/details/136944211

SpringBoot集成阿里EasyExcel导出excel高级实战:https://blog.csdn.net/Blueeyedboy521/article/details/128257388

springboot 使用 EasyExcel 通过模板导出EXCEL 带多个动态列表:https://www.cnblogs.com/guanxiaohe/p/17719954.html

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

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

相关文章

2024 年 3 月 Web3 游戏报告:市场趋势与投资动态

作者&#xff1a;stellafootprint.network 数据来源&#xff1a;Footprint Analytics GameFi Research 2024 年 3 月&#xff0c;比特币不断刷新纪录&#xff0c;成功跨越了月中的低谷。受益于宏观经济的积极态势&#xff0c;整个加密货币市场表现突出。与此同时&#xff0c…

实体抽取全解析:技术与实战

目录 一、前言二、实体抽取技术概览基于规则的实体抽取基于统计的实体抽取基于深度学习的实体抽取 三、实体抽取的发展历程早期的实体抽取方法基于规则和词典的方法基于特征的机器学习方法 深度学习时代的实体抽取从传统模型到神经网络序列标注模型的兴起预训练语言模型的革命 …

Java设计模式之创建型模式(二)原型模式

原型模式 1、原型模式1-1、应用场景1-2、举个 软栗子1-3、举个 硬栗子1-4、举个实务栗子1-5、代码重构 学习原型模式的目的&#xff1a;原型模式的目的在于通过复制现有的实例来创建新的对象&#xff0c;以避免通过构造函数创建对象时可能带来的性能开销&#xff0c;同时可以控…

2024mathorcup数学建模A 题思路分析-移动通信网络中 PCI 规划问题

# 1 赛题 A 题 移动通信网络中 PCI 规划问题 物理小区识别码(PCI)规划是移动通信网络中下行链路层上&#xff0c;对各覆盖 小区编号进行合理配置&#xff0c;以避免 PCI 冲突、 PCI 混淆以及 PCI 模 3 干扰等 现象。 PCI 规划对于减少物理层的小区间互相干扰(ICI)&#xff0c;增…

达梦使用disql登录数据库显示“未连接”

基础环境 操作系统&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo) 数据库版本&#xff1a;DM Database Server 64 V8 架构&#xff1a;单实例问题&#xff1a;达梦数据库在使用disql登录时&#xff0c;显示“未连接”。 指定了IP和端口号还是连接异常。 […

EFcore 6 连接oracle19 WinForm vs2022

用EFcore访问Oracle&#xff0c;终于不需要Oracle的什么安装包了&#xff0c;直接在VS2022中就可以轻松搞定。在csdn上看到一哥们的帖子&#xff0c;测试了一下&#xff0c;发现很方便。使用的场景是&#xff1a;VS2022中EFcore6。经过测试&#xff0c;同 Navicat Premium 16比…

【C++进阶】C++异常详解

C异常 一&#xff0c;传统处理错误方式二&#xff0c;C处理的方式三&#xff0c;异常的概念四&#xff0c;异常的使用4.1 异常和捕获的匹配原则4.2 函数调用链中异常栈展开匹配原则4.3 异常的重新抛出&#xff08;异常安全问题&#xff09;4.4 RAII思想在异常中的作用 五&#…

标定系列——Ubuntu18.04下opencv-4.5.3与opencv_contrib-4.5.3源码编译(二十)

Ubuntu18.04下opencv-4.5.3与opencv_contrib-4.5.3源码编译 说明下载安装步骤1.更新2.安装必要的依赖包3.下载源码包并解压4.终端运行如下命令5.添加配置路径6.验证安装是否成功 说明 Ubuntu18.04下对opencv-4.5.3与opencv_contrib-4.5.3源码编译 下载 CSDN下载 安装步骤 …

手写ArrrayList

需求 自定义的MyArrayList import java.util.Arrays; import java.util.Objects;public class MyArrayList<E> {private Object[] elementData ; // 存储元素的数组private int size; // 记录 的元素个数private static final int DEFAULT_CAPACITY 10; // 默认容量// …

提升编程效率的秘密武器:IntelliJ IDEA

IntelliJ IDEA的基本介绍 正如一个故事的开头&#xff0c;我们从一个名字开始 - IntelliJ IDEA。这是一个在程序员中广受欢迎的集成开发环境&#xff08;IDE&#xff09;&#xff0c;由捷克公司JetBrains开发。它的名字听起来有些复杂&#xff0c;但实际上&#xff0c;它的功能…

蓝桥杯备考day4

1.1 二分查找模板 bool check(int x) {// 进行某些操作 } // 二分查找函数 int binarySearch() {int l 1, r n; // 初始化左右边界while (r - l > 1) // 当右边界与左边界相差大于1时{int mid (l r) >> 1; // 取中间位置if (check(mid)) // 如果满足条件r mid; …

第十一届蓝桥杯大赛第二场省赛试题 CC++ 研究生组-七段码

#include<iostream> using namespace std; const int N 10, M 7; int e[N][N] {0}, f[N], open[N];//e[i][j]表示i和j之间是否连通&#xff1b;f[i]表示结点i的父节点&#xff1b;open[i] 1表示结点i打开&#xff0c;0表示关闭 long long ans 0;int find(int x){if(…

PP-LCNet:一种轻量级CPU卷积神经网络

PP-LCNet: A Lightweight CPU Convolutional Neural Network 最近看了一个新的分享&#xff0c;在图像分类的任务上表现良好&#xff0c;具有很高的实践意义。 论文&#xff1a; https://arxiv.org/pdf/2109.15099.pdf项目&#xff1a; https://github.com/PaddlePaddle/Padd…

AMD Tensile 简介与示例

按照知其然&#xff0c;再知其所以然的认知次序进行 1&#xff0c;下载代码 git clone --recursive https://github.com/ROCm/Tensile.git 2&#xff0c;安装 Tensile cd Tensile mkdir build cd build ../Tensile/bin/Tensile ../Tensile/Configs/rocblas_dgemm_nn_asm_full…

微信小程序(六)定位搜索

一、引言 作者上一章讲了微信小程序的地图实现微信小程序&#xff08;五&#xff09;地图-CSDN博客&#xff0c;但是还有一个功能是和地图紧密结合的&#xff0c;那就是位置搜索定位&#xff0c;这里作者讲讲实现和原理&#xff0c;包括城市筛选。 二、定位搜索实现 1、位置搜…

mysql查看数据库表容量大小

【推荐】单表行数超过 500 万行或者单表容量超过 2GB&#xff0c;才推荐进行分库分表。 说明&#xff1a;如果预计三年后的数据量根本达不到这个级别&#xff0c;请不要在创建表时就分库分表。 1. 查询所有数据库记录数和容量 SELECTtable_schema AS 数据库,SUM(table_rows) …

用vue.js写案例——ToDoList待办事项 (步骤和全码解析)

目录 一.准备工作 二.编写各个组件的页面结构 三.实现初始任务列表的渲染 四.新增任务 五.删除任务 六.展示未完成条数 七.切换状态-筛选数据 八.待办事项&#xff08;全&#xff09;代码 一.准备工作 在开发“ToDoList”案例之前&#xff0c;需要先完成一些准备工作&a…

图像处理与视觉感知---期末复习重点(7)

文章目录 一、图像压缩1.1 三种冗余1.2 模型1.3 信息测量 二、无误差压缩2.1 哈夫曼编码2.1.1 步骤2.1.2 例题 2.2 算术编码 三、变换编码 一、图像压缩 1.1 三种冗余 1. 三种基本的是数据冗余为&#xff1a;编码冗余、像素间冗余、心理视觉冗余。 2. 编码冗余&#xff1a;如果…

蓝桥杯——玩具蛇

题目 小蓝有—条玩具蛇&#xff0c;一共有16节&#xff0c;上面标着数字1至16。每—节都是一个正方形的形状。相邻的两节可以成直线或者成90度角。 小蓝还有一个44的方格盒子&#xff0c;用于存放玩具蛇&#xff0c;盒子的方格上依次标着字母A到Р共16个字母。 小蓝可以折叠自…

浙大恩特客户资源管理系统 i0004_openFileByStream.jsp 任意文件读取漏洞复现

0x01 产品简介 浙大恩特客户资源管理系统是一款针对企业客户资源管理的软件产品。该系统旨在帮助企业高效地管理和利用客户资源,提升销售和市场营销的效果。 0x02 漏洞概述 浙大恩特客户资源管理系统 i0004_openFileByStream.jsp接口处存在任意文件读取漏洞,未经身份验证攻…