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; ...
随机推荐
- Ubuntu 下 chromium浏览器的标签乱码
最近使用ubuntu系统,安装了个chromium浏览器,标题不会乱码,不过标签乱码,火狐浏览器没有这个问题,强大的互联网告诉我是少字体的原因,执行下面的指令即可. sudo apt-get inst ...
- 剑指Offer——树的子结构
题目描述: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 分析: 先匹配到A的某个结点和B的根相同,然后往下继续匹配.不匹配则递归匹配左右子树. 代码: ...
- PHP的生命周期
了解PHP生命周期之前,先了解一下apache是怎么和php关联起来的吧~ 1.Apache运行机制剖析 ----------------------------- 总体示意图如下: Apache ...
- 禁止Centos系统You have new mail in /var/spool/mail/root提示
禁止Centos系统You have new mail in /var/spool/mail/root提示 https://blog.csdn.net/oyym_mv/article/details/ ...
- ALV tree标准DEMO
BCALV_TREE_01 ALV 树控制:构建层次树 BCALV_TREE_02 ALV 树控制:事件处理 BCALV_TREE_03 ALV 树控制:使用自己的上下文菜单 BCALV_TREE_0 ...
- abap 开发之创建表维护生成器
在sap开发中有时需要对一些自建表维护数据,但又不想写程序,怎么办呢??这个时候我们可以直接生成个表维护生成器,为其定义一个事物码就ok了.以下是表格维护生成器的生成步骤. 首先我们需要先定义表.输入 ...
- PSR-2 代码风格规范
https://blog.csdn.net/qq_28602957/article/details/52248239 这篇规范是PSR-1(基本代码规范)的扩展和继承. 本规通过制定一系列规范化PHP ...
- mutex_lock
多核处理器下,会存在多个进程处于内核态的情况,而在内核态下,进程是可以访问所有内核数据的,因此要对共享数据进行保护,即互斥处理. mutex_lock(struct mutex *lock)和mute ...
- POJ1836:Alignment(LIS的应用)
题目链接:http://poj.org/problem?id=1836 题目要求: 给你n个数,判断最少去掉多少个数,从中间往左是递减的序列,往右是递增的序列 需注意的是中间可能为两个相同的值,如 1 ...
- jmeter 请求发送加密参数(加密接口测试一)
最近在做http加密接口,请求头的uid参数及body的请求json参数都经过加密再发送请求,加密方式为:ase256.所以,jmeter发送请求前也需要对uid及json参数进行加密.我这里是让开发 ...