C#项目读写Excel文件

499 阅读2分钟

在这件事上,谷歌的表现跟百度一样,打广告的在前面-.-

最靠谱的是这个文章英文

......C#新手,语言描述上会比较小白......

遇见了六种包:

ExcelDataReader 好用,很好用。(但是有时候会把数字读出来精度误差,TBD)

Microsoft.Office.Interop.Excel 巨坑!这个包只能在本地运行,无法上云(不用挣扎,我搜了一万遍!),因为有COM Reference(一种闭源的三方包规则),同时就算只在本地运行,也要求本地机器是Windows环境而且安装有正版Office Excel。而且,如果想读取Excel2019之后的版本,需要给这个包选择一种Nuget库中不提供的版本,通过配置COM依赖(配置方法:项目内Dependencies文件夹上右键Add COM Reference选COM搜索Excel选15/16/17看你情况)。另外,使用中,格式转换十分不方便,cell获取出来的Value格式不稳定,而且横坐标从0起,纵坐标却从1起**。**

GemBox.Document 能用,一般,问题是Excel文件大于150行就要收费,我一开始还以为是要我填Excel的正版密钥,搞半天是它这个包本身就收费卖密钥。600$/年

IronXL 也是个收费软件!搞不懂咋三方包还收费。7001400-1400

OfficeOpenXml 应该是不好用,原因忘了

NPOI 非常好,最强大最复杂的包。 掘金有写法但感觉乱的很 stream = System.IO.File.Open开文件流, reader = ExcelReaderFactory.CreateOpenXmlReader(stream)读文件, worksheets = reader.AsDataSet().Tables工作表,直接当数组用 cellValue = worksheets[i].Rows[0][0].ToString()直接读值

其他没具体试过:

OLEDB 这个包简单看了看,依赖于COM,不能上云,还要依赖数据库

LinqToExcel 依赖于OLEDB,不能上云

Open XML SDK 看起来是直接解读底层Excel编码

注释: C#凡COM相关依赖都无法上云,因为权限不足,管理员也没用。COM是早期C++时代的闭源生态下的包,不可解码,C#和C++之间互相提供COM包给对方用。

xlsm文件基本能当成xlsx文件直接读取。

NPOI: DataTable d = new();获取表 System.Reflection.PropertyInfo i = 某个变量.GetType().GetProperties(); 获取某个变量的类型,例如string之类的变量 d.Columns.Add(i.Name, i.PropertyType);预设变量类型 DataRow r = d.NewRow(); 按格式新起一行 r["xxx"] = xxx;挨个单元格写值 d.Rows.Add(r); 压入整行