以下是我写的代码,可以执行,但数据量大的时候操作很慢(比如说excel文档中有几万条记录)请教如何修改可以提高效率 private void InputExcel(string pPath) //pPath: excel文档路径
{
string conn = "Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source =" + pPath + ";Extended Properties='Excel 8.0;HDR=False;IMEX=1'";
OleDbConnection oleCon = new OleDbConnection(conn);
oleCon.Open();
string Sql = "select * from [Sheet1$]";
OleDbDataAdapter mycommand = new OleDbDataAdapter(Sql, oleCon);
DataSet ds = new DataSet();
mycommand.Fill(ds, "[Sheet1$]");
oleCon.Close();
int count = ds.Tables["[Sheet1$]"].Rows.Count;
string tQybs = "";
string tQyname = "";
string tQyzch = "";
for (int i = 0; i < count; i++)
{
tQybs = ds.Tables["[Sheet1$]"].Rows[i]["企业标识"].ToString().Trim();
tQyname = ds.Tables["[Sheet1$]"].Rows[i]["企业名称"].ToString().Trim();
tQyzch = ds.Tables["[Sheet1$]"].Rows[i]["注册号"].ToString().Trim();
if (!tempqy.CheckqyBs(tQybs)) //判断是否重复
{
tempqy.InsertTempqy(tQybs, tQyname, tQyzch, TextBox1.Text.Trim(), DateTime.Now); //数据添加到sql server
}
}
}
{
string conn = "Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source =" + pPath + ";Extended Properties='Excel 8.0;HDR=False;IMEX=1'";
OleDbConnection oleCon = new OleDbConnection(conn);
oleCon.Open();
string Sql = "select * from [Sheet1$]";
OleDbDataAdapter mycommand = new OleDbDataAdapter(Sql, oleCon);
DataSet ds = new DataSet();
mycommand.Fill(ds, "[Sheet1$]");
oleCon.Close();
int count = ds.Tables["[Sheet1$]"].Rows.Count;
string tQybs = "";
string tQyname = "";
string tQyzch = "";
for (int i = 0; i < count; i++)
{
tQybs = ds.Tables["[Sheet1$]"].Rows[i]["企业标识"].ToString().Trim();
tQyname = ds.Tables["[Sheet1$]"].Rows[i]["企业名称"].ToString().Trim();
tQyzch = ds.Tables["[Sheet1$]"].Rows[i]["注册号"].ToString().Trim();
if (!tempqy.CheckqyBs(tQybs)) //判断是否重复
{
tempqy.InsertTempqy(tQybs, tQyname, tQyzch, TextBox1.Text.Trim(), DateTime.Now); //数据添加到sql server
}
}
}
解决方案 »
- PDA开发问题
- Jquery datatable主副表实现的问题
- 有没有人用过好的Wiki引擎?可否介绍一下?
- List<T> 绑定到数据显示控件上面怎么实现分页呢~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- 请教一个简单问题!解决立即给分,不够再补
- 紧急求助,PDF文件上传!
- 如何将一些信息保存在客户端呢?
- 俺是一个初学者,请教各位大哥大姐一个问题,谢谢帮忙呀
- 连接oracle出现ORA-12154: TNS: 无法解析指定的连接标识符,在线等大神
- 页面弹出问题
- 带回复功能的留言板。。
- 視頻聊天室
2\用ajax分次导入,可以是一次一条,也可以是几条,几十条,几百条,看情况和需要而定,顺带还可以做个进度条什么的,总之是不让页面超时
不能给我一段ajax分次导入 加上进度条的示例代码 我是初学的 对这方面不是很了解
想写一二个例子给你参考:
http://www.cnblogs.com/insus/archive/2012/09/22/2698515.htmlhttp://www.cnblogs.com/insus/archive/2013/03/13/2957382.html
btnAppRun为一个隐藏的按钮,绑定onClick为btnAppRun_Clickhf_rowIndex为一个隐含域,初使值为0,每执行一次就加+1btnAppRun_Click执行完后,重新调用nextImport()
如果判断不是最后一条,就执行btnAppRun_Click,否则结束
//导入下一条记录
function nextImport() {
var row_index = parseInt(jQuery("#" + hf_rowIndex).val());
if (row_index < rowcount) {
setProgress(parseInt(((row_index + 1) * 100) / rowcount));
//setProgress(row_index);
jQuery("#" + btnAppRun).click();
}
else {
//开始
var x0 = X(btnAppStart);
X.state(x0, { "Enabled": false });
x0.x_setDisabled();
//暂停
var x1 = X(btnAppStop);
X.state(x1, { "Enabled": false });
x1.x_setDisabled();
//执行
var x2 = X(btnAppRun);
X.state(x2, { "Enabled": false });
x2.x_setDisabled();
Ext.MessageBox.show({
title: "信息",
msg: "程序已执行完必,是否要关闭窗口!",
buttons: Ext.MessageBox.OKCANCEL,
icon: 'ext-mb-warning',
fn: function (btn) {
if (btn == 'cancel') {
return false;
} else {
X('Window_Import').box_hide();
}
}
});
}
}
.cs部份protected void btnAppRun_Click(object sender, EventArgs e)
{
DataTable impdt = Session["imp_inventoryClass"] as DataTable;//这里是数据源
int rowindex = Utils.StrToInt(hf_rowIndex.Text, 0);
if (rowindex < impdt.Rows.Count)
{
hf_rowIndex.Text = (rowindex + 1).ToString();
_inv.CreateClass(info, false)//这里是执行添加到数据库
PageContext.RegisterStartupScript("nextImport();");
}
}
openrowset(
'Microsoft.ACE.OLEDB.12.0','Excel 12.0;HDR=Yes;IMEX=1;Database=D:\6总装任务.xlsx',
'select * from [0ETC100295$]')
然后使用
System.Data.SqlClient.SqlBulkCopy
WriteToServer一样很快 都不是一条一条的
http://blog.csdn.net/jason_dct/article/details/8217616
但我还想判断是否有重复
有什么好方法可以解决
{
tempqy.InsertTempqy(tQybs, tQyname, tQyzch, TextBox1.Text.Trim(), DateTime.Now);
//这里是逐行链接就会慢
}//////////
不知道你的tempqy是怎么写的,可以把要比对的值实现放在一个table里面
然后没有比对上的就写一个新的table里面
这样就有了一个完全没有比对上的新table了,插入就可以了
之后逐条比较?这样的话似乎也不快的
如果Excel中有10W条记录 也要再循环10W次判断 有没有什么更好的方法
之后逐条比较,这是在内存里面进行的,速度是非常快的。你只要把比对完成后的table使用SqlBulkCopy复制到数据库里面不就行了嘛