从Excel到DataSet或DataGridView的快速方法

我从Excel工作表获取数据,最终目标是在DataGridView中显示数据。

目前我只是查看excel数据的UsedRange并将其插入到datagridview中。 这工作正常,但有100多行数据时,可能会陷入困境。

我也玩弄了从excel到数据集(使用相同的浪费方法),并且如预期的那样,加载数据大致是相同的时间。

我想知道有没有人有更好的方法的信息? 也许使用Excel文件中的XML?

编辑:

一些附加信息:

这是一个WinForms应用程序,用户将在运行时挑选和加载excel文件。

编辑

一些附加信息的返回:

Excel文件位于用户的电脑上。 一般的假设是,他们每次使用应用程序时都会加载不同的文件。 [不知道这是否有帮助,但可能很好知道:)]

我最近也遇到了同样的问题…我无法真正find一个可以为我做这个的开箱即用的解决scheme,所以我最终手工编写了一些代码。

实际上,在我的代码库中有两个不同的解决scheme:一个使用OLEDB,另一个使用Excel Interop。 从你的问题,我猜你一直在尝试使用互操作解决scheme,它太慢了。 如果您想要直接从Excel中读取表格(每个表格有一个表格),则OLEDB解决scheme可能更干净,速度更快。 如果你到了需要写入Excel文件的地步,你可能会发现OLEDB太有限了。 那是我一个项目的经验。

无论如何,我会从我的OLEDB解决scheme中发布一些信息,希望能够让你开始:

public void FillDataTables(DataSet dataSet) { var worksheetNames = GetWorksheetNames(); foreach (DataTable table in dataSet.Tables) { if (!worksheetNames.Contains(table.TableName + "$")) continue; FillDataTable(table); } } public void FillDataTable(DataTable table) { using (var connection = ConnectionProvider.GetNew()) { var adapter = GetNewDataAdapter(table, connection); adapter.Fill(table); } } private IEnumerable<string> GetWorksheetNames() { return GetSchemaTable() .AsEnumerable() .Select(dr => dr.Field<string>("TABLE_NAME")); } public DataTable GetSchemaTable() { using (var connection = (OleDbConnection)ConnectionProvider.GetNew()) { connection.Open(); return connection.GetSchema("Tables"); } } 

这里是ExcelConnectionProvider的代码:

 public class ExcelConnectionProvider : IConnectionProvider { private readonly string _connectionString; private readonly string _workbookPath; public string ConnectionString { get { return _connectionString; } } public string WorkbookPath { get { return _workbookPath; } } public ExcelConnectionProvider(string workbookPath) { _workbookPath = workbookPath; _connectionString = GetConnectionString(); } private string GetConnectionString() { var builder = new OleDbConnectionStringBuilder { Provider = "Microsoft.ACE.OLEDB.12.0", DataSource = _workbookPath }; builder.Add("Extended Properties", "Excel 12.0 Xml;HDR=Yes"); return builder.ConnectionString; } public DbConnection GetNew() { return new OleDbConnection(_connectionString); } } 

如果遇到此编译的任何问题,请尝试在项目中包含“System.Data.DataSetExtensions”程序集。

编辑:: : IConnectionProvider是不需要的 – 这是我添加到我的图书馆的接口,因为我除了Excel以外还有其他连接提供程序。

如果你有select,我会出口Excel数据到数据库或XML文件(只是一次,不是每次运行应用程序)。 除非您的用户定期更新这个excel文件,并且希望立即在您的应用程序中看到结果显示。

下面是如何使用Excel作为数据源(您可能已经拥有它,但值得certificate,因为它只是性能,现在的问题): http : //support.microsoft.com/default.aspx?scid=kb;en-我们; 311731

但是,是的 – 在你的应用程序获取它之前将它转换成sql-server表或xml文件,我会认为你会更快乐。

这些Office Open XML文档是? 如果是,可以使用System.IO.Packaging命名空间或Open XML SDK 2.0来查看数据。 这应该是相当快的,因为它只是处理XML文件。 当然,如果他们不是OOXML,那么这真的没用,我很抱歉。