如何将 Excel UsedRange 的内容复制到数组中以加快读取速度?
How to copy contents of Excel UsedRange into an array for faster reading?
我正在尝试提高从 Excel 工作表逐行读取单元格的应用程序的性能。我找到了这个解决方案
You want to do it in one operation:
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;
}
重点是一步完成Excel操作,然后使用.Net object[,]
。例如:
object[,] objectArray = new object[rows,cols];
I don't know what to do next.
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 调用被编组。
这也有帮助:
我无法像在其他解决方案中那样将范围指定为单元格值
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
}
我正在尝试提高从 Excel 工作表逐行读取单元格的应用程序的性能。我找到了这个解决方案
You want to do it in one operation:
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;
}
重点是一步完成Excel操作,然后使用.Net object[,]
。例如:
object[,] objectArray = new object[rows,cols];
I don't know what to do next.
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 调用被编组。
这也有帮助:
我无法像在其他解决方案中那样将范围指定为单元格值
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
}