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; ...
随机推荐
- mysql主从同步出现异常语句跳过错误处理
1.跳过操作: mysql>slave stop; mysql>SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1 跳过一个事务 mysql>slave st ...
- MPI Maelstrom---poj1502(最短路模板)
题目链接:http://poj.org/problem?id=1502 题意:求从处理器1到其它处理器所需的最少时间是多少: 输入是下三角,如果是x表示A[i][j]不能直接联系: #include ...
- Python面向对象高级
一 反射 反射也可以说是python的自省机制 反射就是通过字符串的形式,导入模块,然后以字符串的形式去查找指定函数并执行.利用字符串的形式去模块(对象)中操作(查找/获取/添加/删除)属性,是一种 ...
- NodeJS开发环境搭建
原创作者: zero20121222 NodeJS开发环境搭建 1.安装NodeJS 1.编译环境 源代码编译器,通常 Unix/Linux平台都自带了C++的编译器(GCC/G++).如果没有,请通 ...
- oracle的统计信息的查看与收集
查看某个表的统计信息 SQL> alter session set NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'; Session altered. SQL&g ...
- Delphi锁定鼠标 模拟左右键 静止一会自动隐藏鼠标
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- C# 各种导入 Excel 文件的数据的方法总结
在导入之前都需要将上传的文件保存到服务器,所以避免重复的写这些代码,先贴出上传文件并保存到服务器指定路径的代码. protected void btnImport_Click(object sende ...
- 404 Not Found 探秘Nginx转发处理流程
一.问题描述 访问一个链接地址后报404 Not Found nginx/1.10.2 1 112.95.211.154 - - [08/Mar/2018:15:22:21 +0800] " ...
- idea中 在接口中如何直接跳转到该接口的是实现类中?
例如,我想跳转到UserInfoDao 这个接口的实现类中,操作如下: 把鼠标放到这个接口UserInfoDao 上面,右键,选择 GO To ,然后选择 Implementations,就可以直接跳 ...
- Linux 日志分析工具(logwatch)安装及使用
Linux 日志分析工具(logwatch)安装及使用 日志是非常重要的系统文件,管理员每天的重要工作就是分析和查看服务器的日志,判断服务器的健康状态.但是日志管理又是一项非常枯燥的工作,如果需要管理 ...