【Java】若依框架(ruoyi-master)——12.Excel简析

news/2024/11/14 8:32:05/文章来源:https://www.cnblogs.com/luyj00436/p/18545211

最近学习在JAVA中读写Excel 。也学习了自定义注解的使用。

在若依框架中,如何导入导出数据呢?我们使用任意一个表格,自定义生成代码。可知。

  1. 生成的对象会添加自定义的@Excel注解;
  2. Controller包含导出方法;导出方法引用了自定义的工具类ExcelUtils
public class Student extends BaseEntity
{// ……/** 学生名称 */@Excel(name = "学生名称")private String studentName;// ……
}
@Controller
@RequestMapping("/base/student")
public class StudentController extends BaseController
{/*** 导出学生信息列表*/@RequiresPermissions("base:student:export")@Log(title = "学生信息", businessType = BusinessType.EXPORT)@PostMapping("/export")@ResponseBodypublic AjaxResult export(Student student){List<Student> list = studentService.selectStudentList(student);ExcelUtil<Student> util = new ExcelUtil<Student>(Student.class);return util.exportExcel(list, "学生信息数据");}
}

导出的Excel表格,每一列的名称与注解@Excel的name属性对应。

原理简析

若依框架中如何实现Excel导入、导出呢?

  1. 新建自定义注解@Excel@Excels ,需要Excel导入或导出的对象,添加@Excel注解。
  2. 使用 Apache POI,创建Excel工具类ExcelUtils,在工具类的方法中必要时读取@Excel属性,并读、写、填充,生成Excel表。
  3. 需要导入导出Excel时(通常接口方法),引用工具类。

可以看到主配置文件和依赖框架common中都引用了POI。

 <!-- excel工具 -->
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>${poi.version}</version>
</dependency>

common框架集,com.ruoyi.commom.annotation,包含了Excel的注解。

1731456814369

查看自定义注解源码Excel.java。这里包含了导出到Excel的名字、排序、格式、单元格、字体样式、字段类型(导出导入、仅导出、仅导入)等各种属性。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Excel
{/*** 导出时在excel中排序*/public int sort() default Integer.MAX_VALUE;/*** 导出到Excel中的名字.*/public String name() default "";/*** 日期格式, 如: yyyy-MM-dd*/public String dateFormat() default "";/*** 如果是字典类型,请设置字典的type值 (如: sys_user_sex)*/public String dictType() default "";/*** 读取内容转表达式 (如: 0=男,1=女,2=未知)*/public String readConverterExp() default "";/*** 分隔符,读取字符串组内容*/public String separator() default ",";/*** BigDecimal 精度 默认:-1(默认不开启BigDecimal格式化)*/public int scale() default -1;/*** BigDecimal 舍入规则 默认:BigDecimal.ROUND_HALF_EVEN*/public int roundingMode() default BigDecimal.ROUND_HALF_EVEN;/*** 导出时在excel中每个列的高度*/public double height() default 14;/*** 导出时在excel中每个列的宽度*/public double width() default 16;/*** 文字后缀,如% 90 变成90%*/public String suffix() default "";/*** 当值为空时,字段的默认值*/public String defaultValue() default "";/*** 提示信息*/public String prompt() default "";/*** 设置只能选择不能输入的列内容.*/public String[] combo() default {};/*** 是否从字典读数据到combo,默认不读取,如读取需要设置dictType注解.*/public boolean comboReadDict() default false;/*** 是否需要纵向合并单元格,应对需求:含有list集合单元格)*/public boolean needMerge() default false;/*** 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写.*/public boolean isExport() default true;/*** 另一个类中的属性名称,支持多级获取,以小数点隔开*/public String targetAttr() default "";/*** 是否自动统计数据,在最后追加一行统计数据总和*/public boolean isStatistics() default false;/*** 导出类型(0数字 1字符串 2图片)*/public ColumnType cellType() default ColumnType.STRING;/*** 导出列头背景颜色*/public IndexedColors headerBackgroundColor() default IndexedColors.GREY_50_PERCENT;/*** 导出列头字体颜色*/public IndexedColors headerColor() default IndexedColors.WHITE;/*** 导出单元格背景颜色*/public IndexedColors backgroundColor() default IndexedColors.WHITE;/*** 导出单元格字体颜色*/public IndexedColors color() default IndexedColors.BLACK;/*** 导出字段对齐方式*/public HorizontalAlignment align() default HorizontalAlignment.CENTER;/*** 自定义数据处理器*/public Class<?> handler() default ExcelHandlerAdapter.class;/*** 自定义数据处理器参数*/public String[] args() default {};/*** 字段类型(0:导出导入;1:仅导出;2:仅导入)*/Type type() default Type.ALL;public enum Type{ALL(0), EXPORT(1), IMPORT(2);private final int value;Type(int value){this.value = value;}public int value(){return this.value;}}public enum ColumnType{NUMERIC(0), STRING(1), IMAGE(2), TEXT(3);private final int value;ColumnType(int value){this.value = value;}public int value(){return this.value;}}
}

common框架集,com.ruoyi.commom.utils.poi,包含Excel的工具类ExcelUtils和Excel数据格式处理适配器ExcelHandlerAdapter

我们之前学过注解的使用。

@Test
public void testAnnotation() {try {Method method = MyAnnotationTest.class.getMethod("exampleMethod");if(method.isAnnotationPresent(MyAnnotation.class)){MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);System.out.println(annotation.value());System.out.println(annotation.number());System.out.println(annotation.isTrue());}} catch (NoSuchMethodException e) {throw new RuntimeException(e);}
}

我们可以根据getAnnotation获取到注解的值。然后根据得到的注解值。比如当前字段,private String studentName@Excel属性name的取值为学生名称。然后用”学生名称“作为下一步导出的方法。

发现方法 getFields获取字段注解, writeSheet 创建写入数据到sheet,annotationDataStyles根据Excel注解创建表格列样式。这些方法,导入方法(inport)和导出方法export会间接引用。

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

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

相关文章

Mysql篇-三大日志

概述undo log(回滚日志):是 Innodb 存储引擎层生成的日志,实现了事务中的原子性,主要用于事务回滚和 MVCC。 redo log(重做日志):是 Innodb 存储引擎层生成的日志,实现了事务中的持久性,主要用于掉电等故障恢复; binlog (归档日志):是 Server 层生成的日志,主要…

客户端 web 测试

单功能测试 单功能: 软件程序或应用程序只提供一项核心功能或特性, 而不包含其他附加功能. 这些功能都是独立的.以测试登录功能为例, 要测试登录的话, 要先准备一些资料, 最常见的资料有产品的原型设计, 以及设计的时候的需求文档, 有了这些数据之后应该如何开展测试呢?要把这…

memtest86测试工具排查内存故障

该方法适用于服务器数量较多的场景,通过BMC挂载镜像文件逐个进行测试。 1、将memtest86-pro-usb.zip解压。2、打开BMC的Java控制台,在Virtual Media菜单中选择Virtual Storage3、在Virtual Storage对话框中,Logical Drive Type选择HD Image,然后选择本机的memtest86-pro-us…

Microsoft System Center 2025 Multilanguage - Windows 服务器管理软件

Microsoft System Center 2025 Multilanguage - Windows 服务器管理软件Microsoft System Center 2025 Multilanguage - Windows 服务器管理软件 Windows 服务器部署、配置、管理和监控软件 请访问原文链接:https://sysin.org/blog/microsoft-system-center-2025/ 查看最新版。…

dotnet 记龙芯麒麟教育版安全中心拦截文件 导致 docker 内 CI CD 构建失败

本文记录我在龙芯旧世界的麒麟教育版系统上,使用 docker 对 dotnet 进行构建和打包过程中,因为安全中心拦截而出现奇怪的问题以下是我打包构建过程中遇到的文件没权限或被占用或 Mutex 失败等信息 使用 GitLab Runner 拉取项目时,遇到的报错信息如下 Running with gitlab-ru…

dotnet 9 WPF 连字符渲染支持

连字符渲染功能是 WPF 呼声很高的一个功能,核心需求方是使用 Visual Studio 的开发者们。开发者们期望使用连字符的时候可以进行连字符渲染,让开发过程中的视觉效果更加。于是作为 Visual Studio 的基础设施的 WPF 就要承担此功能的实现。经过漫长的开发,终于在 dotnet 9 里…

读数据质量管理:数据可靠性与数据质量问题解决之道03数据目录

数据目录1. 同步数据 1.1. 不同的数据仓库和数据湖通过数据集成层来进行桥接 1.2. AWS Glue、Fivetran和Matillion等数据集成工具从不同来源收集数据,统一这些数据,并将其转换为上游来源 1.3. 数据集成的一个典型用例是收集数据湖的数据并以结构化格式将其加载到数据仓库中 1…

内视图和跨视图几何知识进行立体匹配

内视图和跨视图几何知识进行立体匹配几何知识已被证明对立体匹配任务有益。然而,之前将几何见解整合到立体匹配算法中的尝试,主要集中在单个图像的几何知识上,而忽略了遮挡和匹配唯一性等关键的交叉视图因素。为了解决这一差距,提出了一种新的内视图和跨视图几何知识学习网…

RHEL9.4上创建RockyLinux9.4虚拟机

日期:2024.11.13 计划:在LANbridge网段里安装RockyLinux9.4虚拟机,IP地址10.31.0.1,用于搭建dhcp服务器 参照:鸟哥Linux私房菜 马哥教育王晓春老师课程TOPO结构如图之前安装rhle8的时候写了自动化安装的脚本,现在只需要简单修改一下再执行,无需手动编辑xml文件,就可以创…

REHL8.1上配置路由的nftables防火墙策略

日期:2024.11.9 参照:鸟哥私房菜-第七章、Linux 防火牆設定 https://linux.vbird.org/linux_server/rocky9/0180firewall.php在RHEL8.1的安装过程中没有注册,目前yum源不能用,先注册 [root@RHEL8 ~]# dnf repoinfo Updating Subscription Management repositories. Unable …

数据采集第四次实验

作业1 仓库链接:https://gitee.com/jyppx000/crawl_project 作业① 要求:熟练掌握 Selenium 查找HTML元素、爬取Ajax网页数据、等待HTML元素等内容。 使用Selenium框架+ MySQL数据库存储技术路线爬取“沪深A股”、“上证A股”、“深证A股”3个板块的股票数据信息。1.1 代码和…

用python或使用Linux终端中的awk命令,处理文件并提取其中的IP地址(文末有代码,可直接使用)

题目:我有一个日志文件如图所示,我要取出文件中所有的IP地址,以方便我将其加入到防火墙的黑名单中 代码中所用到的正则表达式介绍: python使用的正则表达式是:对该正则表达式的解释:\b(?:\d{1,3}\.){3}\d{1,3}\b\b:单词边界。确保IP地址前后不与其他字符连接。 (?:\…