我想知道在Excel中读取单元格的最快方法是什么。 我有一个包含50000行的Excel文件,我想知道如何快速阅读它。 我只需要阅读第一列,并使用oledb连接,它需要15秒。 有更快的方法吗?
谢谢
答案 0 :(得分:8)
这是一种依赖于使用Microsoft.Office.Interop.Excel。
的方法请注意:我使用的Excel文件只有一列,数据包含50,000个条目。
1)用Excel打开文件,将其保存为csv,然后关闭Excel。
2)使用StreamReader快速读取数据。
3)在回车换行符上拆分数据并将其添加到字符串列表中。
4)删除我创建的csv文件。
我使用System.Diagnostics.StopWatch来计算执行时间,该函数运行需要1.5568秒。
public static List<string> ExcelReader( string fileLocation )
{
Microsoft.Office.Interop.Excel.Application excel = new Application();
Microsoft.Office.Interop.Excel.Workbook workBook =
excel.Workbooks.Open(fileLocation);
workBook.SaveAs(
fileLocation + ".csv",
Microsoft.Office.Interop.Excel.XlFileFormat.xlCSVWindows
);
workBook.Close(true);
excel.Quit();
List<string> valueList = null;
using (StreamReader sr = new StreamReader(fileLocation + ".csv")) {
string content = sr.ReadToEnd();
valueList = new List<string>(
content.Split(
new string[] {"\r\n"},
StringSplitOptions.RemoveEmptyEntries
)
);
}
new FileInfo(fileLocation + ".csv").Delete();
return valueList;
}
资源:
http://www.codeproject.com/Articles/5123/Opening-and-Navigating-Excel-with-C
答案 1 :(得分:3)
您可以使用OLEDb提供程序将代码放入50000条记录中。我试过这样做,用3列读取50000条记录需要4-5秒。我已经按照以下方式做了,只是看看,它可能会帮助你。 :)
// txtPath.Text is the path to the excel file
string conString = @"Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + txtPath.Text + ";" + "Extended Properties=" + "\"" + "Excel 12.0;HDR=YES;" + "\"";
OleDbConnection oleCon = new OleDbConnection(conString);
OleDbCommand oleCmd = new OleDbCommand("SELECT field1, field2, field3 FROM [Sheet1$]", oleCon);
DataTable dt = new DataTable();
oleCon.Open();
dt.Load(oleCmd.ExecuteReader());
oleCon.Close();
如果您可以将代码放在这里,那么我可以尝试纠正。 :)
答案 2 :(得分:2)
OLEDB总是需要更多时间。
SQL Server 2005/2008将使其更快。
对于OLEDB连接,
时每秒需要7条记录对于SQLServer,每秒需要70条记录。
读取逗号分隔文件需要的时间不多,但插入数据需要时间。
我确实经历过这件事。
答案 3 :(得分:0)
您只想阅读文件中的数字列表?它必须在Excel中吗?是否有一些非技术人员更新了清单?如果要将单个列中的50,000个数字读入内存中的列表,只需将单元格复制到文本文件并使用TextReader读取。这将是即时的。
List<string> ReadFile(string path)
{
TextReader tr = new StreamReader(path);
string line;
List<string> lines = new List<string>();
while((line=tr.ReadLine())!=null)
{
//if this was a CSV, you could string.split(',') here
lines.add(line);
}
return lines;
}
答案 4 :(得分:0)
我面对同样的事情,我在办公室开发中心阅读:
您有两种操作Excel文件的选择:
两者之间没有太大差异,但在您遇到性能问题的情况下,您应该使用Open XML SDK,这可能会更快,并且不需要那么多时间打开一个大的处理前的文件。正如您在上面的链接中所读到的那样,我引用:
不支持Office自动化目的。 Office应用程序的设计目的是在没有人工监督的情况下运行,并且有一种令人讨厌的倾向,并且会挂起来#34;
在此链接中提供了学习open xml sdk的良好开端: http://msdn.microsoft.com/en-us/library/office/gg575571.aspx