前些天在工作上遇到这个需求,在GitHub找到一个开源代码可以用,Fork了一个版本,整理一下发出来。

①.Net项目中使用Nuget安装一个 NPOI 包    https://github.com/tonyqus/npoi

再Nuget安装 Chsword.Excel2Object 包    https://github.com/chsword/Excel2Object

 也可以直接使用命令行(“Install-Package Chsword.Excel2Object”

注:上述程序包是作者的源代码,如果项目的.NET版本太低(2.0神马的),比如我们╮(╯▽╰)╭ ,可以跳过此步骤直接复制下面的代码。

   我把.NET4.0的语法都替换掉了,用到的类都揉到一个页面了,没有作者那么条理清晰,引用方便一些。

  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Reflection;
  6. using NPOI.HSSF.UserModel;
  7. using NPOI.SS.UserModel;
  8.  
  9. namespace Bu.Function
  10. {
  11.  
  12. /// <summary>
  13. /// excel转object
  14. /// </summary>
  15.  
  16. public class ExcelAttribute : Attribute
  17. {
  18. public ExcelAttribute(string name)
  19. {
  20. Title = name;
  21. }
  22.  
  23. public int Order { get; set; }
  24. public string Title { get; set; }
  25. }
  26.  
  27. public class ExcelImporter
  28. {
  29. public IEnumerable<TModel> ExcelToObject<TModel>(string path, int? type = null) where TModel : class, new()
  30. {
  31. var result = GetDataRows(path);
  32. var dict = ExcelUtil.GetExportAttrDict<TModel>();
  33. var dictColumns = new Dictionary<int, KeyValuePair<PropertyInfo, ExcelAttribute>>();
  34.  
  35. IEnumerator rows = result;
  36.  
  37. var titleRow = (IRow)rows.Current;
  38. if (titleRow != null)
  39. foreach (var cell in titleRow.Cells)
  40. {
  41. var prop = new KeyValuePair<PropertyInfo, ExcelAttribute>();
  42. foreach (var item in dict)
  43. {
  44. if (cell.StringCellValue == item.Value.Title)
  45. {
  46. prop = item;
  47. }
  48. }
  49.  
  50. if (prop.Key != null && !dictColumns.ContainsKey(cell.ColumnIndex))
  51. {
  52. dictColumns.Add(cell.ColumnIndex, prop);
  53. }
  54. }
  55. while (rows.MoveNext())
  56. {
  57. var row = (IRow)rows.Current;
  58. if (row != null)
  59. {
  60. var firstCell = row.GetCell();
  61. if (firstCell == null || firstCell.CellType == CellType.Blank ||
  62. string.IsNullOrEmpty(firstCell.ToString()))
  63. continue;
  64. }
  65.  
  66. var model = new TModel();
  67.  
  68. foreach (var pair in dictColumns)
  69. {
  70. var propType = pair.Value.Key.PropertyType;
  71. if (propType == typeof(DateTime?) ||
  72. propType == typeof(DateTime))
  73. {
  74. pair.Value.Key.SetValue(model, GetCellDateTime(row, pair.Key), null);
  75. }
  76. else
  77. {
  78.  
  79. try
  80. {
  81. var val= Convert.ChangeType(GetCellValue(row, pair.Key), propType);
  82. pair.Value.Key.SetValue(model, val, null);
  83. }
  84. catch (Exception ex)
  85. {
  86. break;
  87. }
  88.  
  89. }
  90. }
  91. yield return model;
  92. }
  93.  
  94. }
  95.  
  96. string GetCellValue(IRow row, int index)
  97. {
  98. var result = string.Empty;
  99. try
  100. {
  101. switch (row.GetCell(index).CellType)
  102. {
  103. case CellType.Numeric:
  104. result = row.GetCell(index).NumericCellValue.ToString();
  105. break;
  106. case CellType.String:
  107. result = row.GetCell(index).StringCellValue;
  108. break;
  109. case CellType.Blank:
  110. result = string.Empty;
  111. break;
  112.  
  113. #region
  114.  
  115. //case CellType.Formula:
  116. // result = row.GetCell(index).CellFormula;
  117. // break;
  118. //case CellType.Boolean:
  119. // result = row.GetCell(index).NumericCellValue.ToString();
  120. // break;
  121. //case CellType.Error:
  122. // result = row.GetCell(index).NumericCellValue.ToString();
  123. // break;
  124. //case CellType.Unknown:
  125. // result = row.GetCell(index).NumericCellValue.ToString();
  126. // break;
  127.  
  128. #endregion
  129. default:
  130. result = row.GetCell(index).ToString();
  131. break;
  132. }
  133. }
  134. catch (Exception e)
  135. {
  136. Console.WriteLine(e);
  137. }
  138. return (result ?? "").Trim();
  139. }
  140. IEnumerator GetDataRows(string path)
  141. {
  142. if (string.IsNullOrEmpty(path))
  143. return null;
  144. HSSFWorkbook hssfworkbook;
  145. try
  146. {
  147. using (FileStream file = new FileStream(path, FileMode.Open, FileAccess.Read))
  148. {
  149. hssfworkbook = new HSSFWorkbook(file);
  150. }
  151. }
  152. catch (Exception)
  153. {
  154. return null;
  155. }
  156. ISheet sheet = hssfworkbook.GetSheetAt();
  157. IEnumerator rows = sheet.GetRowEnumerator();
  158. rows.MoveNext();
  159. return rows;
  160. }
  161.  
  162. DateTime? GetCellDateTime(IRow row, int index)
  163. {
  164. DateTime? result = null;
  165. try
  166. {
  167. switch (row.GetCell(index).CellType)
  168. {
  169. case CellType.Numeric:
  170. try
  171. {
  172. result = row.GetCell(index).DateCellValue;
  173. }
  174. catch (Exception e)
  175. {
  176. Console.WriteLine(e);
  177. }
  178. break;
  179. case CellType.String:
  180. var str = row.GetCell(index).StringCellValue;
  181. if (str.EndsWith("年"))
  182. {
  183. DateTime dt;
  184. if (DateTime.TryParse((str + "-01-01").Replace("年", ""), out dt))
  185. {
  186. result = dt;
  187. }
  188. }
  189. else if (str.EndsWith("月"))
  190. {
  191. DateTime dt;
  192. if (DateTime.TryParse((str + "-01").Replace("年", "").Replace("月", ""), out dt))
  193. {
  194. result = dt;
  195. }
  196. }
  197. else if (!str.Contains("年") && !str.Contains("月") && !str.Contains("日"))
  198. {
  199. try
  200. {
  201. result = Convert.ToDateTime(str);
  202. }
  203. catch (Exception)
  204. {
  205. try
  206. {
  207. result = Convert.ToDateTime((str + "-01-01").Replace("年", "").Replace("月", ""));
  208. }
  209. catch (Exception)
  210. {
  211. result = null;
  212. }
  213. }
  214. }
  215. else
  216. {
  217. DateTime dt;
  218. if (DateTime.TryParse(str.Replace("年", "").Replace("月", ""), out dt))
  219. {
  220. result = dt;
  221. }
  222. }
  223. break;
  224. case CellType.Blank:
  225. break;
  226. #region
  227.  
  228. #endregion
  229. }
  230. }
  231. catch (Exception e)
  232. {
  233. Console.WriteLine(e);
  234. }
  235. return result;
  236. }
  237. }
  238.  
  239. class ExcelExporter
  240. {
  241. public byte[] ObjectToExcelBytes<TModel>(IEnumerable<TModel> data)
  242. {
  243. var workbook = new HSSFWorkbook();
  244. var sheet = workbook.CreateSheet();
  245. var attrDict = ExcelUtil.GetExportAttrDict<TModel>();
  246. var attrArray = new KeyValuePair<PropertyInfo, ExcelAttribute>[] { };
  247. int aNum = ;
  248. foreach (var item in attrDict)
  249. {
  250. attrArray[aNum] = item;
  251. aNum++;
  252.  
  253. }
  254.  
  255. for (int i = ; i < attrArray.Length; i++)
  256. {
  257. sheet.SetColumnWidth(i, * );
  258. }
  259. var headerRow = sheet.CreateRow();
  260.  
  261. for (int i = ; i < attrArray.Length; i++)
  262. {
  263. headerRow.CreateCell(i).SetCellValue(attrArray[i].Value.Title);
  264. }
  265. int rowNumber = ;
  266. foreach (var item in data)
  267. {
  268. var row = sheet.CreateRow(rowNumber++);
  269. for (int i = ; i < attrArray.Length; i++)
  270. {
  271. row.CreateCell(i).SetCellValue((attrArray[i].Key.GetValue(item, null) ?? "").ToString());
  272. }
  273. }
  274. using (var output = new MemoryStream())
  275. {
  276. workbook.Write(output);
  277. var bytes = output.ToArray();
  278. return bytes;
  279. }
  280. }
  281.  
  282. }
  283.  
  284. public class ExcelHelper
  285. {
  286. /// <summary>
  287. /// import file excel file to a IEnumerable of TModel
  288. /// </summary>
  289. /// <typeparam name="TModel"></typeparam>
  290. /// <param name="path">excel full path</param>
  291. /// <returns></returns>
  292. public static IEnumerable<TModel> ExcelToObject<TModel>(string path) where TModel : class, new()
  293. {
  294. var importer = new ExcelImporter();
  295. return importer.ExcelToObject<TModel>(path);
  296.  
  297. }
  298.  
  299. /// <summary>
  300. /// Export object to excel file
  301. /// </summary>
  302. /// <typeparam name="TModel"></typeparam>
  303. /// <param name="data">a IEnumerable of TModel</param>
  304. /// <param name="path">excel full path</param>
  305. public static void ObjectToExcel<TModel>(IEnumerable<TModel> data, string path) where TModel : class, new()
  306. {
  307. var importer = new ExcelExporter();
  308. var bytes = importer.ObjectToExcelBytes(data);
  309. File.WriteAllBytes(path, bytes);
  310. }
  311. }
  312.  
  313. internal class ExcelUtil
  314. {
  315. public static Dictionary<PropertyInfo, ExcelAttribute> GetExportAttrDict<T>()
  316. {
  317. var dict = new Dictionary<PropertyInfo, ExcelAttribute>();
  318. foreach (var propertyInfo in typeof(T).GetProperties())
  319. {
  320. var attr = new object();
  321. var ppi = propertyInfo.GetCustomAttributes(true);
  322. for (int i = ; i < ppi.Length; i++)
  323. {
  324. if (ppi[i] is ExcelAttribute)
  325. {
  326. attr = ppi[i];
  327. break;
  328. }
  329. }
  330.  
  331. if (attr != null)
  332. {
  333.  
  334. dict.Add(propertyInfo, attr as ExcelAttribute);
  335.  
  336. }
  337. }
  338. return dict;
  339. }
  340. }
  341.  
  342. }

准备一段 Demo Code

  1. public class ReportModel
  2. {
  3. [Excel("标题",Order=)]
  4. public string Title { get; set; }
  5. [Excel("用户",Order=)]
  6. public string Name { get; set; }
  7. }

准备一个List

  1. var models = new List<ReportModel>
  2. {
  3. new ReportModel{Name="a",Title="b"},
  4. new ReportModel{Name="c",Title="d"},
  5. new ReportModel{Name="f",Title="e"}
  6. };

由Object转为Excel

  1. var exporter = new ExcelExporter();
  2. var bytes = exporter.ObjectToExcelBytes(models);
  3. File.WriteAllBytes("C:\\demo.xls", bytes);

由Excel转为Object

  1. var importer = new ExcelImporter();
  2. IEnumerable<ReportModel> result = importer.ExcelToObject<ReportModel>("c:\\demo.xls");

转成Object再验证,存入数据库神马的 是不是就so easy啦~


与ASP.NET MVC结合使用

由于ASP.NET MVC中Model上会使用DisplayAttribute所以Excel2Object除了支持ExcelAttribute外,也支持DisplayAttribute。

C#代码实现 Excel表格与Object互相转换,Excel表格导入数据库(.NET2.0 .NET4.0)的更多相关文章

  1. excel转pdf,itextpdf转换excel

    最近项目有需求,需要把excel转pdf.由于时间比较急,所以在github上找了一个转换的.最终没用上,但还是踩坑了一波. 踩坑一: 首先,这个是导出的流之间会互相影响,因为流读取过,导致导出的ex ...

  2. 腾讯微博OAuth2.0 .NET4.0 SDK 发布以及网站腾讯微博登陆示例代码(原创)

    1.使用简单方便,包含详细注释: 2.暂时只支持xml格式字符串的转换,建议接口使用xml参数:3.QweiboSDK.Controllers命名空间下已包含所有API接口:4.只需调用到Qweibo ...

  3. [DJANGO] excel十几万行数据快速导入数据库研究

    先贴原来的导入数据代码: 8 import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "www.setting ...

  4. excel十几万行数据快速导入数据库研究(转,下面那个方法看看还是可以的)

    先贴原来的导入数据代码: 8 import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "www.setting ...

  5. C#调用NPOI组件读取excel表格数据转为datatable写入word表格中并向word中插入图片/文字/书签 获得书签列表

    调用word的com组件将400条数据导入word表格中耗时10分钟简直不能忍受,使用NPOI组件耗时4秒钟.但是NPOI中替换书签内容的功能不知道是不支持还是没找到. 辅助类 Excel表格数据与D ...

  6. Java POI读取Excel数据,将数据写入到Excel表格

    1.准备 首先需要导入poi相应的jar包,包括: 下载地址:http://pan.baidu.com/s/1bpoxdz5 所需要的包的所在位置包括: 2.读取Excel数据代码 package S ...

  7. 让策划也能轻松修改数据的方法:运用Excel2Json2Object插件将xml表格转为Object导入脚本

    让策划也能轻松修改数据的方法:运用Excel2Json2Object插件将xml表格转为Object导入脚本 运用Excel2Json2Object插件将xml表格转为Object导入脚本 下载地址 ...

  8. Excel VBA ——如何导出数据到excel表格

    sub OutPut() Dim FileTitle, MyPath, MyFullName As String Application.ScreenUpdating = false '关闭表格公式的 ...

  9. html table表格导出excel的方法 html5 table导出Excel HTML用JS导出Excel的五种方法 html中table导出Excel 前端开发 将table内容导出到excel HTML table导出到Excel中的解决办法 js实现table导出Excel,保留table样式

    先上代码   <script type="text/javascript" language="javascript">   var idTmr; ...

随机推荐

  1. 重装系统后Myeclipse遇到的项目配置问题--一个菜鸟的经历!

    电脑不知道为什么流量突然变大了. 一查svchost.exe后台下载老多系统.某某安全卫士根本么用,运维说用某企鹅管家. 结果一个鸟样.. 之前是系统是32位的win7  4G内存用不完.又打算升级内 ...

  2. python基础-第九篇-9.1初了解Python线程、进程、协程

    了解相关概念之前,我们先来看一张图 进程: 优点:同时利用多个cpu,能够同时进行多个操作 缺点:耗费资源(重新开辟内存空间) 线程: 优点:共享内存,IO操作时候,创造并发操作 缺点:抢占资源 通过 ...

  3. 6.2 - BBS + BLOG系统

    一.简介 博客系统开发: 1.注册,登录,首页 2.个人站点,分组:(分类,标签,归档)3.文章详细页4.点赞,踩灭5.评论楼,评论树6.后台管理,发布文章,文件上传7.BeautifulSoup8. ...

  4. django-vue之信息过滤(过滤课程)

    一  vue前端代码 实现的内容,通过对课程的分类,在每个不同的课程分类下显示相应的内容 <template> <div class="course"> & ...

  5. 前端 javascript 定时器

    setInterval("执行的代码",间隔时间)毫秒单位 每5秒一次会提示出弹框 <!DOCTYPE html> <html lang="en&quo ...

  6. IT开发工程师的悲哀现状和可能前途

    IT开发工程师的悲哀现状和可能前途 本文所指的开发工程师,仅指程序开发人员和以数字电路开发为主的电子工程师.当你选择计算机或者电子.自控等专业进入大学时,你本来还是有机会从事其它行业的,可你毕业时执迷 ...

  7. nginx的相关信息

    Nginx安装 nginx官网:https://nginx.org/ 安装准备:nginx依赖pcre库,要先安装pcre(nginx在rewrite时需要解析正则,PCRE是正则解析库) yum i ...

  8. 浅析Spring AOP

    在正常的业务流程中,往往存在着一些业务逻辑,例如安全审计.日志管理,它们存在于每一个业务中,然而却和实际的业务逻辑没有太强的关联关系. 图1 这些逻辑我们称为横切逻辑.如果把横切的逻辑代码写在业务代码 ...

  9. java通过URL获取文本内容

    原文地址https://www.cnblogs.com/myadmin/p/7634262.html public static String readFileByUrl(String urlStr) ...

  10. 如何修改opencart的模版适合为mycncart系统使用

    如何修改opencart的模版适合为mycncart系统使用 mycncart跟随opencart的最新代码不断进行升级,并改造和不断加入中国特色的功能,因此opencart的模版均不能够拿来直接套用 ...