开源 - Ideal库 - Excel帮助类,设计思路(一)

server/2024/12/2 7:35:49/

今天开始和大家分享关于Excel最长常用操作封装。

在这里插入图片描述

01、起因

市面上有很多Excel操作库,这些库设计之初的目标是提供对Excel的各种操作功能,包括数据、样式、公式、图表等等。而对于我们平时开发来说,大多时候并不需要那么多强大的功能,可能大部分只涉及两个操作导入和导出。在这种情况下使用任何一种Excel操作库的学习成本相对来说都是比较高的。

如果有个包能提供Excel读取和写入功能,已经能满足大部分常规需求了,而并不需要了解那么多Excel操作细节。

因此有了二次封装Excel操作的想法,用来应对快速开发。

02、设计思路

整个设计思路围绕两个操作展开——导入和导出。

对于导入我们肯定希望是读完Excel文件直接得到一个对象集合,类似下面伪代码:

var students = Read(excel)

对于导出我们肯定希望传入对象集合直接得到一个Excel文件,类似下面伪代码:

var excel = Write(students)

对于Excel来说关注的是行和列,而对象集合可能很容易表达出行的概念,但是很难表达出列的概念。因此如何想实现上面说到的Excel和对象集合直接转换,还需要进行一些转换,即把对象集合转为成一张类似表格的数据结构,这样就可以和Excel的表对应上了。

而.NET中本身就有这样的数据结构——DataTable。因此我们可以通过DataTable把对象集合和Excel关联起来。

因此我们要想实现Excel导入和导出需要实现以下两部分:

(1)对象集合与DataTable转换;

(2)DataTableExcel转换;

最后再把两部分合并为最终要的导入导出方法,这样整体思路就比较清晰了。下面我们对两部分设计单独讲解。

DataTable_37">03、对象集合与DataTable转换

把这部分单独拿出来说除了本身需要外,还因为这块功能可以作为公共基础功能,用于其他场景使用,因此这块功能会放入Ideal.Core.Common库中。

要实现对象集合与DataTable转换也可以分为两步:

(1)创建:以对象属性名作为列名创建DataTable

(2)转换:把对象集合数据填充至DataTable行记录中,或者相反;

1、创建

对于创建表格,考虑到兼容性、扩展性、适用性,我们将考虑支持多种方式创建表格,大致包括以下几种情况。

(1)根据列名创建表格;

(2)根据对象创建表格;

(3)根据对象绑定自定义特性创建表格;

当然还要根据各种细节提供不同的重载方法。

2、转换

对于转换表格主要指对象集合转表格、表格转对象集合、以及其他表格转换,大致包括以下几种情况。

(1)对象集合转为表格;

(2)根据对象绑定自定义特性把集合转为表格;

(3)表格转为对象集合;

(4)根据对象绑定自定义特性把表格转为对象集合;

(5)一维数组转为表格;

(6)行列转置;

DataTableExcel_75">04DataTableExcel转换

这块功能也可以说是Excel帮助类的核心功能,因此这块功能将放入Ideal.Core.Document库中。

DataTableExcel转换可以分为两种情况:

(1)读:把Excel中数据读入DataTable

(2)写:把DataTable中数据写入Excel

1、读

读取Excel数据至DataTable,根据通过不同的方式获取到不同格式的Excel数据,可以分为以下两种情况:

(1)根据文件路径读取数据至DataTable

(2)根据文件流读取数据至DataTable

2、写

写指把DataTable数据写入Excel中,同样根据不同方式把DataTable数据写入不同格式的Excel中,也可以分为以下几种情况:

(1)把DataTable数据写入Excel文件流;

(2)把DataTable数据写入Excel字节数组;

(3)把DataTable数据写入指定路径Excel

Excel_103">05、对象集合与Excel转换

完成上面两部分后,这一步就简单多了,只需要对上面两部分进行整合就行了。因此也可以分为读写两种情况。

1、读

读取Excel数据至对象集合,主要分为两种情况。

(1)读取Excel数据至对象集合;

(2)根据对象自定义特性读取Excel数据至对象集合;

根据不同的Excel数据格式,还有其他组合情况,这里先不细说。

2、写

写指把对象集合写入Excel,主要分为两种情况:

(1)把对象集合写入Excel

(2)根据对象自定义特性把对象集合写入Excel

同样,根据不同的Excel数据格式,还有其他组合情况,这里暂不细说。

后面我们将详细讲解具体实现过程。

:测试方法代码以及示例源码都已经上传至代码库,有兴趣的可以看看。https://gitee.com/hugogoos/Ideal


http://www.ppmy.cn/server/146652.html

相关文章

java 接口防抖

防抖:防止重复提交 在Web系统中,表单提交是一个非常常见的功能,如果不加控制,容易因为用户的误操作或网络延迟导致同一请求被发送多次,进而生成重复的数据记录。要针对用户的误操作,前端通常会实现按钮的l…

【西瓜书】支持向量机(SVM)

支持向量机(Support Vector Machine,简称SVM)。 超平面 分类学习最基本的想法就是基于训练集合D在样本空间中找到一个划分超平面,将不同类别的样本分开。 但能将训练样本分开的划分超平面可能有很多,应该努力去找到哪…

当新能源遇见低空经济:无人机在光伏领域的创新应用

随着全球能源结构的转型和技术的不断进步,新能源行业已成为推动经济社会发展的重要力量。其中,低空经济作为新兴的战略性产业,正深刻改变着人类社会的出行方式和产业链格局。在这一背景下,无人机与光伏产业的结合,不仅…

.net core 创建linux服务,并实现服务的自我更新

目录 创建服务创建另一个服务,用于执行更新操作给你的用户配置一些systemctl命令权限 创建服务 /etc/systemd/system下新建服务配置文件:yourapp.service,内容如下: [Unit] Descriptionyourapp Afternetwork.target[Service] Ty…

Spring Boot优雅读取配置信息 @EnableConfigurationProperties

很多时候我们需要将一些常用的配置信息比如oss等相关配置信息放到配置文件中。常用的有以下几种,相信大家比较熟悉: 1、Value(“${property}”) 读取比较简单的配置信息: 2、ConfigurationProperties(prefix “property”)读取配置信息并与 …

嵌入式Linux中常用的文件系统类型

嵌入式Linux系统中使用的文件系统类型多种多样,每种都有其特点和适用场景。以下是几种常见的嵌入式Linux文件系统类型及其特性: 只读压缩文件系统 SquashFS:一种高度压缩的只读文件系统,适合用于固件映像,它能够提供高…

使用Gradle编译前端的项目

使用Gradle编译前端的项目 前言项目结构根项目(parent-project)的 settings.gradle.kts后端项目(backend)的 build.gradle.kts前端项目(frontend)的 build.gradle.kts打包bootJar 前言 最近的项目都是使用…

猴子吃桃问题

题目描述 猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,就只剩一个…