博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
推荐一个有用的Excel操作类库 LinqToExcel
阅读量:6098 次
发布时间:2019-06-20

本文共 2642 字,大约阅读时间需要 8 分钟。

GitHub:

以前项目中对Excel进行信息读取,我都是使用的NPOI的封装类,给定一个fileurl,然后返回给我一个datatable。接下去自己去解析数据。如果使用这种方式,那开发者就还要有点小痛苦,因为我们还要在此基础上自己做一些处理,才可以得到我们想要的数据,例如:行列匹配,定义一个实体,一行一行取值,一列一列赋值,这样的操作没有意义,而且机械。突然有一天我在博客园上看到了一个Excel操作库,LinqtoExcel,然后我看了一下操作方式和内容,突然觉得阳光普照大地,眼前一片光明。

下面我简单介绍以下LinqtoExcel的优点和缺点

优点

兼容

以往我们通过NPOI操作数据库的时候,.xlsx和.xls是需要区分处理的。而Linqtoexcel则没有这个问题,作者已经封装好了。一个方法,操作任一后缀,很舒服。

API操作方便

下面的代码相当的简单,通过这样的一行代码我们就能够将excel表中的内容变成实体集合

简单解释一下代码的意思
1 首先创建一个excel文件,定义俩列,公司名称和地址,程序读取集合数据。
2 定义一个实体类,俩个字段,Excel Colunm特性标签表明Excel中列和属性英文名称的匹配
3 实例化ExcelQueryFactory (Excel查询工厂),参数是文件路径
.Worksheet<T> T中写我们定义的实体
4 结束
是不是特别的简单,特别的好用!

img_032467b0aec501a42b65dd831882f645.png
excel内容.png
public class Company{    [ExcelColumn("公司名称")]    public string Name { get; set; }    [ExcelColumn("地址")]     public string Address{ get; set; }}
var excel = new ExcelQueryFactory("excel文件路径");var indianaCompanies = (from c in excel.Worksheet
() select c;

如果我们自定义了Sheet表的名称怎么办呢,程序能够识别到吗?答案是不能。但是有方法哈,O(∩_∩)O

只要在上面的内容修改一点点,重载方法给定一个参数,就是工作表名就可以了。
像上面什么都没有给定的,是因为Excel工作簿默认第一个工作表是"Sheet1",所以如果我们什么参数都不加,就相当与是"Sheet1"。我们只要改动了工作表名称,就一定要赋参数

var excel = new ExcelQueryFactory("excel文件路径");var oldCompanies = from c in excel.Worksheet
("工作表名") select c;

上面是我们自己定义的实体类,完成了列名称和实体属性的转换,如果我们要自己做这个事情呢,我们又改如何做,如下所示就可以了,api提供了俩种方式,一个简单方法,一个泛型方法。

var excel = new ExcelQueryFactory("excel文件路径");excel.AddMapping
(x => x.Name, "公司名称"); excel.AddMapping("Address", "地址"); var indianaCompanies = from c in excel.Worksheet
() select c;

LinqToExcel还有很多很有趣的方法,大家可以去官网自己看,自己实践,作者这里不多做叙述。

缺点

转换实体没有错误提示

问题是我在工作过程种使用这个类库觉得很变扭的一个地方,如果有大神有比较好的解决方案,希望给我留言,互相学习。对这个类库的缺点我自己封装了一个帮助类库LinqToExcel.Extend,我会在后期的文章种给予说明。

问题描述

问题代码如下,不能说这一样有问题,而是在某种情况下会触发exception,是什么情况呢。见下图
我们可以看到开业日期这一列有一个数据日期格式出错,这个时候如果调用方法就会报错,因为类型转换不成功,实质上来说这没问题,可是有这么一个场景。
一般这种需要上传Excel的都是导入操作,客户很多时候填写数据,因为粗心或者疏忽,很容易填错,所以我们一般会对excel文件先进行一下解析,如果有问题的字段,会告诉使用者:“XX”行“XX”列字段有问题 问题如下XXX 类似这样的提示。
我本来以为这个类库会大致给一个提示信息,我可以不用再封装,结果是没有。好啵,那我就只能自己封装一个了。

from c in excel.Worksheet
()public class Company{ [ExcelColumn("公司名称")] public string Name { get; set; } [ExcelColumn("开业日期")] public Datetime StartDate{ get; set; }}
img_dea7e0143bd22fb516aa53c173f1997e.png
excel内容.png

使用范围有限

可能是因为小弟使用水平有限,我发现这个类库只适用于规规矩矩的行列数据,对特殊的一些数量没有办法识别,这里的特殊不是说多么变态的需求。我还是举例子,下面的图片是我们实际过程种可能碰到的需求,即表格的数据列不一定在第一行,没有一个方法让我选定从哪一行开始选取数据集。

大家不要说有的,官网里面有的,我们通过指定开始并和结束作为判断条件。我是觉得很不舒服,我并不能确认我的结束行在哪里,然后写个F80或者E999吗,代码不美观。

var excel = new ExcelQueryFactory("excelFileName");var indianaCompanies = from c in excel.WorksheetRange
("B3", "G10") select c;
img_07fcd13e58912c1d4a9cd1356e36595b.png
excel例子.png

转载地址:http://lfbza.baihongyu.com/

你可能感兴趣的文章
分享reset.css
查看>>
Go 1.1 is released! [转]
查看>>
密码技术十 证书
查看>>
Android Dependencies
查看>>
IE9关联数组导致内存泄漏测试报告
查看>>
开始学习汇编语言
查看>>
14.3-全栈Java笔记:JPanel原来是这样用的
查看>>
Android游戏开发学习笔记(二):音频的播放
查看>>
【故障解决】ORA-06502错误解决
查看>>
linux基础的一些常见问题总结_学习笔记
查看>>
简单工厂模式
查看>>
linux 文件与目录管理
查看>>
Linux学习总结(2)——linux常用命令大全
查看>>
架构师不可不知的十大可扩展架构
查看>>
网页变灰的CSS代码
查看>>
python导入模块时的执行顺序
查看>>
cpu、内存、缓存、硬盘使用率
查看>>
25、性能测试总体流程
查看>>
零长度数组的妙用
查看>>
从零开始写一个发送h264的rtsp服务器(下)
查看>>