开发者社区> HapplyFox> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

简介: GitHub: LinqToExcel 以前项目中对Excel进行信息读取,我都是使用的NPOI的封装类,给定一个fileurl,然后返回给我一个datatable。
+关注继续查看

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 结束
是不是特别的简单,特别的好用!

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<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; }
}

img_dea7e0143bd22fb516aa53c173f1997e.png
excel内容.png

使用范围有限

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

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Win系统 - 简单一个设置,输入法再也不用来回切换
Win系统 - 简单一个设置,输入法再也不用来回切换
38 0
如何设计一个高可用的运营系统
概述 一个产品业务的发展总是离不开运营二字。随着业务快速的发展以及新业务的扩充,运营需求越来越大,并且很多时候需要追热点,因此在有限的资源下,如何做到快速、准确、灵活、稳定的满足日趋增多的运营需求,成了个问题。
3441 0
如何设计一个高可用的运营系统
概述 一个产品业务的发展总是离不开运营二字。随着业务快速的发展以及新业务的扩充,运营需求越来越大,并且很多时候需要追热点,因此在有限的资源下,如何做到快速、准确、灵活、稳定的满足日趋增多的运营需求,成了个问题。
1132 0
mybatis-简单的增删改查操作
mybatis是apache下一个开源项目,原称为ibatis,后改名为mybatis。 是一个基于Java的持久层框架。(类似与hibetnate)。 MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口
2357 0
2013-8-12练习[制作一个具有UIAlertView和UIActionSheet的登陆界面]
创建登陆窗口(有用户名和密码),确认后弹出对话框再输入一遍,如果都相同,显示用户图片,如果不相同,弹出上拉菜单(UIActionSheet),问是否重新输入,是的话弹出对话框重新输入。
782 0
[转]数据库连接方式读取不到Excel数据值的解决方法
由于工作的需要,最近做了一个读取Excel文件与CSV文件关联的数据处理程序,主要用于PDA采集数据的后期处理。 当时有两种方法可用来读取Excel数据,一种是引用Excel的类库,另一种是将其作为扩展数据文件,用ADO连接方式来处理。
901 0
Microsoft Windows CSRSS Local Privilege Escalation Exploit (MS05-018)
文章整理:天天安全网   作者:佚名   发布时间:2005-09-09 漏洞资料:http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2005-0551危险程度:中等影响范围:Microsoft Windows 2000/XP/2003解决办法:http://www.
702 0
Microsoft Windows "keybd_event" Local Privilege Escalation Exploit
文章整理:天天安全网   作者:佚名   发布时间:2005-09-09 漏洞资料:http://www.haxorcitos.com/MSRC-6005bgs-EN.
710 0
+关注
62
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载