我有从Excel工作表中获取的数据,最终目标是在DataGridView中显示。
目前我正在浏览excel数据的UsedRange并将其插入到datagridview中。这样可以正常工作,但是当有100多行数据时可能会陷入困境。
我还玩过从excel到数据集(使用相同的浪费方法),并且正如预期的那样,加载数据需要大约相同的时间。
我想知道是否有人有更好的信息?也许使用Excel文件中的XML?
修改
其他一些信息:
这是一个WinForms应用程序,用户将在运行时选择并加载excel文件。
修改
返回一些其他信息:
Excel文件位于用户的电脑上。一般的假设是,每次使用应用程序时,它们都会加载不同的文件。 [不确定这是否有帮助,但可能很高兴知道:)]
答案 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,那么这真的没用,我道歉。