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; ...
随机推荐
- PDO 指南
简介 前面咱已经见过MySQLi了,现在咱一起来看看PDO类.PDO是PHP Data Objects的缩写,它被描述为“在PHP中访问数据库的轻量级,兼容性的接口”.尽管它的名字不咋好听,但PDO是 ...
- mysql设置远程访问之后 远程访问非常缓慢 解决办法!
在mysql配置文件的 选项下添加设置. [mysqld] skip-name-resolve skip-name-resolve
- NoSQL文章
MongoDB Bugsnag的MongoDB分片集群使用经验
- 21.如何将java类对象转化为json字符串
使用阿里巴巴的fastJson 下载链接: 链接: https://pan.baidu.com/s/1dHjLOm1 密码: rr3w 用法如下: User user = new User(); us ...
- CentOS7.2.1511安装docker
一.使用之前的安装方法不好使,删除的安装包第一次安装的时候直接使用epel中的源,安装完成后服务无法启动然后删除重新安装,参考文档:https://www.cnblogs.com/yufeng218/ ...
- Intellij IDEA如何使用Maven Tomcat Plugin运行web项目
首先,Run ——> Edit Configurations,这时候如下图: 然后点击左上角的加号,可以添加一个新的配置,如下图: 选择Maven,如下图: 下面填上自己的配置信息,点击appl ...
- jQery实现插入删除信息
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- matplotlib绘制柱状图
参考自Matplotlib Python 画图教程 (莫烦Python)(11)_演讲•公开课_科技_bilibili_哔哩哔哩 https://www.bilibili.com/video/av16 ...
- python全栈开发从入门到放弃之推导式详解
variable = [out_exp_res for out_exp in input_list if out_exp == 2] out_exp_res: 列表生成元素表达式,可以是有返回值的函数 ...
- Delphi APP 開發入門(八)SQLite資料庫
Delphi APP 開發入門(八)SQLite資料庫 分享: Share on facebookShare on twitterShare on google_plusone_share 閲讀次 ...