由于使用的习惯以及需求,对NOPI 中操作Excel 做了个简单的封装,简单快速的进行数据的导入导出。

话不多说,直接上源码。

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;namespace NPOIExcelExtend
{public static class ExcelExtend{/// <summary>/// 读取Excel数据/// 读取的第一行会识别为 "头部"/// 模型 T 属性要跟第一行"头部"对的上/// </summary>/// <typeparam name="T">模型 T 属性要跟第一行"头部"对的上</typeparam>/// <param name="workBook">工作簿</param>/// <param name="fileName">文件名(绝对路径)</param>/// <param name="selectSheet">簿名</param>/// <param name="startRow">开始读取的行数(读的第一行为头部)</param>/// <returns></returns>public static IList<T> ReadData<T>(this IWorkbook workBook, string fileName, int selectSheet = 0, int startRow = 0){var extension = Path.GetExtension(fileName);using (FileStream fs = File.OpenRead(fileName)){if (extension.Equals(".xls")){//把xls文件中的数据写入wk中workBook = new HSSFWorkbook(fs);}else{//把xlsx文件中的数据写入wk中workBook = new XSSFWorkbook(fs);}}var sheet = workBook.GetSheetAt(selectSheet);var row = sheet.GetRow(startRow);//列号和头部名称映射,之后可以根据列号获取对应的属性var dicCellNumberMapHeadName = new Dictionary<int, string>();//头部字段跟属性有效性映射,后面判断属性是否可用再进行赋值var dicPropertyMapAvailable = new Dictionary<string, bool>();var type = typeof(T);for (int i = 0; i < row.LastCellNum; i++){var value = row.GetCell(i).ToString();dicCellNumberMapHeadName.Add(i, value);if (type.GetProperty(value) != null){dicPropertyMapAvailable.Add(value, true);}else{dicPropertyMapAvailable.Add(value, false);}}var result = new List<T>();//遍历所有行while ((row = sheet.GetRow(++startRow)) != null){var t = Activator.CreateInstance<T>();for (int i = 0; i < row.LastCellNum; i++){var colName = dicCellNumberMapHeadName[i];var isPropertyAvailable = dicPropertyMapAvailable[colName];//判断属性是否可用,可用再进行赋值if (isPropertyAvailable){var property = type.GetProperty(colName);var cell = row.GetCell(i);dynamic value;switch (cell.CellType){case CellType.Blank:value = null;break;case CellType.Boolean:value = cell.BooleanCellValue;break;case CellType.Error:value = cell.ErrorCellValue;break;case CellType.Formula:value = cell.CellFormula;break;case CellType.Numeric:value = cell.NumericCellValue;break;case CellType.String:value = cell.StringCellValue;break;case CellType.Unknown:value = cell.ToString();break;default: value = null;break;}if (value != null){property.SetValue(t, Convert.ChangeType(value, property.PropertyType), null);}}else{continue;}}result.Add(t);}return result;}/// <summary>/// 写入数据/// </summary>/// <typeparam name="T"></typeparam>/// <param name="workBook">工作簿</param>/// <param name="dataList">数据源</param>/// <param name="sheetName">表名称</param>/// <returns></returns>public static MemoryStream WriteData<T>(this IWorkbook workBook ,IList<T> dataList,string sheetName="sheet1"){workBook = new HSSFWorkbook();var sheet = workBook.CreateSheet(sheetName);var properties = typeof(T).GetProperties();var stream = new MemoryStream();for (int i = 0; i < dataList.Count; i++){var row = sheet.CreateRow(i);for (int j = 0; j < properties.Count(); j++){var cell = row.CreateCell(j);var value = properties[j].GetValue(dataList[i], null);cell.SetCellValue(value == null ? "" : value.ToString());}}workBook.Write(stream);stream.Flush();stream.Position = 0;return stream;}}
}

码云源码

NOPIExcel读写扩展相关推荐

  1. python中数据读写_【循序渐进学Python——文件中数据的读写以及操作】

    [循序渐进学Python--文件中数据的读写以及操作] [循序渐进学Python--文件中数据的读写以及操作] [循序渐进学Python--文件中数据的读写以及操作] 相信大家都想过自己有一天,可以用 ...

  2. QCAD dxf 扩展属性

    XData是CAD开放给用户(程序员)的一个功能接口:可以往CAD实体上写入/绑定你的个人信息,CAD不会理会/管理你的个人信息,但会保存到DXF文件中.同时你也可以读取这些个人的信息,方便你编程使用 ...

  3. 2字节十六进制浮点数 qt_Qt二进制文件操作(读和写)详解

    除了文本文件之外,其他需要按照一定的格式定义读写的文件都称为二进制文件. 每种格式的二进制文件都有自己的格式定义,写入数据时按照一定的顺序写入,读出时也按照相应的顺序读出. 例如地球物理中常用的 SE ...

  4. mysql获取时间戳_服了!阿里Mysql三位封神专家总结1200多页性能优化的千金良方...

    MYSQL(关系型数据库管理系统) MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应 ...

  5. MySQL系列教程(三)

    mySQL集群(cluster) 这一章,我根本不打算写,因为mySQL 的 官方Cluster方案基本上都是bullshit,尤其是它的官方集群方案,竟然都无人维护了,而且mySQL集群完全可以用眼 ...

  6. 大数据学习之HBase入门笔记

    文章目录 一.HBase简介 1.1.HBase定义 1.2.HBase数据模型 1.2.1.HBase逻辑结构 1.2.2.物理存储结构 1.2.3.数据模型 1.3.HBase基础架构(入门版) ...

  7. 福建中医药大学数字化校园应用及数据容灾系统181万

     第一章 投标邀请 投标邀请 根据福建省省直政府采购计划批复书(2011)闽财购计[0456-1]号,福建省科洪高技术开发中心受福建中医药大学委托,对招标编号"FJKB2011037-1&q ...

  8. linux手机E680的几个概念

    转自http://blog.ccmove.com/wheng/archive/428076.shtml http://blog.ccmove.com/wheng 概念 很多人搞不清几个概念下面澄清一下 ...

  9. mysql minus_10.24程序员节,喜得一套「MySQL性能优化金字塔法则」

    明天就是10.24程序员节了,这么重大的节日怎么能少得了我来凑热闹呢!这不,最近都在研究MySQL性能优化,偶得朋友相赠一套[MySQL性能优化金字塔法则],简直就是深得我心呐~于是乎,就成就了咱今天 ...

  10. 关于IOPS指标对性能的影响

    1.2 示例 Device Type IOPS Interface Notes 7,200 rpm SATA drives HDD ~75-100 IOPS[2] SATA 3 Gb/s 10,000 ...

最新文章

  1. php可以定义数组的常量吗
  2. 《科学》杂志做了一个清单,告诉你今年 10 个最重要的科技突破
  3. Kyoya and Photobooks
  4. 支付宝国庆消费报告出炉:景区消费涨9倍
  5. android软件欢迎界面,Android应用中实现一个软件启动的欢迎界面
  6. 词法分析与语法分析简介
  7. 软件工程 第一章 软件工程的基本概念
  8. rsyslog mysql ip_使用rsyslog+loganalzey收集日志显示客户端ip
  9. cad2012打开后闪退_win10系统安装cad2012一直闪退的解决方法
  10. 小白白红队初成长(2)主动信息收集
  11. 栅栏密码加密与解密以及特征
  12. 南昌大学大一C语言程序试卷,南昌大学C语言题库
  13. oracle两个date相减_oracle获取年月日,两个日期相减
  14. 知识关联视角下金融证券知识图谱构建与相关股票发现
  15. 微型计算机分类可以分为哪些,微型计算机的分类通常以微处理器的什么来划分...
  16. 算法提高 盾神与积木游戏
  17. linux系统怎么制作win10,win10 + linux 制作双系统教程(我本身是win10系统)
  18. 世界海洋日 | TcaplusDB号召你一同保护海洋生物多样性
  19. 笔记:计算机公共基础知识学习内容(总)——全国计算机二级考试
  20. linux+ros2 launch文件开机自启动

热门文章

  1. 《白帽子讲web安全》第一篇 世界观安全
  2. 慧荣SM2258XT主控固态硬盘B05 B16 B17闪存开卡步骤
  3. 简历制作器App隐私政策
  4. 数字孪生智慧监狱三维可视化系统建设方案
  5. 音痴测试软件,写歌软件有哪些,推荐一款能拯救音痴的软件
  6. YDOOK:Maxwell 电磁场仿真 最新版的 Maxwell 软件 使用什么软件进行电磁场仿真
  7. 微软采纳我的建议在WES7增加媒体中心组件
  8. 苹果cms去掉html,苹果cmsV10 隐藏显示视频设置教程
  9. 2022年智慧城市大脑及智慧城市驾驶舱大数据资源平台建设总体架构方案
  10. 超市不同时段人流量统计分析