书接上回,我们继续来聊聊ExcelHelper的具体实现。

打开网易新闻 查看精彩图片

01、读取Excel到DataSet单元测试

01、读取Excel到DataSet单元测试

在上一章我们主要讲解了读取Excel到DataSet的三个重载方法具体实现,还没来得及做单元测试,因此我们首先对这三个方法做个单元测试。具体代码如下:

打开网易新闻 查看精彩图片

02、根据文件路径读取Excel到对象集合

02、根据文件路径读取Excel到对象集合

在上一章中我们实现了Excel与DataSet相互转换,而在前面TableHelper实现章节中我们已经实现了对象集合与表格DataTable的相互转换,因此我们只要把这两者结合起来就可以实现Excel与对象集合的相互转换。

因为Excel中有多个工作簿Sheet,而每一个工作簿Sheet代表一个表格DataTable,一个表格DataTable关联一个对象集合,因此我们约定本方法必须指定一个工作簿Sheet用来转换对象集合,如果没有指定则默认读取第一个工作簿Sheet。

而该方法通过文件完全路径读取到Excel文件流后,调用具体实现文件流处理重载方法,具体代码如下:

打开网易新闻 查看精彩图片

03、根据文件流、文件名读取Excel到对象集合

03、根据文件流、文件名读取Excel到对象集合

在有些场景下,我们直接得到的就是Excel文件流,因此更通用的处理方式就是处理ExceL文件流,因为无论如何最终我们都是要拿到Excel文件流的。

该方法也是一个重载方法,为了方便那些上传文件后,有文件流,有文件名,但是不想自己处理文件后缀格式的,提供一个便捷方法,因此该方法会通过文件名识别出文件具体后缀格式,再调用下一个重载方法,具体实现如下:

打开网易新闻 查看精彩图片

04、根据文件流、文件后缀读取Excel到对象集合

04、根据文件流、文件后缀读取Excel到对象集合

该方法是上面两个方法的最终实现,具体实现分为两步:

(1)读取指定工作簿Sheet到DataSet中;

(2)把DataSet中第一个表格DataTable转换为对象集合;

而这两步都是调用之前实现好的方法,具体代码如下:

打开网易新闻 查看精彩图片

下面我们针对上面三个方法做个简单的单元测试,代码如下:

打开网易新闻 查看精彩图片

05、把表格数组写入Excel文件流

05、把表格数组写入Excel文件流

该方法是先把表格数组生成Excel的IWorkbook,然后再写入内存流MemoryStream。

而表格数组转换为IWorkbook也很简单,在IWorkbook中创建工作簿Sheet,然后把每个表格数据填充至相应的工作簿Sheet中即可,具体代码如下:

打开网易新闻 查看精彩图片

而根据表格填充工作簿Sheet实现也非常简单,只需遍历表格中每个单元格,把其值填充至对应工作簿Sheet中相同的位置即可,当然其中表格列名是否要作为数据,需要单独处理,具体代码如下:

打开网易新闻 查看精彩图片

06、把表格数组写入Excel文件

06、把表格数组写入Excel文件

该方法需要注意的是对于Excel文件路径的处理,如果给定的Excel文件路径不存在,则本方法会自动创建相应的文件夹,如果给定的Excel文件路径中不包括文件名称,则本方法会自动根据当前时间+4位随机数的方式+.xlsx的命名方式自动生成文件名。

处理好这些则只需要调用根据表格数组生成Excel对象方法,最后写入Excel文件中,具体代码如下:

打开网易新闻 查看精彩图片

下面我们对上面两个写入方法进行详细的单元测试,具体如下:

打开网易新闻 查看精彩图片

07、把对象集合写入Excel文件流或Excel文件

07、把对象集合写入Excel文件流或Excel文件

到这里这两个方法就很好实现了,因为这两个方法需要的所有基础方法都已经实现,核心思路就是先把对象集合转换为表格DataTable,然后再通过调用相关把表格数组写入Excel的扩展方法实现即可,具体代码如下:

打开网易新闻 查看精彩图片

最后我们再进行一次详细的单元测试,代码如下:

打开网易新闻 查看精彩图片

到这里我们整个Excel封装就完成了,相信通过对象集合完成Excel导入导出能满足大多数业务开发需求。当然如果有更复杂的业务需求,还需要我们自己去研究相应的第三方库。