如何有效地从大型 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 中获取属性的所有有效值?