关于.net 读取大量Excel数据的问题

xiaoling9 2008-04-13 09:10:53
现在有一个Excel表,内部有五张表格,每张表格的记录条数在五万条左右,现在想通过.net将其加载到dataset中,有以下要求:
一、能适用office2000,office2003,office2007几种Excle建立的文件。
二、速度要快。
有没有好的解决方案?请各位大哥帮忙。谢谢!
...全文
360 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
heartdevil 2008-04-16
  • 打赏
  • 举报
回复
Mark
xiaoling9 2008-04-16
  • 打赏
  • 举报
回复
谢谢各位了!
zhmvb 2008-04-14
  • 打赏
  • 举报
回复
mark
viki117 2008-04-14
  • 打赏
  • 举报
回复
http://www.cnblogs.com/Files/viki117/ExeclTool.rar
用这个人家做好的DLL吧,首先不受OFFICE的版本的限制,速度也比Execl.dll的速度快很多啊。。
RAR中有简单的使用方法说明,
DLL的代码是没有做过处理的,有兴趣的话可以反编译出来看看。。里面还有很多Execl的方法的。。。
hsxgodkiller 2008-04-14
  • 打赏
  • 举报
回复
用多线程同时导,会比较快的,每个线程只处理一个excel的数据,也就几秒钟……
gaoyipu 2008-04-14
  • 打赏
  • 举报
回复
学习
yunfeng007 2008-04-14
  • 打赏
  • 举报
回复
线程加委托

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Data.OleDb;
using System.Threading;
using System.IO;

namespace DbTools
{
internal class DbToolFunc
{
public delegate void ErrorHandler(string errorMessage);
public event ErrorHandler errorMessage;
public delegate void DataCompletedHandler(DataSet data);
public event DataCompletedHandler dataCompleted;

private Thread _threadShow;

public DbToolFunc() { }

public DbToolFunc(string xlsPathName)
{
_xlsPathName = xlsPathName;
}

private string _xlsPathName = null;
public string xlsFileName
{
set { this._xlsPathName = value; }
}

private DataSet _errordata = null;
public DataSet ErrorData
{
get { return this._errordata; }
}

private void GetDataProc()
{
OleDbConnection objConn = null;
try
{
DataSet ds = new DataSet();
if (String.IsNullOrEmpty(_xlsPathName))
{
if (this.errorMessage != null) { if (this.errorMessage != null) this.errorMessage("文件名没有指定!"); }
return;
}
if (!File.Exists(_xlsPathName))
{
if (this.errorMessage != null) { if (this.errorMessage != null) this.errorMessage("文件不存在!"); }
return;
}
string strConn = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source="
+ _xlsPathName + ";Extended Properties='Excel 8.0; HDR=YES; IMEX=1'";

objConn = new OleDbConnection(strConn);
objConn.Open();
DataTable schemaTable = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
OleDbDataAdapter sqlada = new OleDbDataAdapter();
foreach (DataRow dr in schemaTable.Rows)
{
string strSql = "Select * From [" + dr[2].ToString().Trim() + "]";
OleDbCommand objCmd = new OleDbCommand(strSql, objConn);
sqlada.SelectCommand = objCmd;
sqlada.Fill(ds, dr[2].ToString().Trim());
}
objConn.Close();
if (this.dataCompleted != null) this.dataCompleted(ds);
}
catch (Exception ex)
{
objConn.Close();
if (this.errorMessage != null) this.errorMessage(ex.Message);
}
}

public void GetDataSetFromExcel()
{
if (this._threadShow != null && this._threadShow.ThreadState == ThreadState.Running)
{
return;
}
this._threadShow = new Thread(new ThreadStart(GetDataProc));

this._threadShow.Start();
}
}

clqdwangxz 2008-04-14
  • 打赏
  • 举报
回复
我就是使用9楼的方法,读取35万条记录并插入数据库中,很快
美丽大道 2008-04-13
  • 打赏
  • 举报
回复
1个表是一个DATATABLE么 ~~ ??? 读取每个表 把这个表整体赋值给OBJECT[,]的二维数组 ,然后把二维数组转成DATASET 几秒中就搞定
xiaoling9 2008-04-13
  • 打赏
  • 举报
回复
哪位大哥有好的解决方案呀!请给个解决方案。
wt3056 2008-04-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 tanxiaolin520 的回复:]
但是我们公司都用COM的哦,也不会感觉慢啊.

6楼的,你讲下,你们用线程导是怎么操作的,有代码不?
[/Quote]
多线程编程不是几句代码就可以说清楚的,建议LZ再去看看这方面的资料.
System.Threading命名空间下的相关类.
tanxiaolin520 2008-04-13
  • 打赏
  • 举报
回复
但是我们公司都用COM的哦,也不会感觉慢啊.

6楼的,你讲下,你们用线程导是怎么操作的,有代码不?
wt3056 2008-04-13
  • 打赏
  • 举报
回复
操作Excel是通过COM+,速度自然会慢一些吧`
专门做个线程去导数据,不要让程序死在那.
林g 2008-04-13
  • 打赏
  • 举报
回复
关注中...
tanxiaolin520 2008-04-13
  • 打赏
  • 举报
回复
OleDbConnection conn = new OleDbConnection(System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"]);
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+label5.Text.Trim()+";Extended Properties='Excel 8.0;IMEX=1'";
OleDbConnection olconn = new OleDbConnection(strConn);
OleDbDataAdapter oada = new OleDbDataAdapter("select * from [sheet1$]", olconn);
DataSet ds = new DataSet();
OleDbConnection oled = new OleDbConnection("provider=microsoft.jet.OLEDB.4.0;Data source=D:\\mysqlserver\\dgmk.mdb");
oled.Open();
try
{
oada.Fill(ds, "[sheet1$]");
OleDbCommand comm = new OleDbCommand("select * from 网吧名称", conn);
comm.CommandType = CommandType.StoredProcedure;
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
if (ds.Tables[0].Rows[0]["结算金额(元)"].ToString() != " ")
{
string o = comboBox1.Text.Trim() + "应收金额";
OleDbCommand oleddata = new OleDbCommand("Update cattle Set " + o + "='" + ds.Tables[0].Rows[i]["结算金额(元)"].ToString() + "' where 网吧名称='" + ds.Tables[0].Rows[i]["网吧名称"].ToString() + "'", oled);
oleddata.ExecuteNonQuery();
}
}
MessageBox.Show("导入完成");
}
catch (Exception)
{
MessageBox.Show("excel表格格式不对,或者数据连接失败,检查后重试", "导入失败");
}

按照这方法读取的话,5万条左右的数据,也不会超过三分钟. 你可以做一个进度条,应该客户都可以接受吧?
handsome1234 2008-04-13
  • 打赏
  • 举报
回复
SqlConnection mysqlconnection2 = new SqlConnection(str_DotConnection);
mysqlconnection2.Open();

string str_SQLtest="insert into YourTableName select * from OPENROWSET('MICROSOFT.JET.OLEDB.4.0','Excel 8.0;HDR=YES;DATABASE=G:\\DotNetApp\\Excel2Sqlserver\\花名册.xls',sheet1$)";


SqlCommand MySQLCommand = new SqlCommand(str_SQLtest, mysqlconnection2);
MySQLCommand.ExecuteNonQuery();


还有最好把根据你excel格式把数据库字段做好调整,可能你的数据库字段都要是vchar类型,并且还要足够大才行,否则会报各种错误的。
lt5225262 2008-04-13
  • 打赏
  • 举报
回复
关注中...
hery2002 2008-04-13
  • 打赏
  • 举报
回复
下面的例子里面附带有部分Code,试试!
Reading and Writing Excel Spreadsheets Using ADO.NET C# DbProviderFactory
David Hayden
http://davidhayden.com/blog/dave/archive/2006/05/26/2973.aspx.
xiaoling9 2008-04-13
  • 打赏
  • 举报
回复
还有没有更好的解决方案,要解决两方面的问题:
一、能适用office2000,office2003,office2007几种Excle建立的文件。
二、速度要快
对任何 Web 站点而言,最重要的要求就是能够准确而安全地发送和存储信息。这种信息可以是任何形式,包括信贷公司提供的信用卡资料到市场信息网站的民意投票结果。不管将 ASP.NET Web 页面用于何种目的,您迟早都会需要处理涉及数据库的访问、读取和写入数据以及一般的控制操作。 幸运的是,操纵 Web 应用程序的数据库比以前更容易。 .NET Framework 改进了开发复杂的 Web 站点的方式。 ASP.NET 对如何开发复杂和交互的 Web 站点作了重大的改进, ADO.NET 提供了强大而灵活的数据访问功能,从根本上改变了从 Web 应用程序中检索、处理和存储数据的方式。 本书将介绍如何创建能够支持数据的 ASP.NET 应用程序。本书根据一些实践经验进行编写,并列举了演示基础原理的代码示例。本书要求读者对 ASP.NET 和 C# 有一些基本的认识,如果对操纵数据库没有任何经验也没有关系,作者将指导每个过程,包括将 ASP.NET 页面与数据库连接,研究各种读取、处理和更新数据的方法。接下来研究所有涉及侧重于数据的 ASP.NET 编程的问题,包括一些高级的主题,例如使用存储过程和组件。本书还给出了案例分析,将前面几章讨论的内容都置于同一个环境中加以运用。 0.1 本书主要内容 第 1 章介绍创建数据驱动的 Web 站点的一般性概念。特别讨论了 Web 站点与数据之间的关系,在此过程中介绍了 ADO.NET 。在这一章的末尾,还为本书其余章节创建了一个开发环境,讨论了一些可能会遇到的问题。 到底什么是数据库呢?这似乎是个奇怪的问题。第 2 章介绍了不同类型的数据库,如何设计它们,以及如何使用它们存储和检索信息。接下来又概述了 SQL 语言,并与 Microsoft 的数据库方案作了一个简单的比较。 了解了数据库以后,就需要学习如何将它们与 ASP.NET 代码连接。第 3 章首先概述了第 1 章提到的 ADO.NET ,阐明了需要掌握的重要术语。接着是创建和测试对 Northwind 示例数据库的连接,本书将通篇使用该数据库。本章演示了大量例子,演示如何连接不同的数据源,例如 Access , SQL Server , Excel 和 XML ,以便在任何开发环境中都游刃有余。 第 4 章通过一些例子,运用 DataReader 对象读取和显示数据。首先讨论了在 ASP.NET 和 ADO.NET 中处理数据的原理,在 ADO.NET 中引入了 Command 对象。然后介绍如何运用 DataReader 获取数据,接着将那些数据绑定到像单选按钮、复选框这样的不同控件上和最重要的 DataGrid 上。 第 5 章讨论了一个重要的 ADO.NET 对象: DataSet ,它用于存储和检索服务器上任何复杂形式的数据。在介绍完原理之后,使用大量的例子来演示使用 DataSet 的不同方法。 当然,我们并不总是读取其他人的数据,因此第 6 章介绍了如何在现有的数据库中创建自己的记录。该章的主题包括 ASP.NET 的验证控件,以及使用 Command 对象和 DataSet 对象实现插入记录。

110,534

社区成员

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

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

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