Tôi muốn trình bày kết quả của mình như một câu trả lời vì hành vi luôn nhất quán.
Tôi đã sao chép mã của bạn và đặt bên trong sự kiện nhấp nút, chỉ cần thay đổi một chút để đảm bảo vứt bỏ bộ điều hợp và kết nối cho mọi thử nghiệm được thực hiện.
// 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);
}
}
Vì vậy, về cơ bản, đây là mã của bạn. Mã này thực hiện trong 500ms. NHƯNG .... nếu tôi giữ tệp test.xls mở trong Excel 2010, thời gian thực thi sẽ nhảy lên 8000ms.
Tôi cũng đã cố gắng thay đổi mã này, nhưng kết quả cuối cùng đều giống nhau
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);
}
}
}
và, không, nó không phải là Open() của OleDbConnection, luôn luôn là adapter.Fill()
tập dữ liệu là các đối tượng "nặng", tạo tốt hơn lớp của riêng bạn và điền vào danh sách bằng cách sử dụng bộ dữ liệu – Boomer
Tôi nghĩ rằng hầu hết chi phí hiệu suất là thời gian kết nối (hãy thử sửa đổi kích thước bản ghi để xem thời gian trôi qua tăng đáng kể) – Pynner
Hãy thử để di chuyển khởi động của StopWatch sang sau khi kết nối đã được thực hiện và xem cách nhiều thời gian mà một phần mất. Nhưng như Boomer đã chỉ ra, hãy thử sử dụng OleDbCommand và OleDbDataReader thay vì OleDbDataAdapter và một DataSet và bạn cũng có thể đạt được một số tốc độ. –