推荐一个有用的Excel操作类库 LinqToExcel

GitHub: LinqToExcel

以前项目中对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 结束
是不是特别的简单,特别的好用!

推荐一个有用的Excel操作类库 LinqToExcel
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<Company>()
                       select c;

如果我们自定义了Sheet表的名称怎么办呢,程序能够识别到吗?答案是不能。但是有方法哈,O(∩_∩)O
只要在上面的内容修改一点点,重载方法给定一个参数,就是工作表名就可以了。
像上面什么都没有给定的,是因为Excel工作簿默认第一个工作表是"Sheet1",所以如果我们什么参数都不加,就相当与是"Sheet1"。我们只要改动了工作表名称,就一定要赋参数

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

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

var excel = new ExcelQueryFactory("excel文件路径");
excel.AddMapping<Company>(x => x.Name, "公司名称"); 
excel.AddMapping("Address", "地址");  

var indianaCompanies = from c in excel.Worksheet<Company>()
                        select c;

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

缺点

转换实体没有错误提示

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

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

from c in excel.Worksheet<Company>()

public class Company
{
    [ExcelColumn("公司名称")]
    public string Name { get; set; }

    [ExcelColumn("开业日期")] 
    public Datetime StartDate{ get; set; }
}

推荐一个有用的Excel操作类库 LinqToExcel
excel内容.png

使用范围有限

可能是因为小弟使用水平有限,我发现这个类库只适用于规规矩矩的行列数据,对特殊的一些数量没有办法识别,这里的特殊不是说多么变态的需求。我还是举例子,下面的图片是我们实际过程种可能碰到的需求,即表格的数据列不一定在第一行,没有一个方法让我选定从哪一行开始选取数据集。
大家不要说有的,官网里面有的,我们通过指定开始并和结束作为判断条件。我是觉得很不舒服,我并不能确认我的结束行在哪里,然后写个F80或者E999吗,代码不美观。

var excel = new ExcelQueryFactory("excelFileName");
var indianaCompanies = from c in excel.WorksheetRange<Company>("B3", "G10")
                       select c;
推荐一个有用的Excel操作类库 LinqToExcel
excel例子.png
上一篇:阿里巴巴联合汉仪重磅推出五款人工智能字体:汉仪天真体、英雄体等


下一篇:云桌面技术在全国计算机等级考试中发挥护航作用