2013-03-11 65 views
10

我想知道什么是在Excel中读取单元格的最快方法。 我有一个Excel文件,其中包含50000行,我想知道如何快速阅读它。 我只需要读取第一列和oledb连接,它需要我15秒。 有更快的方法吗?阅读一个大的Excel文档

谢谢

+1

为14秒足够?你可以跳过oledb并将表单转换为csv文件,然后从文件中读取行?你的oledb查询是怎样的?那个单元有很多数据吗?它是优秀的OpenXml(又名xlsx)? – rene 2013-03-11 12:11:56

+0

对不起,excel文档已经在.csv中。 – Sebastien 2013-03-11 12:13:35

+3

如果它已经在csv中,请使用cvs阅读器:请参阅http://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader – 2013-03-11 12:33:33

回答

2

OLEDB总是会花费更多时间。

SQL Server 2005/2008将使其更快。

对于OLEDB连接,需要7个记录每秒,同时

对于SQLServer的,它每秒需70个记录。

在阅读逗号分隔文件时不需要太多时间,但需要时间来插入数据。

我从字面上经历过这件事。

+2

这有什么用? OP表示他们想要导入CSV而不是与SQL Server进行比较? – Belogix 2013-03-11 12:16:39

+0

@Belogix我说,阅读不需要时间,将文件插入数据库需要时间,我已经在与股票交易相关的项目工作,其中我必须处理.csv格式的大型交易文件,并且我正在执行相同的操作。那就是我为什么这么说的原因。 – Freelancer 2013-03-11 12:19:04

+1

@Freelancer已授予,但OP没有暗示这将被插入到数据库中。只是想“在Excel中读取单元格”。我没有看到SQLServer如何进入这个等式。 – 2013-03-11 16:05:56

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; 
} 
3

你可以把你的代码用于读取使用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(); 

如果你可以把你的代码放在这里,以便我可以尝试纠正。 :)

+0

对于一个带有50k行的excel文件,他们只想选择第一列,这种方法已经被复制到csv文件和使用流读取器殴打。但是如果他们想要在Excel文件中选择更多的列并且列数很多的话。我相信人们会来这个。 – 2015-10-19 07:14:02

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

How to split strings on carriage return with C#?

+2

只是想说声谢谢你,大大改进了我的程序 – Bubo 2013-12-27 21:01:35

+0

我认为你可以同样使用这个代码'line line =“” line = sr.ReadLine()'而不用担心'回车换行' – mchar 2017-06-12 08:10:32

0

我正面临着同样的事情,我在办公室开发中心阅读:

http://social.msdn.microsoft.com/Forums/office/en-US/418ada31-8748-48d2-858b-d177326daa76/export-to-excel-open-xml-sdk-vs-microsoftofficeinteropexcel?forum=oxmlsdk

你有两种选择用于操纵Excel文件:使用Excel.Application作为代码执行一个额外的层

  • 的Microsoft.Office.Interop.Excel
  • 开放XML SDK,其允许显影剂直接与关闭的文件
  • 工作

这两者之间没有太大差别,但在您的情况下,性能是一个问题,您应该使用Open XML SDK,可能会更快一些,并且不需要太多时间才能打开大文件处理。你也可以在上面的链接中看到,我引用:

不支持用于自动化目的的办公室。 Office应用程序没有被设计成无需人工监督运行,并有一个讨厌的倾向,“挂”

一个良好的开端学习的Open XML SDK是在这个环节上提供: http://msdn.microsoft.com/en-us/library/office/gg575571.aspx