【问题标题】:Read a big Excel document阅读大型 Excel 文档
【发布时间】:2013-02-26 14:33:43
【问题描述】:

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

谢谢

【问题讨论】:

  • 14 秒够快吗?您可以跳过 oledb 并将工作表转换为 csv 文件,然后从文件中读取行吗?您的 oledb 查询如何?那个单元格有很多数据吗?它是 excel OpenXml(又名 xlsx)吗?
  • 抱歉excel文档已经在.csv中了。
  • 如果它已经在 csv 中,请使用 cvs 阅读器:请参阅此处codeproject.com/Articles/9258/A-Fast-CSV-Reader

标签: c# excel datatable oledb


【解决方案1】:

OLEDB 总是需要更多时间。

SQL Server 2005/2008 将使其更快。

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

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

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

我真的经历过这件事。

【讨论】:

  • 这有什么帮助? OP 说他们想导入 CSV 而不是与 SQL Server 比较?
  • @Belogix 我说,阅读不需要时间,将文件插入数据库需要时间,我已经在处理与证券交易所相关的项目,其中我必须处理 .csv 格式的大型交易文件我正在做同样的操作。这就是我说的原因。
  • @Freelancer 同意,但 OP 并没有暗示这将被插入到数据库中。只想“读取 Excel 中的单元格”。我什至不明白 SQLServer 是如何进入这个等式的。
【解决方案2】:

您只想从文件中读取数字列表?它必须在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 条记录。我试过这样做,读取 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();
    

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

    【讨论】:

    • 对于一个 50k 行的 excel 文件并且他们只想选择第一列,这种方法已被复制到 csv 文件并使用流阅读器击败。但是,如果他们想在包含很多列的 excel 文件中选择更多列。我相信人们会带着这个来。
    【解决方案4】:

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

    【讨论】:

    • 只是想说声谢谢,大大改进了我的程序
    • 我认为您可以同样使用此代码string line = "" line = sr.ReadLine(),而不必担心carriage return line feed
    【解决方案5】:

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

    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 文件的选择:

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

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

    不支持用于自动化目的的 Office。 Office 应用程序并非设计为在没有人工监督的情况下运行,并且具有令人讨厌的“挂起”趋势

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多