Excel互操作效率获取行数与值在一列
本文关键字:一列 效率 互操作 获取 Excel | 更新日期: 2023-09-27 17:51:08
目前,我正在使用下面的代码段来获得第3列中值为int的行。
private int getRowByRDS(int id)
{
int bestfit = -1;
Boolean foundOne = false;
for (int i = 2; i < oSheet.Rows.Count; i++)
{
string val = getValueOfCell(i, 3);
if (val == null)
continue;
int rds = int.Parse(val);
if (rds == id)
{
bestfit = i;
foundOne = true;
}
else
if (foundOne)
return bestfit;
}
return bestfit;
}
问题是,这是可悲的显示在大量的行。
有没有人建议一种更好的方法,在col3中搜索int并返回它所在的最后一行# ?
乔:public void inputRowData(string[] data, int rds)
{
int bestRow = getRowByRDS_a(rds);
string[] formatedData = formatOutput(bestRow, data);
string val = getValueOfCell(bestRow, 6);
if (val != null)
{
shiftRows(bestRow, data.Length);
bestRow++;
}
else
shiftRows(bestRow, data.Length - 1);
// transform formated data into string[,]
string[][] splitedData = formatedData.Select(s => s.Split(''t')).ToArray();
var colCount = splitedData.Max(r => r.Length);
var excelData = new string[splitedData.Length, colCount];
for (int i = 0; i < splitedData.Length; i++)
{
for (int j = 0; j < splitedData[i].Length; j++)
{
excelData[i, j] = splitedData[i][j];
}
}
oSheet.get_Range("A" + bestRow.ToString()).Resize[splitedData.Length, colCount].Value = excelData;
MainWindow.mainWindowDispacter.BeginInvoke(new System.Action(() => MainWindow.mainWindow.debugTextBox.AppendText("Done with " + rds + " input!" + Environment.NewLine)));
}
private void shiftRows(int from, int numberof)
{
from++;
Range r = oXL.get_Range("A" + from.ToString(), "A" + from.ToString()).EntireRow;
for (int i = 0; i < numberof; i++)
r.Insert(Microsoft.Office.Interop.Excel.XlInsertShiftDirection.xlShiftDown);
}
我是这样做的:
- 获取与您感兴趣的列对应的Range
- 获取您感兴趣的工作表的userange
- 获取上述两个范围的交集
- 获取Range的值,这将是您感兴趣的列的值的数组
你可以遍历这个数组来找到你想要的值,然后使用它的索引来得到行号。
使用上述方法调用Excel的次数是O(1),而不是您的版本中的O(n)。
您也可以使用Excel的Find方法。对象范围。这个方法返回一个Excel。如果找到匹配项,则为范围对象,否则为空。按照Joe描述的前三个步骤创建搜索范围。如果Find方法返回一个有效的Range,那么您可以使用它的Row属性。
注:对不起,乔,我想给你的答案投票,但是我还不能这么做。