如何有效地从大型 Excel 文档中检索所有字符串

Posted

技术标签:

【中文标题】如何有效地从大型 Excel 文档中检索所有字符串【英文标题】:How to retrieve efficiently all strings from a large Excel documents 【发布时间】:2020-02-25 15:55:30 【问题描述】:

应由 .NET 读取 Excel 电子表格。使用属性Value 从活动范围中读取所有值非常有效。这通过一次调用 Excel 来传输二维数组中的所有值。

但是,对于包含多个单元格的范围,无法读取字符串。因此,我们必须遍历所有单元格并使用 Text 属性。这表明较大文档的性能非常差。

使用字符串而不是值的原因是为了获得正确的格式(例如日期或位数)。

这是一个用 C# 编写的示例代码来演示该方法。

static void Main(string[] args)

    Excel.Application xlApp = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
    var worksheet = xlApp.ActiveSheet;
    var cells = worksheet.UsedRange();

    // read all values in array -> fast
    object[,] arrayValues = cells.Value;

    // create array for text of the same extension
    object[,] arrayText = (object[,])Array.CreateInstance(typeof(object),
        new int[]  arrayValues.GetUpperBound(0), arrayValues.GetUpperBound(1) ,
        new int[]  arrayValues.GetLowerBound(0), arrayValues.GetLowerBound(1) );

    // read text for each cell -> slow
    for (int row = arrayValues.GetUpperBound(0); row <= arrayValues.GetUpperBound(0); ++row)
    
        for (int col = arrayValues.GetUpperBound(0); col <= arrayValues.GetUpperBound(1); ++col)
        
            object obj = cells[row, col].Text;
            arrayText[row, col] = obj;
        
    

问题是,是否有更有效的方法可以从 Excel 文档中读取完整的字符串内容。一个想法是使用cells.Copy 将内容复制到剪贴板以从那里获取它。但是,这有一些限制,当然可能会干扰同时使用剪​​贴板的用户。所以我想知道是否有更好的方法来解决这个性能问题。

【问题讨论】:

【参考方案1】:

您可以使用以下代码:

using (MSExcel.Application app = MSExcel.Application.CreateApplication()) 

    MSExcel.Workbook book1 = app.Workbooks.Open( this.txtOpen_FilePath.Text);
    MSExcel.Worksheet sheet = (MSExcel.Worksheet)book1.Worksheets[1];
    MSExcel.Range range = sheet.GetRange("A1", "F13");

    object value = range.Value; //the value is boxed two-dimensional array

代码由this post 提供。它应该比您的代码更高效,但可能不是最好的。

【讨论】:

感谢您的回答,但如果您查看我的解释和上面的示例,您会发现我使用的是 range.Value。但是,这并没有带来格式。因此,如果您使用双打,您不知道位数。如果您使用日期/时间,则不会获得格式等。 哦,对不起。我不知道更好的方法,但我会搜索,如果我找到了,请告诉你。

以上是关于如何有效地从大型 Excel 文档中检索所有字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何在 pySpark 中有效地从字符串数据框中替换多个正则表达式模式的所有实例?

如何有效地从 NSManagedObject 中获取属性的所有有效值?

无论文档边界如何,都可以有效地计算大型语料库中的词频

如何有效地从大 txt 文件中读取字符串

如何有效地从 ArrayList 或字符串数​​组中删除所有空元素?

如何有效地从另一个字符串中找到的字符串中删除重复字符?