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

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

使用范围有限

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

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

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

  1. 推荐一个不到2MB的C#开发工具箱,集成了上千个常用操作类

    今天给大家推荐一个C#开发工具箱,涵盖了所有常用操作类,体积小.功能强大. 项目简介 C# 开发工具箱.大都是静态类,加密解密,反射操作,权重随机筛选算法,分布式短id,表达式树,linq扩展,文件压 ...

  2. java excel类库,jExcelApi Java 操作 Excel 的类库

    jExcelApi Java 操作 Excel 的类库 Java Excel API(JXL)是一个成熟,开源的用来操作Excel电子表格的Java类库,支持读取,修改,写入等操作.这个项目基于GPL ...

  3. Fintech系列(三) -- python对excel操作模块汇总||推荐指数||用法示例

    python对excel操作模块汇总||推荐指数||用法示例 Working with Excel Files in Python 总览 读写Excel的python第三方开源模块 Excel写操作插 ...

  4. 推荐一个C#操作SVG图形矢量图的开源项目

    一说到SVG,很多人第一反应这是前端的领域,是可以Html.JavaScript操作的.SVG文件在浏览器是可以直接运行的,但如果我们在后台需要保存图片,就需要通过SVG定义的XML文件转换为图片格式 ...

  5. php图像处理插件,推荐一个 PHP 图像处理操作插件 Intervention Image

    推荐一个 PHP 图像处理操作插件 Intervention Image Intervention/image 是为 Laravel 定制的图片处理工具, 它提供了一套易于表达的方式来创建.编辑图片. ...

  6. 关于Excel操作编写的一个软件设计构思案例[连载] --如何打开Excel文件,获取需要列的数据显示到表格内做修改

    如何打开Excel文件,获取需要列的数据显示到表格内做修改? DataSet 读取表格数据 = new DataSet(); Thread 读取, 更新; int 计数 = 0, 定位 = 0, 原条 ...

  7. python制作软件excel_利用Python制作一个 截图+Excel操作浏览器小工具

    代码如下: GetData.py import xlrd class ReadExcel(): def __init__(self,file): self.open_excel = xlrd.open ...

  8. Java 压缩解压缩 第三方组件,推荐一个强大的Java开发工具类库!

    feilong开发更简便的工具库 Reduce development, Release ideas (灵感从重复简单的代码中释放出来) 让你从大量重复的底层代码中脱身,提高工作效率; 让你的代码更简 ...

  9. 这几excel操作技巧,每一个都是大神和菜鸟的分水岭!

    我们在工作的时候对遇到一些数据以及一些文件需要进行处理,在很多的地方都会接触到excel,但是对于一般人来说excel大部分都是停留在初级水平,所以想要进行一些高层次的操作一般都不知道如何去进行,小编 ...

最新文章

  1. C语言中sizeof与strlen区别
  2. libevent中的缓冲区(二)
  3. 怎么一步步编写简单的PHP的Framework(五)
  4. 搭建基于Docker社区版的Kubernetes本地集群
  5. C#医疗挂号系统试题
  6. python 装饰器实现_Python装饰器系列01 - 如何正确地实现装饰器
  7. 将速度加快到自己的个人代码生成器中
  8. assertionerror python_Python成为专业人士笔记–内置模块Modules和函数Functions
  9. leetcode1476. 子矩形查询
  10. hadoop 集群启动时 Address already in use 解决方法
  11. 全新拟态个人主页/引导页源码
  12. vs.php在win2008+vs2008下开发调试配置
  13. linux stress 工具,Linux压力测试工具stress的参数详解
  14. Eclipse .class文件中文乱码
  15. IO流总结-知识体系
  16. git commit --amend 简单使用
  17. win10镜像文件能直接安装吗
  18. Holt Winter 指数平滑模型
  19. 【转载】优雅抒情的浪漫小提琴曲
  20. 自己的智能AI聊天机器人,可自定义头像,免费html源码分享,粘贴即用!

热门文章

  1. 11.9 leetcode打卡
  2. 使用yum报错:You could try using --skip-broken to work around the problem
  3. 测试apk-异常管控Gps攻击者开发
  4. ubuntu桌面之路-续三
  5. 桌面小宠物项目开发_C# 桌面宠物 示例源码(透明窗体)
  6. 【Matlab】多元线性回归
  7. 【读点论文】Deep Learning Face Representation from Predicting 10,000 Classes。deepID
  8. Jquery选择器之可见性选择器、属性过滤选择器
  9. html插入swf自动播放,[转载]网页中插入FLASH(swf文件)的html代码
  10. 某位算法工程师对自己工作的反思