C#代码实现 Excel表格与Object互相转换,Excel表格导入数据库(.NET2.0 .NET4.0)
前些天在工作上遇到这个需求,在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的语法都替换掉了,用到的类都揉到一个页面了,没有作者那么条理清晰,引用方便一些。
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.IO;
- using System.Reflection;
- using NPOI.HSSF.UserModel;
- using NPOI.SS.UserModel;
- namespace Bu.Function
- {
- /// <summary>
- /// excel转object
- /// </summary>
- public class ExcelAttribute : Attribute
- {
- public ExcelAttribute(string name)
- {
- Title = name;
- }
- public int Order { get; set; }
- public string Title { get; set; }
- }
- public class ExcelImporter
- {
- public IEnumerable<TModel> ExcelToObject<TModel>(string path, int? type = null) where TModel : class, new()
- {
- var result = GetDataRows(path);
- var dict = ExcelUtil.GetExportAttrDict<TModel>();
- var dictColumns = new Dictionary<int, KeyValuePair<PropertyInfo, ExcelAttribute>>();
- IEnumerator rows = result;
- var titleRow = (IRow)rows.Current;
- if (titleRow != null)
- foreach (var cell in titleRow.Cells)
- {
- var prop = new KeyValuePair<PropertyInfo, ExcelAttribute>();
- foreach (var item in dict)
- {
- if (cell.StringCellValue == item.Value.Title)
- {
- prop = item;
- }
- }
- if (prop.Key != null && !dictColumns.ContainsKey(cell.ColumnIndex))
- {
- dictColumns.Add(cell.ColumnIndex, prop);
- }
- }
- while (rows.MoveNext())
- {
- var row = (IRow)rows.Current;
- if (row != null)
- {
- var firstCell = row.GetCell();
- if (firstCell == null || firstCell.CellType == CellType.Blank ||
- string.IsNullOrEmpty(firstCell.ToString()))
- continue;
- }
- var model = new TModel();
- foreach (var pair in dictColumns)
- {
- var propType = pair.Value.Key.PropertyType;
- if (propType == typeof(DateTime?) ||
- propType == typeof(DateTime))
- {
- pair.Value.Key.SetValue(model, GetCellDateTime(row, pair.Key), null);
- }
- else
- {
- try
- {
- var val= Convert.ChangeType(GetCellValue(row, pair.Key), propType);
- pair.Value.Key.SetValue(model, val, null);
- }
- catch (Exception ex)
- {
- break;
- }
- }
- }
- yield return model;
- }
- }
- string GetCellValue(IRow row, int index)
- {
- var result = string.Empty;
- try
- {
- switch (row.GetCell(index).CellType)
- {
- case CellType.Numeric:
- result = row.GetCell(index).NumericCellValue.ToString();
- break;
- case CellType.String:
- result = row.GetCell(index).StringCellValue;
- break;
- case CellType.Blank:
- result = string.Empty;
- break;
- #region
- //case CellType.Formula:
- // result = row.GetCell(index).CellFormula;
- // break;
- //case CellType.Boolean:
- // result = row.GetCell(index).NumericCellValue.ToString();
- // break;
- //case CellType.Error:
- // result = row.GetCell(index).NumericCellValue.ToString();
- // break;
- //case CellType.Unknown:
- // result = row.GetCell(index).NumericCellValue.ToString();
- // break;
- #endregion
- default:
- result = row.GetCell(index).ToString();
- break;
- }
- }
- catch (Exception e)
- {
- Console.WriteLine(e);
- }
- return (result ?? "").Trim();
- }
- IEnumerator GetDataRows(string path)
- {
- if (string.IsNullOrEmpty(path))
- return null;
- HSSFWorkbook hssfworkbook;
- try
- {
- using (FileStream file = new FileStream(path, FileMode.Open, FileAccess.Read))
- {
- hssfworkbook = new HSSFWorkbook(file);
- }
- }
- catch (Exception)
- {
- return null;
- }
- ISheet sheet = hssfworkbook.GetSheetAt();
- IEnumerator rows = sheet.GetRowEnumerator();
- rows.MoveNext();
- return rows;
- }
- DateTime? GetCellDateTime(IRow row, int index)
- {
- DateTime? result = null;
- try
- {
- switch (row.GetCell(index).CellType)
- {
- case CellType.Numeric:
- try
- {
- result = row.GetCell(index).DateCellValue;
- }
- catch (Exception e)
- {
- Console.WriteLine(e);
- }
- break;
- case CellType.String:
- var str = row.GetCell(index).StringCellValue;
- if (str.EndsWith("年"))
- {
- DateTime dt;
- if (DateTime.TryParse((str + "-01-01").Replace("年", ""), out dt))
- {
- result = dt;
- }
- }
- else if (str.EndsWith("月"))
- {
- DateTime dt;
- if (DateTime.TryParse((str + "-01").Replace("年", "").Replace("月", ""), out dt))
- {
- result = dt;
- }
- }
- else if (!str.Contains("年") && !str.Contains("月") && !str.Contains("日"))
- {
- try
- {
- result = Convert.ToDateTime(str);
- }
- catch (Exception)
- {
- try
- {
- result = Convert.ToDateTime((str + "-01-01").Replace("年", "").Replace("月", ""));
- }
- catch (Exception)
- {
- result = null;
- }
- }
- }
- else
- {
- DateTime dt;
- if (DateTime.TryParse(str.Replace("年", "").Replace("月", ""), out dt))
- {
- result = dt;
- }
- }
- break;
- case CellType.Blank:
- break;
- #region
- #endregion
- }
- }
- catch (Exception e)
- {
- Console.WriteLine(e);
- }
- return result;
- }
- }
- class ExcelExporter
- {
- public byte[] ObjectToExcelBytes<TModel>(IEnumerable<TModel> data)
- {
- var workbook = new HSSFWorkbook();
- var sheet = workbook.CreateSheet();
- var attrDict = ExcelUtil.GetExportAttrDict<TModel>();
- var attrArray = new KeyValuePair<PropertyInfo, ExcelAttribute>[] { };
- int aNum = ;
- foreach (var item in attrDict)
- {
- attrArray[aNum] = item;
- aNum++;
- }
- for (int i = ; i < attrArray.Length; i++)
- {
- sheet.SetColumnWidth(i, * );
- }
- var headerRow = sheet.CreateRow();
- for (int i = ; i < attrArray.Length; i++)
- {
- headerRow.CreateCell(i).SetCellValue(attrArray[i].Value.Title);
- }
- int rowNumber = ;
- foreach (var item in data)
- {
- var row = sheet.CreateRow(rowNumber++);
- for (int i = ; i < attrArray.Length; i++)
- {
- row.CreateCell(i).SetCellValue((attrArray[i].Key.GetValue(item, null) ?? "").ToString());
- }
- }
- using (var output = new MemoryStream())
- {
- workbook.Write(output);
- var bytes = output.ToArray();
- return bytes;
- }
- }
- }
- public class ExcelHelper
- {
- /// <summary>
- /// import file excel file to a IEnumerable of TModel
- /// </summary>
- /// <typeparam name="TModel"></typeparam>
- /// <param name="path">excel full path</param>
- /// <returns></returns>
- public static IEnumerable<TModel> ExcelToObject<TModel>(string path) where TModel : class, new()
- {
- var importer = new ExcelImporter();
- return importer.ExcelToObject<TModel>(path);
- }
- /// <summary>
- /// Export object to excel file
- /// </summary>
- /// <typeparam name="TModel"></typeparam>
- /// <param name="data">a IEnumerable of TModel</param>
- /// <param name="path">excel full path</param>
- public static void ObjectToExcel<TModel>(IEnumerable<TModel> data, string path) where TModel : class, new()
- {
- var importer = new ExcelExporter();
- var bytes = importer.ObjectToExcelBytes(data);
- File.WriteAllBytes(path, bytes);
- }
- }
- internal class ExcelUtil
- {
- public static Dictionary<PropertyInfo, ExcelAttribute> GetExportAttrDict<T>()
- {
- var dict = new Dictionary<PropertyInfo, ExcelAttribute>();
- foreach (var propertyInfo in typeof(T).GetProperties())
- {
- var attr = new object();
- var ppi = propertyInfo.GetCustomAttributes(true);
- for (int i = ; i < ppi.Length; i++)
- {
- if (ppi[i] is ExcelAttribute)
- {
- attr = ppi[i];
- break;
- }
- }
- if (attr != null)
- {
- dict.Add(propertyInfo, attr as ExcelAttribute);
- }
- }
- return dict;
- }
- }
- }
③准备一段 Demo Code
- public class ReportModel
- {
- [Excel("标题",Order=)]
- public string Title { get; set; }
- [Excel("用户",Order=)]
- public string Name { get; set; }
- }
准备一个List
- var models = new List<ReportModel>
- {
- new ReportModel{Name="a",Title="b"},
- new ReportModel{Name="c",Title="d"},
- new ReportModel{Name="f",Title="e"}
- };
④由Object转为Excel
- var exporter = new ExcelExporter();
- var bytes = exporter.ObjectToExcelBytes(models);
- File.WriteAllBytes("C:\\demo.xls", bytes);
由Excel转为Object
- var importer = new ExcelImporter();
- 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)的更多相关文章
- excel转pdf,itextpdf转换excel
最近项目有需求,需要把excel转pdf.由于时间比较急,所以在github上找了一个转换的.最终没用上,但还是踩坑了一波. 踩坑一: 首先,这个是导出的流之间会互相影响,因为流读取过,导致导出的ex ...
- 腾讯微博OAuth2.0 .NET4.0 SDK 发布以及网站腾讯微博登陆示例代码(原创)
1.使用简单方便,包含详细注释: 2.暂时只支持xml格式字符串的转换,建议接口使用xml参数:3.QweiboSDK.Controllers命名空间下已包含所有API接口:4.只需调用到Qweibo ...
- [DJANGO] excel十几万行数据快速导入数据库研究
先贴原来的导入数据代码: 8 import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "www.setting ...
- excel十几万行数据快速导入数据库研究(转,下面那个方法看看还是可以的)
先贴原来的导入数据代码: 8 import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "www.setting ...
- C#调用NPOI组件读取excel表格数据转为datatable写入word表格中并向word中插入图片/文字/书签 获得书签列表
调用word的com组件将400条数据导入word表格中耗时10分钟简直不能忍受,使用NPOI组件耗时4秒钟.但是NPOI中替换书签内容的功能不知道是不支持还是没找到. 辅助类 Excel表格数据与D ...
- Java POI读取Excel数据,将数据写入到Excel表格
1.准备 首先需要导入poi相应的jar包,包括: 下载地址:http://pan.baidu.com/s/1bpoxdz5 所需要的包的所在位置包括: 2.读取Excel数据代码 package S ...
- 让策划也能轻松修改数据的方法:运用Excel2Json2Object插件将xml表格转为Object导入脚本
让策划也能轻松修改数据的方法:运用Excel2Json2Object插件将xml表格转为Object导入脚本 运用Excel2Json2Object插件将xml表格转为Object导入脚本 下载地址 ...
- Excel VBA ——如何导出数据到excel表格
sub OutPut() Dim FileTitle, MyPath, MyFullName As String Application.ScreenUpdating = false '关闭表格公式的 ...
- 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; ...
随机推荐
- 重装系统后Myeclipse遇到的项目配置问题--一个菜鸟的经历!
电脑不知道为什么流量突然变大了. 一查svchost.exe后台下载老多系统.某某安全卫士根本么用,运维说用某企鹅管家. 结果一个鸟样.. 之前是系统是32位的win7 4G内存用不完.又打算升级内 ...
- python基础-第九篇-9.1初了解Python线程、进程、协程
了解相关概念之前,我们先来看一张图 进程: 优点:同时利用多个cpu,能够同时进行多个操作 缺点:耗费资源(重新开辟内存空间) 线程: 优点:共享内存,IO操作时候,创造并发操作 缺点:抢占资源 通过 ...
- 6.2 - BBS + BLOG系统
一.简介 博客系统开发: 1.注册,登录,首页 2.个人站点,分组:(分类,标签,归档)3.文章详细页4.点赞,踩灭5.评论楼,评论树6.后台管理,发布文章,文件上传7.BeautifulSoup8. ...
- django-vue之信息过滤(过滤课程)
一 vue前端代码 实现的内容,通过对课程的分类,在每个不同的课程分类下显示相应的内容 <template> <div class="course"> & ...
- 前端 javascript 定时器
setInterval("执行的代码",间隔时间)毫秒单位 每5秒一次会提示出弹框 <!DOCTYPE html> <html lang="en&quo ...
- IT开发工程师的悲哀现状和可能前途
IT开发工程师的悲哀现状和可能前途 本文所指的开发工程师,仅指程序开发人员和以数字电路开发为主的电子工程师.当你选择计算机或者电子.自控等专业进入大学时,你本来还是有机会从事其它行业的,可你毕业时执迷 ...
- nginx的相关信息
Nginx安装 nginx官网:https://nginx.org/ 安装准备:nginx依赖pcre库,要先安装pcre(nginx在rewrite时需要解析正则,PCRE是正则解析库) yum i ...
- 浅析Spring AOP
在正常的业务流程中,往往存在着一些业务逻辑,例如安全审计.日志管理,它们存在于每一个业务中,然而却和实际的业务逻辑没有太强的关联关系. 图1 这些逻辑我们称为横切逻辑.如果把横切的逻辑代码写在业务代码 ...
- java通过URL获取文本内容
原文地址https://www.cnblogs.com/myadmin/p/7634262.html public static String readFileByUrl(String urlStr) ...
- 如何修改opencart的模版适合为mycncart系统使用
如何修改opencart的模版适合为mycncart系统使用 mycncart跟随opencart的最新代码不断进行升级,并改造和不断加入中国特色的功能,因此opencart的模版均不能够拿来直接套用 ...