前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >推荐一个有用的Excel操作类库 LinqToExcel

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

作者头像
happlyfox
发布2018-10-31 14:47:16
9810
发布2018-10-31 14:47:16
举报
文章被收录于专栏:技术开源分享技术开源分享

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内容.png

代码语言:javascript
复制
public class Company
{
    [ExcelColumn("公司名称")]
    public string Name { get; set; }

    [ExcelColumn("地址")] 
    public string Address{ get; set; }
}
代码语言:javascript
复制
var excel = new ExcelQueryFactory("excel文件路径");
var indianaCompanies = (from c in excel.Worksheet<Company>()
                       select c;

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

代码语言:javascript
复制
var excel = new ExcelQueryFactory("excel文件路径");
var oldCompanies = from c in excel.Worksheet<Company>("工作表名") 
                   select c;

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

代码语言:javascript
复制
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 类似这样的提示。 我本来以为这个类库会大致给一个提示信息,我可以不用再封装,结果是没有。好啵,那我就只能自己封装一个了。

代码语言:javascript
复制
from c in excel.Worksheet<Company>()

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

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

excel内容.png

使用范围有限

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

代码语言:javascript
复制
var excel = new ExcelQueryFactory("excelFileName");
var indianaCompanies = from c in excel.WorksheetRange<Company>("B3", "G10")
                       select c;

excel例子.png

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.07.10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 优点
    • 兼容
      • API操作方便
      • 缺点
        • 转换实体没有错误提示
          • 使用范围有限
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档