开源 - Ideal库 - Excel帮助类,设计思路(一)
今天开始和大家分享关于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)DataTable与Excel转换;
最后再把两部分合并为最终要的导入导出方法,这样整体思路就比较清晰了。下面我们对两部分设计单独讲解。
03、对象集合与DataTable转换
把这部分单独拿出来说除了本身需要外,还因为这块功能可以作为公共基础功能,用于其他场景使用,因此这块功能会放入Ideal.Core.Common库中。
要实现对象集合与DataTable转换也可以分为两步:
(1)创建:以对象属性名作为列名创建DataTable;
(2)转换:把对象集合数据填充至DataTable行记录中,或者相反;
1、创建
对于创建表格,考虑到兼容性、扩展性、适用性,我们将考虑支持多种方式创建表格,大致包括以下几种情况。
(1)根据列名创建表格;
(2)根据对象创建表格;
(3)根据对象绑定自定义特性创建表格;
当然还要根据各种细节提供不同的重载方法。
2、转换
对于转换表格主要指对象集合转表格、表格转对象集合、以及其他表格转换,大致包括以下几种情况。
(1)对象集合转为表格;
(2)根据对象绑定自定义特性把集合转为表格;
(3)表格转为对象集合;
(4)根据对象绑定自定义特性把表格转为对象集合;
(5)一维数组转为表格;
(6)行列转置;
04、DataTable与Excel转换
这块功能也可以说是Excel帮助类的核心功能,因此这块功能将放入Ideal.Core.Document库中。
DataTable与Excel转换可以分为两种情况:
(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;
05、对象集合与Excel转换
完成上面两部分后,这一步就简单多了,只需要对上面两部分进行整合就行了。因此也可以分为读写两种情况。
1、读
读取Excel数据至对象集合,主要分为两种情况。
(1)读取Excel数据至对象集合;
(2)根据对象自定义特性读取Excel数据至对象集合;
根据不同的Excel数据格式,还有其他组合情况,这里先不细说。
2、写
写指把对象集合写入Excel,主要分为两种情况:
(1)把对象集合写入Excel;
(2)根据对象自定义特性把对象集合写入Excel;
同样,根据不同的Excel数据格式,还有其他组合情况,这里暂不细说。
后面我们将详细讲解具体实现过程。
注:测试方法代码以及示例源码都已经上传至代码库,有兴趣的可以看看。https://gitee.com/hugogoos/Ideal
开源 - Ideal库 - Excel帮助类,设计思路(一)的更多相关文章
- 开源图编辑库 NebulaGraph VEditor 的设计思路分享
		
本文首发于 NebulaGraph 公众号 NebulaGraph VEditor 是一个拥有高性能.高可定制的所见即所得图可视化编辑器前端库. NebulaGraph VEditor 底层基于 SV ...
 - 自己动手写客户端UI库——事件机制(设计思路大放送)
		
在上一篇文章中我们创建了一个Button控件,并把这个控件显示在界面上, 在这一篇文章中,我们将为这个控件增加一个事件和一个方法 一:怎么绑定事件的问题 在Winform中,我们对一个按钮绑定事件的方 ...
 - Android实训案例(九)——答题系统的思绪,自己设计一个题库的体验,一个思路清晰的答题软件制作过程
		
Android实训案例(九)--答题系统的思绪,自己设计一个题库的体验,一个思路清晰的答题软件制作过程 项目也是偷师的,决心研究一下数据库.所以写的还是很详细的,各位看官,耐着性子看完,实现结果不重要 ...
 - JS表格分页组件:fupage的设计思路和详细使用方法(未来考虑开源,争取在2015年)
		
一.背景 之前在秒针工作的时候,某js高级project师写了非常多自己的组件.当中一套是分页组件.叫做st-grid. 只是在我看来,bug太多.我常常给他反馈bug,我也不清楚为啥 ...
 - JS表格分页组件:fupage的设计思路和具体用法(未来考虑开源,争取在2015年)
		
一.背景 之前在秒针工作的时候,某js高级工程师写了很多自己的组件,其中一套是分页组件,叫做st-grid.不过在我看来,bug太多,我经常给他反馈bug,我也不清楚为啥别人没有发现. ...
 - xml/map转换器,递归设计思路
		
xml/map转换器 图片:http://pan.baidu.com/s/1nuKJD13 应用场景,为什么要把xml转map?我直接用jdom,dom4j操作不行吗? 如果你了解模板引擎(像velo ...
 - YYCache 设计思路
		
iOS 开发中总会用到各种缓存,最初我是用的一些开源的缓存库,但到总觉得缺少某些功能,或某些 API 设计的不够好用.YYCache (https://github.com/ibireme/YYCac ...
 - EventStore的设计思路
		
EventStore的设计思路 最近打算用C#实现一个基于文件的EventStore. 什么是EventStore 关于什么是EventStore,如果还不清楚的朋友可以去了解下CQRS/Event ...
 - iOS 组件化 —— 路由设计思路分析
		
原文 前言 随着用户的需求越来越多,对App的用户体验也变的要求越来越高.为了更好的应对各种需求,开发人员从软件工程的角度,将App架构由原来简单的MVC变成MVVM,VIPER等复杂架构.更换适合业 ...
 - xml/map转换器,递归设计思路【纯原】
		
xml/map转换器 xml转换: xml/map转换器 xml合并: xml合并 snagit图片:http://pan.baidu.com/s/1nuKJD13 git样例: https://gi ...
 
随机推荐
- Go runtime 调度器精讲(一):Go 程序初始化
			
原创文章,欢迎转载,转载请注明出处,谢谢. 0. 前言 本系列将介绍 Go runtime 调度器.要学好 Go 语言,runtime 运行时是绕不过去的,它相当于一层"操作系统" ...
 - 小tips:vue结合百度UEditor富文本编辑器实现vue-ueditor-wrap
			
1.下载vue-ueditor-wrap cnpm i vue-ueditor-wrap -S 下载最新的 UEditor 资源文件放入你项目的静态资源目录中(比如 static 或者 public, ...
 - OData – 坑
			
前言 OData 有很多很多的坑,我的主张是能少用一样是一样,比如 Batch Processing 不要用,Inheritance 不要用,除了 GET 其它 PUT POST DELETE 都不要 ...
 - RxJS 系列 – 实战练习
			
前言 这篇主要是给一些简单例子, 从中体会 RxJS 在管理上的思路. Slide Down Effect with Dynamic Content 我在这篇 CSS & JS Effect ...
 - DOM – Work with Document.styleSheets and JS/Scss Breakpoint Media Query
			
前言 为了方便管理, 我们会定义 CSS Variables, 类似于全局变量. 有时候做特效的时候还需要 JavaScript 配合, 这时就会希望 JavaScript 可以获取到 CSC Var ...
 - 邀请参与 2022 第三季度 Flutter 开发者调查
			
自 Flutter 3 发布之后,我们在以移动端为中心到多平台框架的路线上稳步前行,用 Dart 2.17 的新语言特性帮助大家提升工作效率,并对核心工具进行了改进,让您在跨平台打造优秀体验时更加得心 ...
 - MySQL 用户、权限管理,C/C++连接与使用
			
目录 用户 用户管理 查询所有用户 查看当前用户 查看当前连接数 创建用户 删除用户 修改密码规则 查看规则/策略 规则说明 临时设置 持久设置 修改密码 权限 数据库提供的 权限列表 查看权限 给用 ...
 - 三大硬核方式揭秘:Java如何与底层硬件和工业设备轻松通信!
			
大家好,我是V哥,程序员聊天真是三句不到离不开技术啊,这不前两天跟一个哥们吃饭,他是我好多年前的学员了,一直保持着联系,现在都李总了,在做工业互联网相关的项目,真是只要 Java 学得好,能干一辈子, ...
 - 树莓派2 CentOS7.9 安装配置笔记
			
1. 镜像下载与安装 http://isoredirect.centos.org/altarch/7/isos/armhfp/找到https://mirrors.tuna.tsinghua.edu.c ...
 - ARM64 SMP多核启动(下)- PSCI
			
4.支持psci情况 上面说了pin-table的多核启动方式,看似很繁琐,实际上并不复杂,无外乎主处理器唤醒从处理器到指定地址上去执行指令,说他简单是相对于功能来说的,因为他只是实现了从处理器的启动 ...