要导入的EXCEL表很多,速度慢怎么办?

xuguv 2010-01-29 10:46:58
每个月要导入200张EXCEL表到系统,目前的做法如下:
1,打开每张EXCEL表
oXL = new Excel.Application();
oWB = (Excel._Workbook)(oXL.Workbooks.Add(Fln));
oSheet = (Excel._Worksheet)oWB.ActiveSheet;

2,因为每个表格式都一样,所以从头到位读相应格子里的数据到一个数组。
dataArray [i,j]=((Excel.Range)oSheet.Cells[i, j]).Text.ToString().Trim ();

3,杀掉EXCEL进程

4,把这个数组导入到数据库里
for ( int k=XX;k<=YY;k++) {Sql="insert into …… values( dataArray[k,1,dataArray[k,2]……)";EXCUTE SQL()}

总体流程是这样。

但是200张表导起来大概要15分钟,有时候还会死机。

有没有什么办法,能够一下子导入,不需要打开关闭200次EXCEL,也不需要200次循环写入数据库。
...全文
698 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
AnfyChan 2010-01-29
  • 打赏
  • 举报
回复
关注中
lzsh0622 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用楼主 xuguv 的回复:]
有没有什么办法,能够一下子导入,不需要打开关闭200次EXCEL,也不需要200次循环写入数据库。
[/Quote]
无规则的数据表,要想准确导入,只能如此吧.

你的处理过程可以优化:
不要杀死EXCEL进程,用一个进程完成全部任务,中间只执行打开/关闭XLS文件的操作.
zhoulihong_1986 2010-01-29
  • 打赏
  • 举报
回复
也许是sql语句查询很慢
zhoulihong_1986 2010-01-29
  • 打赏
  • 举报
回复
up
xuguv 2010-01-29
  • 打赏
  • 举报
回复
用OleDB 把Excel作为表来查询 ,好像是解决了从头到尾读EXCEL内容的问题。但是每张表是不是还需要打开关闭EXCEL呢?如果需要的话,这个时间还是很长。

另外,我的表是很不规则的表,比如(2,40里有个数据,(3,7)里有个数据,(5,2)里有个数据。然后批量的数据要到21行以后才会出现。并且也不是都一样,有些行和行在某些列上会合并。这样读的话,是不是很困难?
lemong 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 terminatorss 的回复:]
引用 3 楼 lsj_zrp 的回复:
把Excel作为表来查询
OleDB

要想解脱,就要如此
格式问题 可以让写EXCEL的人注意下
然后程序写的牛点,可以处理一般的格式错误
[/Quote]

同意,Excel访问组件确实很慢
灵雨飘零 2010-01-29
  • 打赏
  • 举报
回复
帮顶!!
lovexilove 2010-01-29
  • 打赏
  • 举报
回复
office不会
群龙 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lsj_zrp 的回复:]
把Excel作为表来查询
OleDB
[/Quote]
要想解脱,就要如此
格式问题 可以让写EXCEL的人注意下
然后程序写的牛点,可以处理一般的格式错误
xuguv 2010-01-29
  • 打赏
  • 举报
回复
但是我的EXCEL表不是标准表。里面是有格式的。比如有列合并以及行合并。这样直接select excel是不是读不对?
flyfly2008 2010-01-29
  • 打赏
  • 举报
回复
关注
lsj_zrp 2010-01-29
  • 打赏
  • 举报
回复
把Excel作为表来查询
OleDB
xiaolei_418 2010-01-29
  • 打赏
  • 举报
回复
你这样一行一行的写肯定慢啊,可以试试这个方法
直接将数据表以EXCEL的方式打开或则保存
public virtual void PageExcel(DataTable pDataTable)
{
if (pDataTable != null && pDataTable.Rows.Count > 0)
{
Response.Clear();
Response.Buffer = true;
Response.Charset = "gb2312";
Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");

Response.ContentType = "application/vnd.ms-excel";
// Response.ContentEncoding = System.Text.Encoding.GetEncoding("utf-8");

//Response.AddHeader("Content-Disposition", "inline;filename="
// + HttpUtility.UrlEncode("下载文件.xls"));
Response.AppendHeader("content-disposition", "attachment;filename=\"" + System.Web.HttpUtility.UrlEncode("中文名称", System.Text.Encoding.UTF8) + ".xls\"");
DataGrid dataGrid = new DataGrid();
dataGrid.DataSource = pDataTable;
dataGrid.DataBind();
//如果输出为Word,修改为以下代码
//Response.ContentType = "application/ms-word"
//Response.AddHeader("Content-Disposition", "inline;filename=test.doc")
StringBuilder sb = new StringBuilder();
System.IO.StringWriter sw = new System.IO.StringWriter(sb);
System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(sw);
sb.Append("<html><body>");
dataGrid.RenderControl(hw);
sb.Append("</body></html>");
Response.Write(sb.ToString());
Response.End();
}
}
huwei12345 2010-01-29
  • 打赏
  • 举报
回复
用oledb 去select excel 表格行不行?
liangzhl 2010-01-29
  • 打赏
  • 举报
回复
学习
sunware 2010-01-29
  • 打赏
  • 举报
回复
印象里EXCEL里的数据和格式是分离的?
wcdsimon 2010-01-29
  • 打赏
  • 举报
回复
现对200张表的EXCEL进行汇总,用VBA写,这时候还可以做数据check,放到一个工作表中

然后再进行导入。
xbfitliu 2010-01-29
  • 打赏
  • 举报
回复
建议你把excel中的数据先放入到DataTable中,然后批量插入数据库,不要循环构造insert语句。
zhangkuiying 2010-01-29
  • 打赏
  • 举报
回复
这个excel本来就很慢,最好是能省则省。
尽量不要一个一个cells去读,部分由规则的地方用数组一次性读出来,再解析数组。就会省不少时间
比如 object[,] = (Range)Excel.....
效率会提高很多的,你可以试试。
xuguv 2010-01-29
  • 打赏
  • 举报
回复
看我头像干什么。都25的人了,老了。
加载更多回复(6)

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧