前些天在工作上遇到这个需求,在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)的更多相关文章

  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. Ningx代码研究.

    概述 研究计划 参与人员 研究文档 学习emiller的文章 熟悉nginx的基本数据结构 nginx 代码的目录结构 nginx简单的数据类型的表示 nginx字符串的数据类型的表示 内存分配相关 ...

  2. Flask之flask-migrate

    简介 flask-migrate是flask的一个扩展模块,主要是扩展数据库表结构的. 官方文档:http://flask-migrate.readthedocs.io/en/latest/ 使用fl ...

  3. str文档

    文档 class str(object): """ str(object='') -> str str(bytes_or_buffer[, encoding[, e ...

  4. Shiro-Base64加密解密,Md5加密

    Shiro权限框架中自带的加密方式有Base64加密,MD5加密 在Maven项目的pom.xml中添加shiro的依赖: <dependency> <groupId>org. ...

  5. django迁移:全局、局部

    django迁移:全局.局部 django 数据库迁移(migrate)应该知道的一些事 https://blog.csdn.net/stonesola/article/details/6975861 ...

  6. Spring第二弹—–搭建与测试Spring的开发环境

    PS:Spring既可以使用在javaSE中,也可以使用在javaWeb中. 使用Spring需要的jar 下载spring(我下载的是2.5.6版本),然后进行解压缩,在解压目录中找到下面jar文件 ...

  7. Angular 笔记系列(一)项目组织与命名规范

    其实使用 Angular.js 做项目已经很久了,也遇到过许多问题.其中很多问题的出现都是因为没有按照规范或者最佳实践来做,大部分原因是学的不够细,很多 tips 没 get 到,用到项目中就会出现各 ...

  8. CentOS忘记用户名或者密码解决办法

    方法一:如果用户名和密码都忘记了,可以用以下这个方法找回:(和第二种大步骤差不多,需注意3,4步) 1. 在出现grub画面时,用上下键选中你平时启动linux的那一项,然后按e键 2. 再次用上下键 ...

  9. 聚类之k-means

    1.介绍 k-means算法以k为参数(所期望的簇的个数),把n个对象分成k个簇(单层划分),用质心(数据点的平均值)定义簇的原型.使得簇内具有较高的相似度,而簇间的相似度较低. 通过聚类,我们能够发 ...

  10. 【U3D】脚本引用的类,如何显示在编辑器界面

    有时候,我们的类里面会组合其他功能模块 如何让这些功能类的值在编辑器界面出现呢? 1:引用类的访问类型必须是Public 2: 类必须声明为可序列化的,即在类头加入以下声明 [System.Seria ...