首先说下使用到的C#技术,关于使用Nopi导入Excel不叙述了,涉及到的知识C#IO流打开本地文件 C#映射主要是为了将List转化为datatable,好像也就这么两个知识点
接下来就是代码实现和分步骤解析了
第一步就是打开本地Excel文件
string filename = @"E:\Demo\SqlBulkCopy\测试.xlsx";
FileStream fileStream = File.OpenRead(filename);
var lastName = Path.GetExtension(filename);
string[] fileType = { ".xls", ".xlsx" };
if (!fileType.Contains(lastName.ToLower()))
{
System.Console.WriteLine("请上传excel文件");
}
//这段是解析Excel 可以参考上一篇博文使用Nopi实现导入导出
var list = ExcelHlper.ReadExcel<Test>(new[] {
"Name",
"Sex",
"Phone",
"ContactPerson",
"Age",
"IdCard"
}, fileStream`
lastName);
解析完excel就可以获得List实体 ,
将获得到的list实体进行映射转化成datatabl
/// <summary>
/// 将泛类型集合List类转换成DataTable
/// </summary>
/// <param name="list">泛类型集合</param>
/// <returns></returns>
public static DataTable ListToDataTable<T>(List<T> entitys)
{
//检查实体集合不能为空
if (entitys == null || entitys.Count < 1)
{
throw new Exception("需转换的集合为空");
}
//取出第一个实体的所有Propertie
Type entityType = entitys[0].GetType();
PropertyInfo[] entityProperties = entityType.GetProperties();
//生成DataTable的structure
//生产代码中,应将生成的DataTable结构Cache起来,此处略
DataTable dt = new DataTable();
for (int i = 0; i < entityProperties.Length; i++)
{
//dt.Columns.Add(entityProperties[i].Name, entityProperties[i].PropertyType);
dt.Columns.Add(entityProperties[i].Name);
}
//将所有entity添加到DataTable中
foreach (object entity in entitys)
{
//检查所有的的实体都为同一类型
if (entity.GetType() != entityType)
{
throw new Exception("要转换的集合元素类型不一致");
}
object[] entityValues = new object[entityProperties.Length];
for (int i = 0; i < entityProperties.Length; i++)
{
entityValues[i] = entityProperties[i].GetValue(entity, null);
}
dt.Rows.Add(entityValues);
return dt;
}
获得到datatable以后 就使用SqlBulkCopy实现批量插入
/// <summary>
/// 使用SqlBulkCopy批量插入数据
/// Attention:
/// 表明和列名需要与数据库表统一
/// </summary>
/// <param name="dt"></param>
/// <param name="tableName"></param>
public static void BulkInsert(DataTable dt, string tableName)
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
//事务锁
SqlTransaction bulkTrans = conn.BeginTransaction();
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.CheckConstraints, bulkTrans)
{ BatchSize = 1000, DestinationTableName = tableName })
{
if (dt != null)
{
try
{
foreach (DataColumn dc in dt.Columns)
{
///映射列
bulkCopy.ColumnMappings.Add(dc.ColumnName, dc.ColumnName);
}
bulkCopy.WriteToServer(dt);
bulkTrans.Commit();
}
catch (Exception ex)
{
bulkTrans.Rollback();
//SQLLog.Error("Execute BulkCopy failed with exception:" + ex.Message + "\r\nTableName:" + tableName + "DateTime:" + DateTime.Now);
throw ex;
}
}
}
}
}