C# 如何将Excel UsedRange的内容复制到数组中以加快读取速度?
我试图提高一个应用程序的性能,该应用程序逐行从Excel工作表中读取单元格。我找到了这个解决方案 您希望在一次操作中完成此操作: 是否假定所有单元格的类型均为Value2 一般来说,我想知道如何将UsedRange的内容放入本地数组中,以便更快地访问(而不是通过互操作进行来回访问)。但我事先不知道大小,但我事先知道每列上的单元格类型。它们是值2和公式的组合 到目前为止我的代码C# 如何将Excel UsedRange的内容复制到数组中以加快读取速度?,c#,excel,office-interop,excel-interop,C#,Excel,Office Interop,Excel Interop,我试图提高一个应用程序的性能,该应用程序逐行从Excel工作表中读取单元格。我找到了这个解决方案 您希望在一次操作中完成此操作: 是否假定所有单元格的类型均为Value2 一般来说,我想知道如何将UsedRange的内容放入本地数组中,以便更快地访问(而不是通过互操作进行来回访问)。但我事先不知道大小,但我事先知道每列上的单元格类型。它们是值2和公式的组合 到目前为止我的代码 Application application = new Application();
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;
}
for(int-rowIndex=2;rowIndex
关键在于一步完成Excel操作,然后使用.Net对象[,]
。例如:
object[,] objectArray = new object[rows,cols];
我不知道下一步该怎么办
object[,]objectArray=shtName.get_Range(“A1:Z100”).Value2;
for(int row=0;row
ps我还没有测试这个,今天很忙
每次调用Excel时,都会有一个底层RPC调用被封送
这也会有所帮助:例如,在其他解决方案中,我无法将范围指定为单元格值
shtName.get_Range("A1:Z100")
所以我缺少的是一种在不输入单元格范围的情况下指定使用范围的方法,我从这个例子中找到了答案
Range UsedRange=worksheet.UsedRange;
对象[,]对象数组=(对象[,])UsedRange.Value[XlRangeValueDataType.xlRangeValueDefault];
for(int row=2;row
为什么不询问答案1的op?他在SO上很活跃,可能会更好地帮助您..您是否尝试过object[,]objectArray=worksheet.get_Range($“A1:{cols}{rows}”).Value2代码>?@Michael我想有些细胞是公式,不是所有的Value2…我如何做到这一点,而不必事先指定它们都是Value2,但我不理解第一篇文章的前两行代码。
你最好在这篇文章中包含所有相关代码-人们不太可能点击链接和阅读其他地方的内容。每个问题应尽可能独立。请尝试cSheet。获取范围(“A1:C4”)。公式。好的,这将返回一个字符串数组,可能是一个公式或单元格值。好的,谢谢你的回复,这种方法很有效,但是我真正想要的是UsedRange.Value[XlRangeValueDataType.xlRangeValueDefault],请参阅我添加的答案。
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());
}
}
shtName.get_Range("A1:Z100")
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
}