阅读一个大的Excel文档

本文关键字:Excel 文档 一个 | 更新日期: 2023-09-27 18:03:30

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

谢谢

阅读一个大的Excel文档

这是一个依赖于使用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

如何分割字符串上的回车与c# ?

您可以使用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();

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

OLEDB总是会花费更多的时间。

SQL Server 2005/2008将使它更快。

对于OLEDB连接,每秒需要7条记录,而

对于SQLServer,每秒需要70条记录。

读取以逗号分隔的文件不需要太多时间,但是插入数据需要时间。

我确实经历过这种事。

您只是想从文件中读取数字列表?一定要用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;
}

我也面临着同样的问题,我在办公室开发中心阅读:

http://social.msdn.microsoft.com/forums/office/en us/418ada31 - 8748 - 48 - d2 - 858 b - d177326daa76/export - - excel开放- xml - sdk - vs - microsoftofficeinteropexcel?forum=oxmlsdk

你有两个选择来操作Excel文件:

  • Microsoft.Office.Interop。使用Excel的Excel。应用程序作为代码执行的附加层
  • 开放的XML SDK,允许开发人员直接使用关闭的文件

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

不支持用于自动化目的的Office。Office应用程序的设计不是为了在没有人类监督的情况下运行,并且有一个令人讨厌的"挂起"趋势
这个链接提供了一个学习开放XML SDK的良好开端:http://msdn.microsoft.com/en-us/library/office/gg575571.aspx