gpt4 book ai didi

c# - OLEDB读取Excel的性能

转载 作者:太空狗 更新时间:2023-10-29 23:09:35 25 4
gpt4 key购买 nike

以下代码在 i7-*3.4 GHz windows-7 64 位计算机上需要大约 2500 毫秒才能读取具有 25000 行和 5 列的 Excel 工作表。每个单元格大约包含一个包含 10 个字符的字符串。正常吗?我怎样才能更快地阅读它?

 Stopwatch sw1 = Stopwatch.StartNew();
var connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}; " +
"Extended Properties=Excel 12.0;", filename);

var adapter = new OleDbDataAdapter("SELECT * FROM [roots$]", connectionString);
var ds = new DataSet();
adapter.Fill(ds, "roots");
sw1.Stop(); Console.WriteLine("Time taken for excel roots: {0} ms", sw1.Elapsed.TotalMilliseconds);

最佳答案

我希望将我的发现作为答案,因为行为总是一致的。

我已经复制了你的代码并放入了一个按钮点击事件,只是做了一点改动以确保为每次测试处理适配器和连接。

// test.xls contains 26664 rows by 5 columns. Average 10 char for column, file size is 2448kb
// OS Windows 7 Ultimate 64 bit. CPU Intel Core2 Quad Q9550 2.83ghz
// 8gb ram and disk C is an 256gb SSD cruzer

private void button1_Click(object sender, EventArgs e)
{

string filename = "c:\\tmp\\test.xls";
Stopwatch sw1 = Stopwatch.StartNew();
var connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}; " +
"Extended Properties=Excel 12.0", filename);

using(var adapter = new OleDbDataAdapter("SELECT * FROM [roots$]", connectionString))
{
var ds = new DataSet();
adapter.Fill(ds, "roots");
sw1.Stop();
Console.WriteLine("Time taken for excel roots: {0} ms", sw1.Elapsed.TotalMilliseconds);
}
}

所以,这基本上就是您的代码。此代码在 500 毫秒内执行。但....如果我在 Excel 2010 中保持文件 test.xls 打开,执行时间会跳到 8000 毫秒。

我也试过这种代码变体,但最终结果是一样的

    private void button1_Click(object sender, EventArgs e)
{
string filename = "c:\\tmp\\test.xls";
Stopwatch sw1 = Stopwatch.StartNew();
var connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}; " +
"Extended Properties=Excel 12.0", filename);
using(OleDbConnection cn = new OleDbConnection(connectionString))
{
cn.Open();
using(var adapter = new OleDbDataAdapter("SELECT * FROM [roots$]", cn))
{
var ds = new DataSet();
adapter.Fill(ds, "roots");
sw1.Stop();
Console.WriteLine("Time taken for excel roots: {0} ms", sw1.Elapsed.TotalMilliseconds);
}
}
}

而且,不,它不是 OleDbConnection 的 Open(),始终是 adapter.Fill()

关于c# - OLEDB读取Excel的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11312661/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com