我想知道什么是在Excel中读取单元格的最快方法。 我有一个Excel文件,其中包含50000行,我想知道如何快速阅读它。 我只需要读取第一列和oledb连接,它需要我15秒。 有更快的方法吗?阅读一个大的Excel文档
谢谢
我想知道什么是在Excel中读取单元格的最快方法。 我有一个Excel文件,其中包含50000行,我想知道如何快速阅读它。 我只需要读取第一列和oledb连接,它需要我15秒。 有更快的方法吗?阅读一个大的Excel文档
谢谢
OLEDB总是会花费更多时间。
SQL Server 2005/2008将使其更快。
对于OLEDB连接,需要7个记录每秒,同时
对于SQLServer的,它每秒需70个记录。
在阅读逗号分隔文件时不需要太多时间,但需要时间来插入数据。
我从字面上经历过这件事。
这有什么用? OP表示他们想要导入CSV而不是与SQL Server进行比较? – Belogix 2013-03-11 12:16:39
@Belogix我说,阅读不需要时间,将文件插入数据库需要时间,我已经在与股票交易相关的项目工作,其中我必须处理.csv格式的大型交易文件,并且我正在执行相同的操作。那就是我为什么这么说的原因。 – Freelancer 2013-03-11 12:19:04
@Freelancer已授予,但OP没有暗示这将被插入到数据库中。只是想“在Excel中读取单元格”。我没有看到SQLServer如何进入这个等式。 – 2013-03-11 16:05:56
你只是想读一个文件中的数字列表?它必须在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;
}
你可以把你的代码用于读取使用OLEDb提供程序的50000条记录。我已经试过这样做了,它花了4-5秒钟阅读3列的50000条记录。我以下面的方式完成了,只是看看,它可能会帮助你。 :)
// 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();
如果你可以把你的代码放在这里,以便我可以尝试纠正。 :)
对于一个带有50k行的excel文件,他们只想选择第一列,这种方法已经被复制到csv文件和使用流读取器殴打。但是如果他们想要在Excel文件中选择更多的列并且列数很多的话。我相信人们会来这个。 – 2015-10-19 07:14:02
这是一种依赖于使用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
我正面临着同样的事情,我在办公室开发中心阅读:
你有两种选择用于操纵Excel文件:使用Excel.Application作为代码执行一个额外的层
这两者之间没有太大差别,但在您的情况下,性能是一个问题,您应该使用Open XML SDK,可能会更快一些,并且不需要太多时间才能打开大文件处理。你也可以在上面的链接中看到,我引用:
不支持用于自动化目的的办公室。 Office应用程序没有被设计成无需人工监督运行,并有一个讨厌的倾向,“挂”
一个良好的开端学习的Open XML SDK是在这个环节上提供: http://msdn.microsoft.com/en-us/library/office/gg575571.aspx
为14秒足够?你可以跳过oledb并将表单转换为csv文件,然后从文件中读取行?你的oledb查询是怎样的?那个单元有很多数据吗?它是优秀的OpenXml(又名xlsx)? – rene 2013-03-11 12:11:56
对不起,excel文档已经在.csv中。 – Sebastien 2013-03-11 12:13:35
如果它已经在csv中,请使用cvs阅读器:请参阅http://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader – 2013-03-11 12:33:33