[URL=http://www.cuiwenyuan.com/shanghai/post/Import-Excel-Into-Database-via-NPOI2-In-CSharp-Web-Development.html]上篇文章[/URL]提到使用NPOI导入Excel到数据库,其实只完成了一半的工作,那就是Excel上传到服务器,然后读取到了内存的DataTable,最后面的插入数据库的操作是另一半工作。
相关的参考代码,原理就是创建一个临时表,把读取到内存的Excel数据(DataTable)使用SqlBulkCopy快速导入到数据库,然后再导入真正的业务表。在我导入13800条记录的时候,基本上10秒之内搞定,当然了最初用那个循环DataTable,然后再循环中使用Entity的方式添加,速度不知快了多少倍。
越多的业务开发,越来越感觉到吉日嘎拉的GPM平台的便利,现在基本上有一个数据维护管理类的应用,数据表根据模型建立好之后,基本上当天就能弄好。后期的工作重点要放在报表分析、复杂查询上了,因为这是用户喜欢用OA的理由之一。
<br/>#region public void SqlBulkCopyData(DataTable dt) 利用Net SqlBulkCopy 批量导入数据库,速度超快<br/> /// <summary><br/> /// 利用Net SqlBulkCopy 批量导入数据库,速度超快<br/> /// </summary><br/> /// <param name="dt">源内存数据表</param><br/> public void SqlBulkCopyData(DataTable dt)<br/> {<br/> // SQL 数据连接<br/> SqlConnection sqlConnection = null;<br/> // 打开数据库<br/> this.Open();<br/> // 获取连接<br/> sqlConnection = (SqlConnection)GetDbConnection();<br/> using (SqlTransaction tran = sqlConnection.BeginTransaction())<br/> {<br/> // 批量保存数据,只能用于Sql<br/> SqlBulkCopy sqlbulkCopy = new SqlBulkCopy(sqlConnection, SqlBulkCopyOptions.Default, tran);<br/> // 设置源表名称<br/> sqlbulkCopy.DestinationTableName = dt.TableName;<br/> // 设置超时限制<br/> sqlbulkCopy.BulkCopyTimeout = 1000;<br/><br/> foreach (DataColumn dtColumn in dt.Columns)<br/> {<br/> sqlbulkCopy.ColumnMappings.Add(dtColumn.ColumnName, dtColumn.ColumnName);<br/> }<br/> try<br/> {<br/> // 写入<br/> sqlbulkCopy.WriteToServer(dt);<br/> // 提交事务<br/> tran.Commit();<br/> }<br/> catch<br/> {<br/> tran.Rollback();<br/> sqlbulkCopy.Close();<br/> }<br/> finally<br/> {<br/> sqlbulkCopy.Close();<br/> this.Close();<br/> }<br/> }<br/> }<br/> #endregion<br/>
<br/>if (dt != null)<br/> {<br/> // 用循环把数据一行行输出到缓冲流中<br/> if (dt.Rows.Count <= 100)<br/> {<br/> for (int i = 0; i < dt.Rows.Count; i++)<br/> {<br/> PurchasePriceComparisonEntity entity = new PurchasePriceComparisonEntity();<br/> entity.BPS = dt.Rows[i]["BPS"].ToString();<br/> entity.Family = dt.Rows[i]["Family"].ToString();<br/>
entity.PartNumber = dt.Rows[i]["PartNumber"].ToString();<br/> entity.POPriceCurrentMonth = dt.Rows[i]["POPriceCurrentMonth"].ToString();<br/> entity.POPriceCurrentYear = dt.Rows[i]["POPriceCurrentYear"].ToString();<br/> entity.POPriceLastMonth = dt.Rows[i]["POPriceLastMonth"].ToString();<br/> entity.POPriceLastYear = dt.Rows[i]["POPriceLastYear"].ToString();<br/> entity.ProductGroup = dt.Rows[i]["ProductGroup"].ToString();<br/> entity.SPG = dt.Rows[i]["SPG"].ToString();<br/> entity.Supplier = dt.Rows[i]["Supplier"].ToString();<br/> entity.TotalPurchaseYTDSpendCurrentMonthPOPrice = dt.Rows[i]["TotalPurchaseYTDSpendCurrentMonthPOPrice"].ToString();<br/> entity.TotalPurchaseYTDSpendCurrentYearPOPrice = dt.Rows[i]["TotalPurchaseYTDSpendCurrentYearPOPrice"].ToString();<br/> entity.TotalPurchaseYTDSpendLastMonthPOPrice = dt.Rows[i]["TotalPurchaseYTDSpendLastMonthPOPrice"].ToString();<br/> entity.TotalPurchaseYTDSpendLastYearPOPrice = dt.Rows[i]["TotalPurchaseYTDSpendLastYearPOPrice"].ToString();<br/> entity.YTDPurchaseQTY = float.Parse(dt.Rows[i]["YTDPurchaseQTY"].ToString());<br/> // 追加到数据库<br/> manager.Add(entity);<br/> // 置空<br/> //entity = null;<br/> }<br/> }<br/> // 快速导入<br/> else<br/> {<br/> // 指定表名<br/> dt.TableName = "PurchasePriceComparisonTemp";<br/> manager.SqlBulkImport(dt);<br/> }<br/> }<br/> // 清空掉dt里的内容<br/> dt = null;<br/>
SqlBulkCopy方式的要求excel的第一行是表的字段吧。