文件导入导出【开发实践】

文章目录

  • 一、背景和基础知识
    • 1.1 文件导入
    • 1.2 文件导出
    • 1.3 技术背景
    • 1.4 Excel的基本知识
    • 1.5 文件导入/导出流程
  • 二、使用EasyExcel完成读写Excel操作
    • 2.1 创建实体类并完成映射
      • 2.1.1 用在字段上的注解
        • 2.1.1.1 `@ExcelProperty`(最重要)
        • 2.1.1.2 `@ColumnWidth`
        • 2.1.1.3 `@ContentRowHeight`
        • 2.1.1.4 `@ContentStyle`
        • 2.1.1.5 `@ExcelIgnore`
      • 2.1.2 用在类上的注解
        • 2.1.2.1 `@ExcelIgnoreUnannotated`
        • 2.1.2.2 `@HeadStyle`
        • 2.1.2.3 `@HeadRowHeight`
      • 2.1.3 用在方法上的注解
        • 2.1.3.1 `@ExcelCollection`
    • 2.2 完成数据转换
      • 2.2.1 向Sheet写数据
        • 2.2.1.1 批量写
        • 2.2.1.2 遍历写(包含单次写)
      • 2.2.2 从Sheet读数据
  • 三、文件的上传与下载
    • 3.1 上传
    • 3.2 同步下载
  • 参考链接

一、背景和基础知识

文件导入导出功能是许多软件系统的常用功能,它允许用户将数据在不同系统、格式之间进行传输和交换。

文件导入导出功能使用的文件通常是CSV、EXCEL、XML文件。

1.1 文件导入

文件导入是指将外部文件上传到当前系统。这个过程通常涉及文件格式的识别、数据解析和持久化等步骤。

常见业务场景:批量处理数据。

1.2 文件导出

文件导出则是指将系统内部的数据转换并保存为外部文件。

常见业务场景:生成报表(用于分析和汇报),数据备份。

1.3 技术背景

Java中的文件导入导出功能最底层基于java.iojava.nio实现。针对特定类型的文件的导入导出功能,可以使用相应的框架来实现,如针对CSV文件的Apache Commons CSV和OpenCSV,针对Excel文件的Apache POI和EasyExcel等。

EasyExcel(com.alibaba.excel)是阿里开源的读写Excel文件的框架,优点是使用简单且内存占用很小(一行一行读取到内存,而不是像poi那样一次性全部读入内存)。后文将以EasyExcel为例来介绍EasyExcel文件的读写功能。

1.4 Excel的基本知识

工作簿(Workbook):一个Excel文件就是一个工作簿,它相当于一个容器,可以包含多个工作表。

工作表(Sheet):工作表是Excel工作簿中的一页,是实际存储数据的地方。每个工作表由行(ROW)和列(Column)组成,行号从1开始,列号则用字母表示,从A开始。默认情况下,一个新的Excel工作簿包含三个工作表,最多可达255个。

单元格(Cell):在Excel中,单元格是构成工作表的基本元素,是表格中行与列交叉的部分,每个单元格都有其唯一的地址,由列字母和行数字组成,比如"A1"代表的是A列与第1行交叉处的单元格。

表头(Head):工作表的最前面几行部分,用于标识各列的含义。最简单的表头就是第一行对应的部分。

1.5 文件导入/导出流程

  1. 创建实体类,完成属性和列之间的映射
  2. 完成数据转换(表格数据和列表数据之前的转换)
  3. 从request读取文件/向response写入文件(文件上传与下载)

二、使用EasyExcel完成读写Excel操作

2.1 创建实体类并完成映射

2.1.1 用在字段上的注解

2.1.1.1 @ExcelProperty(最重要)

用于指定某属性对应Excel表格中的列,主要属性如下:

  • value:根据列名/表头名来映射属性(和value二选一)。
  • index:根据(从0开始的)索引来映射属性(和index二选一)。
  • converter:指定一个实现了Converter接口的类来完成类型转换。
  • format:用来设置日期或其他类型的数据的格式。
2.1.1.2 @ColumnWidth

用于设置列的宽度,单位是字符长度,只有一个属性value,值最大为255。

2.1.1.3 @ContentRowHeight

用在字段上是用于设置行的高度,也可以用在类上,从而应用于所有字段。

2.1.1.4 @ContentStyle

用于设置单元格的格式,关键属性如下:

  • dataFormat:用来设置日期或其他类型的数据的格式。
  • hidden:用于控制单元格是否隐藏(用于隐藏一些不需要直接展示的细节)。
  • locked:控制单元格是否锁定,锁定的单元格内容不能被修改。
  • quotePrefix:当设置为true时,会在单元格内容前增加单引号,这通常用于指示Excel将数字或公式作为文本处理,避免自动格式化带来的误解。
  • horizontalAlignment:设置单元格内容的水平对齐方式,可以通过指定HorizontalAlignmentEnum枚举值来实现。
  • verticalAlignment:设置单元格内容的垂直对齐方式,可以通过指定VerticalAlignmentEnum枚举值来实现。
  • wrapped:布尔类型,决定单元格中的文本是否自动换行。如果设置为true,长文本将会在单元格内换行显示,确保内容完整可见,而不是被截断。
2.1.1.5 @ExcelIgnore

指示EasyExcel在读写时忽略该字段。

2.1.2 用在类上的注解

2.1.2.1 @ExcelIgnoreUnannotated

指示EasyExcel仅处理被@ExcelProperty等注解标记的字段,忽略未标注的字段。

2.1.2.2 @HeadStyle

用于设置Excel表头的样式,如背景色、字体样式等(用到时自己查具体怎么用)。

2.1.2.3 @HeadRowHeight

设置表头行的高度,使表头更加突出或适应复杂的表头设计。

2.1.3 用在方法上的注解

2.1.3.1 @ExcelCollection

在集合属性的getter方法上使用,用于处理集合类型的属性(用到时自己查具体怎么用)。

在导出数据到Excel时,可以将一个对象的集合属性展开,使得集合中的每个元素都能在Excel中占据一行或多行,从而形成一个二维表格区域。

从Excel读取数据时,可以识别出指定的连续区域,然后将这些数据重新组装成集合,赋值给实体类的集合属性。

2.2 完成数据转换

对于临时的读写需求,也可以不用实体类,而是使用JSON对象或Map对象,这里就不介绍了。

2.2.1 向Sheet写数据

2.2.1.1 批量写
	// 为了简洁,本文的演示代码都省略了try-catch,并不规范

	// 设置排除的属性 也可以在数据模型的字段上加@ExcelIgnore注解排除
    Set<String> excludeFields = new HashSet<>();
    excludeFields.add("col1");
    excludeFields.add("col2");
    // 写Excel
    EasyExcel.write(filename, Entity.class)
            .excludeColumnFiledNames(excludeFields)
            .sheet(SheetName)
            .doWrite(entityList);
2.2.1.2 遍历写(包含单次写)

这样的好处是可以根据遍历到的元素信息决定写不写,如何写(如换sheet)。

	// 1. 创建ExcelWriter对象
	ExcelWriter excelWriter = EasyExcel.write(fileName, Entity.class).build();
	// 2. 创建sheet对象
	WriteSheet writeSheet = EasyExcel.writerSheet(sheetName).build();
	// 3. 遍历数据
	for (Entity entity : entityList) {
		// 4. 将entity写入指定Excel的指定Sheet的末尾
		excelWriter.write(entity, writeSheet);
	}
	// 5. 关闭流
	excelWriter.finish()

2.2.2 从Sheet读数据

	// 1. 创建ExcelReader对象
		// analysisEventListener是可选的,每读一行数据,都会使用该监听器处理一次
	ExcelReader excelReader = EasyExcel.read(fileName, Entity.class, analysisEventListener).build();
	// 2. 创建Sheet对象(按序号获取指定Sheet)
	ReadSheet sheet = EasyExcel.readSheet(0).build();
	// 3. 读取Sheet到Entity(excelReader可以用readAll读取所有sheet)
	List<Entity> entityList = excelReader.read(sheet);
	// 4. 关闭流
	excelReader.finish();

三、文件的上传与下载

3.1 上传

通过请求输入流完成文件的同步上传。

在处理器方法的参数里用MultipartFile file接收文件,然后使用EasyExcel.read来获取file对应的ExcelReader对象。后续使用ExcelReader获取Sheet对象读取即可。

    @PostMapping("/upload")
    @ResponseBody
    public String upload(MultipartFile file) throws IOException {
        EasyExcel.read(file.getInputStream(), Product.class, new MyListener(productService));
        ...
        return "success";
    }

3.2 同步下载

通过请求输出流完成文件的同步下载。

	response.setContentType("application/vnd.ms-excel");
    response.setCharacterEncoding("utf-8");
    response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8"));
    ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build();

	// 之后使用ExcelWriter完成写Excel操作即可
	...

参考链接

EasyExce官网
EasyExcel实现Excel文件导入导出

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Springboot的音乐翻唱与分享平台

基于SpringbootVue的音乐翻唱与分享平台设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页 音乐资讯 音乐翻唱 在线听歌 后台登录 后台首页 用户管理 音乐资讯管理…

Elasticsearch:探索 11 种流行的机器学习算法

作者&#xff1a;来自 Elastic Elastic Platform Team 过去几年中&#xff0c;机器学习&#xff08;ML&#xff09;已经悄然成为我们日常生活中不可或缺的一部分。它影响着从购物网站和流媒体网站上的个性化推荐&#xff0c;到保护我们的收件箱免受我们每天收到的大量垃圾邮件的…

3.9设计模式——Strategy 策略模式(行为型)

意图 定义一系列的算法&#xff0c;把它们一个个封装起来&#xff0c;并且使他们可以相互替换此模式使得算法可以独立于使用它们的客户而变化 结构 Strategy&#xff08;策略&#xff09;定义所有支持的算法的公共入口。Context使用这个接口来调用某ConcreteStrategy定义的方…

手撕spring框架(2)

相关系列 java中spring底层核心原理解析&#xff08;1&#xff09;-CSDN博客 java中spring底层核心原理解析(2)-CSDN博客 手撕spring框架&#xff08;1&#xff09;-CSDN博客 依赖注入原理 依赖注入(Dependency Injection&#xff0c;简称DI)是一种设计模式&#xff0c;它允许我…

DS高阶:图论基础知识

一、图的基本概念及相关名词解释 1.1 图的基本概念 图是比线性表和树更为复杂且抽象的结&#xff0c;和以往所学结构不同的是图是一种表示型的结构&#xff0c;也就是说他更关注的是元素与元素之间的关系。下面进入正题。 图是由顶点集合及顶点间的关系组成的一种数据结构&…

深入浅出DBus-C++:Linux下的高效IPC通信

目录标题 1. DBus简介2. DBus-C的优势3. 安装DBus-C4. 使用DBus-C初始化和连接到DBus定义接口和方法发送和接收信号 5. dbus-cpp 0.9.0 的安装6. 创建一个 DBus 服务7. 客户端的实现8. 编译和运行你的应用9. 瑞芯微&#xff08;Rockchip&#xff09;的 Linux 系统通常会自带 db…

上位机开发PyQt(五)【Qt Designer】

PyQt5提供了一个可视化图形工具Qt Designer&#xff0c;文件名为designer.exe。如果在电脑上找不到&#xff0c;可以用如下命令进行安装&#xff1a; pip install PyQt5-tools 安装完毕后&#xff0c;可在如下目录找到此工具软件&#xff1a; %LOCALAPPDATA%\Programs\Python\…

智能体可靠性的革命性提升,揭秘知识工程领域的参考架构新篇章

引言&#xff1a;知识工程的演变与重要性 知识工程&#xff08;Knowledge Engineering&#xff0c;KE&#xff09;是一个涉及激发、捕获、概念化和形式化知识以用于信息系统的过程。自计算机科学和人工智能&#xff08;AI&#xff09;历史以来&#xff0c;知识工程的工作流程因…

【Web】2024XYCTF题解(全)

目录 ezhttp ezmd5 warm up ezMake ez?Make εZ?мKε? 我是一个复读机 牢牢记住&#xff0c;逝者为大 ezRCE ezPOP ezSerialize ezClass pharme 连连看到底是连连什么看 ezLFI login give me flag baby_unserialize ezhttp 访问./robots.txt 继…

ChatGPT向付费用户推“记忆”功能,可记住用户喜好 | 最新快讯

4月30日消息&#xff0c;人工智能巨头OpenAI宣布&#xff0c;其开发的聊天机器人ChatGPT将在除欧洲和韩国以外的市场全面上线“记忆”功能。这使得聊天机器人能够“记住”ChatGPT Plus付费订阅用户的详细信息&#xff0c;从而提供更个性化的服务。 OpenAI早在今年2月就已经宣布…

无缝对接配电自动化:IEC104转OPC UA网关解决方案

随着水电厂自动化发展的要求&#xff0c;具有一定规模的梯级水电站越来越多&#xff0c;为了实现水电站的无人值班(少人值守)&#xff0c;并考虑到节能控制&#xff0c;电厂采用了集中监控。集中监控关注的是整个电网的安全稳定运行及电压、频率和整个电网的电力需求&#xff0…

C++必修:类与对象(二)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 贝蒂的主页&#xff1a;Betty’s blog 1. 构造函数 1.1. 定义 构造函数是一个特殊的成员函数&#xff0c;名字与类名相…

软件工程物联网方向嵌入式系统复习笔记--如何控制硬件

5-如何控制硬件 #mermaid-svg-of9KvkxJqwLjSYzH {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-of9KvkxJqwLjSYzH .error-icon{fill:#552222;}#mermaid-svg-of9KvkxJqwLjSYzH .error-text{fill:#552222;stroke:#552…

vue3步骤条带边框点击切换高亮

如果是div使用clip-path: polygon(0% 0%, 92% 0%, 100% 50%, 92% 100%, 0% 100%, 8% 50%);进行裁剪加边框没实现成功。目前这个使用svg完成带边框的。 形状可自行更改path 标签里的 :d“[num ! 1 ? ‘M 0 0 L 160 0 L 176 18 L 160 38 L 0 38 L 15.5 18 Z’ : ‘M 0,0 L 160,0…

Docker: 如何不新建容器 修改运行容器的端口

目录 一、修改容器的映射端口 二、解决方案 三、方案 一、修改容器的映射端口 项目需求修改容器的映射端口 二、解决方案 停止需要修改的容器 修改hostconfig.json文件 重启docker 服务 启动修改容器 三、方案 目前正在运行的容器 宿主机的3000 端口 映射 容器…

2024最新版JavaScript逆向爬虫教程-------基础篇之常用的编码与加密介绍(python和js实现)

目录 一、编码与加密原理1.1 ASCII 编码1.2 详解 Base641.2.1 Base64 的编码过程和计算方法1.2.2 基于编码的反爬虫设计1.2.3 Python自带base64模块实现base64编码解码类封装 1.3 MD5消息摘要算法1.3.1 MD5 介绍1.3.2 Python实现md5以及其他常用消息摘要算法封装 1.4 对称加密与…

【GitHub】github学生认证,在vscode中使用copilot的教程

github学生认证并使用copilot教程 写在最前面一.注册github账号1.1、注册1.2、完善你的profile 二、Github 学生认证注意事项&#xff1a;不完善的说明 三、Copilot四、在 Visual Studio Code 中安装 GitHub Copilot 扩展4.1 安装 Copilot 插件4.2 配置 Copilot 插件&#xff0…

Java设计模式 _结构型模式_组合模式

一、组合模式 1、组合模式 组合模式&#xff08;Composite Pattern&#xff09;是这一种结构型设计模式。又叫部分整体模式。组合模式依据树形结构来组合对象&#xff0c;用来表示部分以及整体层次关系。即&#xff1a;创建了一个包含自己对象组的类&#xff0c;该类提供了修改…

Educational Codeforces Round 165 (Rated for Div. 2)[A~D]

这场签到很快那会rank1400吧&#xff0c;但到c就写不动了&#xff0c;最后排名也是3000 左右&#xff0c;可见很多人其实都不会写dp。快速签到也很重要啊&#xff01;&#xff01; A. Two Friends Problem - A - Codeforces 题目大意&#xff1a; M有n个朋友&#xff0c;编号…

【Java】java实现文件上传和下载(上传到指定路径/数据库/minio)

目录 上传到指定路径 一、代码层级结构 二、文件上传接口 三、使用postman进行测试&#xff1b; MultipartFile接收前端传递的文件&#xff1a;127.0.0.1:8082/path/uploadFile part接收前端传递的文件&#xff1a;127.0.0.1:8082/path/uploadFileByRequest 接收前端传递…
最新文章