【问题标题】:How to copy contents of Excel UsedRange into an array for faster reading?如何将 Excel UsedRange 的内容复制到数组中以加快读取速度?
【发布时间】:2018-04-11 21:13:08
【问题描述】:

我正在尝试提高从 Excel 工作表中逐行读取单元格的应用程序的性能。我找到了这个解决方案

https://stackoverflow.com/a/25842904/1462656

您想在一次操作中完成:

object[,] objectArray = cSheet.get_Range("A1:C4").Value2; 
dataRange.Value2 = objectArray;

是否假设所有单元格都是 Value2 类型?

一般来说,我想知道如何将 UsedRange 的内容放入本地数组以便更快地访问(而不是通过互操作来回走动)。但是我不提前知道大小,但是我提前知道每列的单元格类型。它们是 Value2 和 Formula 的组合。

到目前为止我的代码

        Application application = new Application();
        application.Workbooks.Open(file);
        Workbook workbook = application.Workbooks.get_Item(1);
        Worksheet worksheet = workbook.Worksheets.get_Item(1);

        Range UsedRange = worksheet.UsedRange;
        int rows = UsedRange.Rows.Count;
        int cols = UsedRange.Columns.Count;

        object[,] objectArray = new object[rows,cols];

我不知道下一步该做什么。

我打算这样做

objectArray = (object[,])UsedRange.Range[?,?];

但我不知道使用上面找到的列数和行数指定范围的语法。

最初我有一个这样的 for 循环,非常慢

for (int rowIndex = 2; rowIndex < UsedRange.Rows.Count; rowIndex++){

    string str1= UsedRange.Rows.Cells[rowIndex, 0 + 1].Value2.ToString();
    string str2= UsedRange.Rows.Cells[rowIndex, 1 + 1].Formula as string;

}

【问题讨论】:

  • 为什么不问答案 1 的操作?他在 SO 上很活跃,可能会更好地帮助你..
  • 你试过object[,] objectArray = worksheet.get_Range($"A1:{cols}{rows}").Value2; 吗?
  • @Michael 我认为有些单元格是公式,而不是所有的 Value2....我该怎么做而不必提前指定它们都是 Value2
  • But I don't understand the first two lines of code of the first post. 您最好在这篇帖子中包含所有相关代码 - 人们不太可能点击链接并阅读其他地方的内容。每个问题都应尽可能独立。
  • 试试cSheet.get_Range("A1:C4").Formula。 AFAIK 这将返回一个字符串数组,可能是公式或单元格值

标签: c# excel office-interop excel-interop


【解决方案1】:

重点是一步完成Excel操作,然后使用.Netobject[,]。例如:

object[,] objectArray = new object[rows,cols];

我不知道下一步该做什么。

object[,] objectArray = shtName.get_Range("A1:Z100").Value2;

for (int row = 0; row < objectArray.GetLength(0); row++)
{
    for (int col = 0; col < objectArray.GetLength(1); col++)
    {
        Debug.WriteLine(objectArray[row,col].ToString());
    }
}

ps这个没测试,今天很忙

每次调用 Excel 时,都会有一个底层 RPC 调用被编组。

这也会有所帮助:https://stackoverflow.com/a/13983731/495455

【讨论】:

  • 好的,感谢您的回复,这种方法有效,但是我真正想要的是 UsedRange.Value[XlRangeValueDataType.xlRangeValueDefault],请参阅我添加的答案。
【解决方案2】:

我无法像在其他解决方案中那样将范围指定为单元格值

shtName.get_Range("A1:Z100")

所以我缺少的是一种在不输入单元格范围的情况下指定使用范围的方法,我从这个例子中找到了答案

https://www.dotnetperls.com/excel-vbnet

        Range UsedRange = worksheet.UsedRange;

        object[,] objectArray = (object[,])UsedRange.Value[XlRangeValueDataType.xlRangeValueDefault];

        for (int row = 2; row < objectArray.GetUpperBound(0); row++)
        {
             string str1= (objectArray[row, 1] == null) ? string.Empty : objectArray[row, 1].ToString();

             string str2= (objectArray[row, 2] == null) ? string.Empty : objectArray[row, 2].ToString();

             //...etc
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    相关资源
    最近更新 更多