从Excel到DataSet或DataGridView的快速方法

时间:2010-07-28 16:17:30

标签: .net vb.net winforms excel dataset

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

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

我还玩过从excel到数据集(使用相同的浪费方法),并且正如预期的那样,加载数据需要大约相同的时间。

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

修改

其他一些信息:

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

修改

返回一些其他信息:

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

3 个答案:

答案 0 :(得分:2)

我最近遇到了同样的问题......我无法真正找到一个能为我做到这一点的开箱即用的解决方案,所以我最终手工编写了一些代码。

我实际上在我的代码库中有两个不同的解决方案:一个使用OLEDB,另一个使用Excel Interop。从你的问题来看,我猜你一直在尝试使用互操作解决方案,而且速度太慢了。如果您只想直接从Excel读取表格,每个工作表有一个表格,OLEDB解决方案可能更干净,更快。但是,如果您到达需要写入Excel文件的位置,您可能会发现OLEDB太有限了。这是我对一个项目的经验。

无论如何,我会从我的OLEDB解决方案中发布一些有用的东西,希望能让你开始:

    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之外我还有其他连接提供程序。

答案 1 :(得分:1)

如果您可以选择,我首先将excel数据导出到数据库或xml文件(只需一次,而不是每次运行应用程序时)。除非您的用户定期更新此Excel文件,并且希望立即在您的应用中看到结果显示。

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

但是 - 在你的应用程序获得它之前将它转换为sql-server表或xml文件,我认为你会更开心。

答案 2 :(得分:0)

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