京公网安备 11010802034615号
经营许可证编号:京B2-20210330
将Excel数据快速大批量导入数据库的代码
两种途径将数据从EXCEL中导入到SQL SERVER。
一、在程序中,用ADO.NET。代码 如下:
//连接串
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" + [EXCEL文件,含路径] + ";";
OleDbConnection conn = new OleDbConnection(strConn);
conn.Open();
DataTable dtSchema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,new object[] {null, null, null, "TABLE"});
DataSet ds = new DataSet();
//一个EXCEL文件可能有多个工作表,遍历之
foreach( DataRow dr in dtSchema.Rows )
{
string table = dr["TABLE_NAME"].ToString();
string strExcel = "SELECT * FROM [" + table + "]";
ds.Tables.Add(table);
OleDbDataAdapter myCommand = new OleDbDataAdapter(strExcel,conn);
myCommand.Fill(ds,table);
}
conn.Close();
这样,读取出来的数据就藏在DataSet里了。
采用这种方式,数据库 所在机器不必装有EXCEL。

二、 在查询分析器里,直接写SQL语句:
如果是导入数据到现有表,则采用
INSERT INTO 表 SELECT * FROM OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'Excel 5.0;HDR=YES;DATABASE=c:\test.xls',sheet1$)
的形式
如果是导入数据并新增表,则采用
SELECT * INTO 表 FROM OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'Excel 5.0;HDR=YES;DATABASE=c:\test.xls',sheet1$)
的形式。
以上语句是将EXCEL文件里SHEET1工作表中所有的列都读进来,如果只想导部分列,可以
INSERT INTO 表(a1,a2,a3) SELECT a1,a2,a3 FROM OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'Excel 5.0;HDR=YES;DATABASE=c:\test.xls',sheet1$)
其实可以将OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'Excel 5.0;HDR=YES;DATABASE=c:\test.xls',sheet1$)当成一个表,例如我就写过这样一个句子:
INSERT INTO eval_channel_employee(channel,employee_id)
SELECT CASE a.渠道 WHEN 'DIY' THEN 1 WHEN 'RDC' THEN 0 WHEN 'KCM' THEN 2 ELSE 3 END
,b.id FROM
OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'Excel 5.0;HDR=YES;DATABASE=c:\temp\name.xls',sheet1$) AS a,pers_employee b
WHERE a.员工编码=b.code
不管是哪种方式,哪种途径,系统都会默认将第一行上的内容作为字段名。
在做项目时,经常遇到要将Excel中的大量数据导入到Access数据库中,原来的做法是读一条写一条,若导入上万条的数据需要几分仲时间,速度很慢。有没有最快的方法呢?经本人研究、反复的实验,终于写出了最快速的批量导入大批量数据的方法,上万条数据只需几秒钟就可全部导入,够快了吧。代码公布出来与大家分享。
Sql代码
Set conn = Server.CreateObject( "adodb.Connection" )
connstr = "Provider=Microsoft.Jet.OLEDB.4.0; Data source=" & Server.MapPath( "test.mdb" )
conn. Open connstr
sql = "insert into userinfo select userName,userAccount,userStatus from
[userinfo$] in '" & Server.MapPath( "hbwlUserInfo.xls" )
& "' 'Excel 8.0;' where userAccount is not null"
conn. Execute (sql)
SQL Server
大部分人都知道用oledb来读取数据到dataset,但是读取之后怎么处理dataset就千奇百怪了。很多人通过循环来拼接sql,这样做不但容易出错而且效率低下,System.Data.SqlClient.SqlBulkCopy
对于新手来说还是比较陌生的,这个就是传说中效率极高的bcp,6万多数据从excel导入到sql只需要4.5秒。
using System;
using System.Data;
using System.Windows.Forms;
using System.Data.OleDb;
namespace WindowsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click( object sender, EventArgs e)
{
// 测试,将excel中的sheet1导入到sqlserver中
string connString = " server=localhost;uid=sa;pwd=sqlgis;database=master " ;
System.Windows.Forms.OpenFileDialog fd = new OpenFileDialog();
if (fd.ShowDialog() == DialogResult.OK)
{
TransferData(fd.FileName, " sheet1 " , connString);
}
}
public void TransferData( string excelFile, string sheetName, string connectionString)
{
DataSet ds = new DataSet();
try
{
// 获取全部数据
string strConn = "
Provider=Microsoft.Jet.OLEDB.4.0; " + " Data Source= "
+ excelFile + " ; " + " Extended Properties=Excel 8.0; " ;
OleDbConnection conn = new OleDbConnection(strConn);
conn.Open();
string strExcel = "" ;
OleDbDataAdapter myCommand = null ;
strExcel = string .Format( " select * from [{0}$] " , sheetName);
myCommand = new OleDbDataAdapter(strExcel, strConn);
myCommand.Fill(ds, sheetName);
// 如果目标表不存在则创建
string strSql = string .Format( " if
object_id('{0}') is null create table {0}( " ,
sheetName);
foreach (System.Data.DataColumn c in ds.Tables[ 0 ].Columns)
{
strSql += string .Format( " [{0}] varchar(255), " , c.ColumnName);
}
strSql = strSql.Trim( & apos;, & apos;) + " ) " ;
using (System.Data.SqlClient.SqlConnection
sqlconn = new System.Data.SqlClient.SqlConnection(connectionString))
{
sqlconn.Open();
System.Data.SqlClient.SqlCommand command = sqlconn.CreateCommand();
command.CommandText = strSql;
command.ExecuteNonQuery();
sqlconn.Close();
}
// 用bcp导入数据
using (System.Data.SqlClient.SqlBulkCopy bcp = new System.Data.SqlClient.SqlBulkCopy(connectionString))
{
bcp.SqlRowsCopied += new System.Data.SqlClient.SqlRowsCopiedEventHandler(bcp_SqlRowsCopied);
bcp.BatchSize = 100 ; // 每次传输的行数
bcp.NotifyAfter = 100 ; // 进度提示的行数
bcp.DestinationTableName = sheetName; // 目标表
bcp.WriteToServer(ds.Tables[ 0 ]);
}
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
}
}
// 进度显示
void bcp_SqlRowsCopied( object sender, System.Data.SqlClient.SqlRowsCopiedEventArgs e)
{
this .Text = e.RowsCopied.ToString();
this .Update();
}
}
}
上面的TransferData基本可以直接使用,如果要考虑周全的话,可以用oledb来获取excel的表结构,并且加入ColumnMappings来设置对照字段,这样效果就完全可以做到和sqlserver的dts相同的效果了。
记录备忘
二快速导入导出
1.我们都知道当向db里批量插入数据的时候我们会选择SqlBulkCopy
if (dataTable!=null && dataTable.Rows.Count!=0)
{
sqlBulkCopy.WriteToServer(dataTable);
}
这个可以看
深山老林新发的一篇SQLServer中批量插入数据方式的性能对比下面是SqlBulkCopy的方法,这个方法有一个弊端就是当excel某一列即有文字,还有日期的时候,会出现null值,我在网上查了一些资料说连接字串加上;HDR=YES;IMEX=1'的时候会都当做字符处理,但是还是会出现一些bug,所以建议最好先把excel数据分析到datatable里然后再用SqlBulkCopy倒入数据库
1 // block copy to DB from Excel
2 //By xijun,
3 //step 1 create an excel file C:\Inetpub\wwwroot\test.xls , fill cell(1,1) with "Data",cell(1,2) with "name"
4 //step 2 create table named "Data" with 2 column ("data","name") in your DB
5 //there the code below:
6 DateTime t1 = DateTime.Now;
7 Response.Write("<br>start time:" + t1.ToString());
8 string ExcelFile = @"C:\\20090916_Hub_Report.xls";
9 string excelConnectionString =
@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ExcelFile +
";Extended Properties='Excel 8.0;HDR=YES;IMEX=1'";
10
11 using (OleDbConnection excelConnection = new OleDbConnection(excelConnectionString))
12 {
13
14 excelConnection.Open();
15 //Getting source data
16 //非空讀入數據
17 OleDbCommand command = new OleDbCommand("Select
[Region],[CustomerPN],[RMA],[Date],[QTY],[Return/Pull] FROM
[20090916_Hub_Report$] ", excelConnection);
18 // Initialize SqlBulkCopy object
19
20 using (OleDbDataReader dr = command.ExecuteReader())
21 {
22 // Copy data to destination
23 string sqlConnectionString = @"Data
Source=MININT-G87PHNA\SQLEXPRESS;Initial Catalog=GDS_Service;Integrated
Security=True";
24 using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConnectionString))
25 {
26 bulkCopy.DestinationTableName = "GDS_Hub_data";
27 //加入只加入一個列的話,那么就會其他數據庫列都默認為空。
28 bulkCopy.ColumnMappings.Add("Region", "region");
29 bulkCopy.ColumnMappings.Add("CustomerPN", "customer_item_number");
30 bulkCopy.ColumnMappings.Add("RMA", "Rma");
31 bulkCopy.ColumnMappings.Add("Date", "date");
32 bulkCopy.ColumnMappings.Add("QTY", "Qty_1");
33 bulkCopy.ColumnMappings.Add("Return/Pull", "return_pull");
34 //bcp.BatchSize = 100;//每次传输的行数
35 //bcp.NotifyAfter = 100;//进度提示的行数
36 bulkCopy.BatchSize = 100;
37 bulkCopy.NotifyAfter = 100;
38 bulkCopy.WriteToServer((IDataReader)dr);
39
40
41 }
42 }
43 //Closing connection
44 excelConnection.Close();
45 }
46
47 DateTime t2 = DateTime.Now;
48 Response.Write("<br>End time:" + t2.ToString());
49 Response.Write("<br>use time:" + ((TimeSpan)(t2 - t1)).Milliseconds.ToString() + " Milliseconds");
50 Response.Write("<br>inser record count :3307");
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
在数据可视化实践中,数据系列与数据标签的混淆是导致图表失效的高频问题——将数据标签的样式调整等同于数据系列的维度优化,或 ...
2025-11-21在数据可视化领域,“静态报表无法展现数据的时间变化与维度关联”是长期痛点——当业务人员需要分析“不同年份的区域销售趋势” ...
2025-11-21在企业战略决策的场景中,“PESTEL分析”“波特五力模型”等经典方法常被提及,但很多时候却陷入“定性描述多、数据支撑少”的困 ...
2025-11-21在企业数字化转型过程中,“业务模型”与“数据模型”常被同时提及,却也频繁被混淆——业务团队口中的“用户增长模型”聚焦“如 ...
2025-11-20在游戏行业“高获客成本、低留存率”的痛点下,“提前预测用户流失并精准召回”成为运营核心命题。而用户流失并非突发行为——从 ...
2025-11-20在商业数据分析领域,“懂理论、会工具”只是入门门槛,真正的核心竞争力在于“实践落地能力”——很多分析师能写出规范的SQL、 ...
2025-11-20在数据可视化领域,树状图(Tree Diagram)是呈现层级结构数据的核心工具——无论是电商商品分类、企业组织架构,还是数据挖掘中 ...
2025-11-17核心结论:“分析前一天浏览与第二天下单的概率提升”属于数据挖掘中的关联规则挖掘(含序列模式挖掘) 技术——它聚焦“时间序 ...
2025-11-17在数据驱动成为企业核心竞争力的今天,很多企业陷入“数据多但用不好”的困境:营销部门要做用户转化分析却拿不到精准数据,运营 ...
2025-11-17在使用Excel透视表进行数据汇总分析时,我们常遇到“需通过两个字段相乘得到关键指标”的场景——比如“单价×数量=金额”“销量 ...
2025-11-14在测试环境搭建、数据验证等场景中,经常需要将UAT(用户验收测试)环境的表数据同步到SIT(系统集成测试)环境,且两者表结构完 ...
2025-11-14在数据驱动的企业中,常有这样的困境:分析师提交的“万字数据报告”被束之高阁,而一张简洁的“复购率趋势图+核心策略标注”却 ...
2025-11-14在实证研究中,层次回归分析是探究“不同变量组对因变量的增量解释力”的核心方法——通过分步骤引入自变量(如先引入人口统计学 ...
2025-11-13在实时数据分析、实时业务监控等场景中,“数据新鲜度”直接决定业务价值——当电商平台需要实时统计秒杀订单量、金融系统需要实 ...
2025-11-13在数据量爆炸式增长的今天,企业对数据分析的需求已从“有没有”升级为“好不好”——不少团队陷入“数据堆砌却无洞察”“分析结 ...
2025-11-13在主成分分析(PCA)、因子分析等降维方法中,“成分得分系数矩阵” 与 “载荷矩阵” 是两个高频出现但极易混淆的核心矩阵 —— ...
2025-11-12大数据早已不是单纯的技术概念,而是渗透各行业的核心生产力。但同样是拥抱大数据,零售企业的推荐系统、制造企业的设备维护、金 ...
2025-11-12在数据驱动的时代,“数据分析” 已成为企业决策的核心支撑,但很多人对其认知仍停留在 “用 Excel 做报表”“写 SQL 查数据” ...
2025-11-12金融统计不是单纯的 “数据计算”,而是贯穿金融业务全流程的 “风险量化工具”—— 从信贷审批中的客户风险评估,到投资组合的 ...
2025-11-11这个问题很有实战价值,mtcars 数据集是多元线性回归的经典案例,通过它能清晰展现 “多变量影响分析” 的核心逻辑。核心结论是 ...
2025-11-11