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

文章目录

  • 一、背景和基础知识
    • 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");// 写ExcelEasyExcel.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")@ResponseBodypublic 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.mzph.cn/news/830783.shtml

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

相关文章

低代码工业组态数字孪生平台

2024 两会热词「新质生产力」凭借其主要特征——高科技、高效能及高质量&#xff0c;引发各界关注。在探索构建新质生产力的重要议题中&#xff0c;数据要素被视为土地、劳动力、资本和技术之后的第五大生产要素。数据要素赋能新质生产力发展主要体现为&#xff1a;生产力由生产…

springcloud中Gateway基本配置包含原理与示例

Gateway基本配置包含原理与示例 一、Gateway简介 Gateway是Spring Cloud生态系统中的一个基于Spring Framework 5&#xff0c;Project Reactor和Spring Boot 2的API网关服务。它旨在为微服务架构提供一种简单而有效的方式来路由请求、过滤请求以及对请求进行转换。Gateway可以…

【linuxC语言】fcntl和ioctl函数

文章目录 前言一、功能介绍二、具体使用2.1 fcntl函数2.2 ioctl函数 三、拓展&#xff1a;填写arg总结 前言 在Linux系统编程中&#xff0c;经常会涉及到对文件描述符、套接字以及设备的控制操作。fcntl和ioctl函数就是用来进行这些控制操作的两个重要的系统调用。它们提供了对…

Visual Studio中怎样更改Nuget程序包源

场景 Visual Studio 2019 在使用NuGet添加依赖包时&#xff0c;在预览中搜索不到程序包。 排查下NuGet的程序包源为本地。 将程序包源修改下。 实现 在解决方案上右击选择管理解决方案中的NuGet程序包(在 Visual Studio 中打开“工具”>“选项”>“NuGet 包管理器”…

请求路径引发的http308错误

记录一个请求路径输错引发的问题。 正确路径&#xff1a; /user/bind-email 请求路径我们如果输错故意多打一个s /user/bind-emails 正常预检请求会报错404未找到&#xff0c;我们下意识的就去排查路径是不是写错了 但是如果多打一个/ /user//bind-email 此时预检请求会报308永…

Linux 指令lsblk 作用,以及查看cpu使用情况和磁盘IO iostat指令详解

lsblk 指令 在Linux系统中&#xff0c;lsblk&#xff08;列表块设备&#xff09;命令是一个非常实用的工具&#xff0c;用于显示所有可用的块设备信息&#xff0c;如硬盘、USB驱动器、SD卡以及它们的分区。这个命令以易于理解的树状结构展示这些信息&#xff0c;清晰地表明了设…

Java中优雅实现泛型类型的强制转换

在Java中经常遇到将对象强制转换成泛型类的情况&#xff1a; Map<String, Object> data Map.of("name", "XiaoMing","age", 17,"scores", List.of(80, 90, 70) );List<Integer> scores (List<Integer>) data.get…

ASP.NET数据存储与交换系统设计

摘 要 该系统以Microsoft Visual Studio 2003作为开发工具&#xff0c;选用SQL Server 2000数据库来实现数据存储&#xff0c;并设计开发了一种基于B/S模式的数据存储与交换系统。该系统完成了用户注册管理、后台管理和用户空间管理功能&#xff1b;为每个用户提供了个人的存…

数据结构中的栈(C语言版)

一.栈的概念 栈是一种常见的数据结构&#xff0c;它遵循后进先出的原则。栈可以看作是一种容器&#xff0c;其中的元素按照一种特定的顺序进行插入和删除操作。 压栈&#xff1a;栈的插入操作叫做进栈/压栈/入栈&#xff0c;入数据在栈顶。 出栈&#xff1a;栈的删除操作叫做…

区块链技术:DAPP开发

随着科技的飞速发展&#xff0c;区块链技术逐渐渗透到各个领域&#xff0c;其中DAPP&#xff08;去中心化应用&#xff09;的发展尤为引人注目。作为一种新型的应用程序&#xff0c;DAPP正在重塑未来商业生态&#xff0c;其潜力无可估量。 一、DAPP的定义和特点 DAPP是指基于…

等保保护测评试题中

二、多选题 1、防火墙提供的接入模式中包括&#xff08;ABCD&#xff09; A.网关模式 B.透明模式 C.混合模式 D.旁路接入模式 2、不同设VLAN之间要进行通信&#xff0c;可以通过 .&#xff08;AB&#xff09; A.交换机 B.路由器 C.网闸 D.入侵检测 E.入侵防御系统…

美国国防部数据网格参考架构概述(上)

文章目录 前言一、概述二、DRMA基本概念三、DRMA的能力视图与运行视图前言 美国国防部正在努力成为“一个以数据为中心的组织,以速度和规模优势使用数据,从而获得作战优势并提高效率。”企业数据网格服务(又称数据集成层)是美国国防部首席数字与人工智能办公室(CDAO)为支…

error loading module ‘cjson‘ from file ‘.\cjson.dll‘:找不到指定的程序。

编译lua-cjson 项目&#xff1a;https://github.com/openresty/lua-cjson 克隆下来后使用vs2022创建工程 添加三个文件即可 fpconv.c lua_cjson.c strbuf.c 配置项目工程 lua头文件目录 链接器lua库文件目录 配置lua头文件 luaxxx/src 配置lua库文件 luaxxx.lib 编译d…

基于ssm+vue+Mysql的房屋租赁系统求租合同

开发语言&#xff1a;Java框架&#xff1a;ssmJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.…

交通运输智慧监管平台---强化物流安全与效率的新举措

一、建设背景 随着社会对于交通安全和环境保护的要求不断提高&#xff0c;对卡车运输的监管和合规性要求也逐渐加强。为了满足快速发展的物流需求&#xff0c;提高供应链协同和可追溯性、解决安全问题、提高运输效率和降低成本&#xff0c;我们利用现代技术和信息化手段着力建设…

ctfshow——SQL注入

文章目录 SQL注入基本流程普通SQL注入布尔盲注时间盲注报错注入——extractvalue()报错注入——updataxml()Sqlmap的用法 web 171——正常联合查询web 172——查看源代码、联合查询web 173——查看源代码、联合查询web 174——布尔盲注web 176web 177——过滤空格web 178——过…

nginx下载安装配置(含ssl)

下载安装环节 wget https://nginx.org/download/nginx-1.24.0.tar.gz tar -zxvf xxx.tar.gz yum -y install pcre-devel openssl openssl-devel ./configure --prefix/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-stream make & make i…

HTTP协议 --中

http状态码 当浏览者访问一个网页时&#xff0c;浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前&#xff0c;此网页所在的服务器会返回一个包含HTTP 状态码的信息头&#xff08; server header &#xff09;用以响应浏览器的请求。 HTTP 状态码的英文为…

【面试经典 150 | 数组】接雨水

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;预处理方法二&#xff1a;单调栈方法三&#xff1a;双指针 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff…

AI大模型日报#0430:疑似GPT4.5模型刷屏、上交实现「蛋白质功能定向进化」、微软紧急撤回WizardLM-2

导读&#xff1a; 欢迎阅读《AI大模型日报》&#xff0c;内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了今日要点以及每条资讯的摘要。 《AI大模型日报》今日要点&#xff1a; 在AI大模型领域&#xff0c;多项研究进展和行业应用动态引发关注。一夜之间&#x…