【发布时间】:2015-05-29 00:04:01
【问题描述】:
好的,所以我有这个函数可以很好地插入行,然后将数据放入这些行中。
public void inputRowData(string[] data, int rds)
{
int bestRow = getRowByRDS(rds);
string val = getValueOfCell(bestRow, 6);
if (val == null || val.Equals(""))
{
shiftRows(bestRow, data.Length-1);
string[] formatedData = formatOutput(bestRow, data);
// 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;
}
else
{
Console.WriteLine("Line has some information already, skipping 1 more");
shiftRows(bestRow, data.Length + 1);
}
}
现在,如果您看一下,我会找到“bestRow”,它由 excel 中的最后一行确定,特定列的 int 值显示在这里:
private int getRowByRDS(int id)
{
int bestfit = -1;
Boolean foundOne = false;
Microsoft.Office.Interop.Excel.Range usedRange = oSheet.UsedRange;
for (int i = 2; i < usedRange.Rows.Count; i++)
{
string val = getValueOfCell(i, 3);
if (val == null)
continue;
int rds = int.Parse(val);
Console.WriteLine(val + " " +i);
if (rds == id)
{
bestfit = i;
foundOne = true;
}
else
if (foundOne)
return bestfit;
}
return bestfit;
}
发生的情况是,当它完成 inputRowData 方法中的数据集时,它将移动到具有不同 rds 值的另一个集。它会尝试调用 getRowByRDS 但会抛出错误。
在调试时,它看起来好像没有更新工作表......所以假设第一组 10 个字符串插入到第 900 行,如果下一组假设在它之后立即开始 bestRow 将返回 901 而不是 911 .
错误是
A first chance exception of type 'System.Runtime.InteropServices.COMException' occurred in TTE Tool.exe
【问题讨论】:
-
两个问题:1) 您能否确认所有单元格都按照您的预期进行了更新?有可能您的数组没有对齐,并且并非所有单元格都在更改。 2) 如果没问题,我的下一个猜测是这与使用
UsedRange有关。更改单元格后,此属性可能没有正确更新(不确定可能性有多大)。要对此进行测试,请使用.End()方法之一来获取您正在使用的数据块。或者如果数据是连续的(没有空格),请使用CurrentRegion。