阅读一个大的Excel文档

时间:2013-03-11 12:07:43

标签: c# excel datatable oledb

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

谢谢

5 个答案:

答案 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

How to split strings on carriage return 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)

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

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自动化目的。 Office应用程序的设计目的是在没有人工监督的情况下运行,并且有一种令人讨厌的倾向,并且会挂起来#34;

在此链接中提供了学习open xml sdk的良好开端: http://msdn.microsoft.com/en-us/library/office/gg575571.aspx