Interop Excel .Find() 整个匹配未找到值,部分匹配找到
Interop Excel .Find() whole match not finding value, partial match does
所以我有一个电子表格,我试图在其中找到特定列的索引 headers。
我发现 XlLookAt.xlWhole
没有找到值。但是,如果我使用 XlLookAt.xlPart
它会。
我无法使用 xlPart
,因为它在某些情况下找不到正确的匹配项。
我已经确认只有 AMT_ISSUED
在实际电子表格的单元格中,并且两端没有任何空格。
有谁知道为什么 XlLookAt.xlWhole
不起作用。这是我正在使用的代码
List<int> columnNumbers = new List<int>();
object misValue = System.Reflection.Missing.Value;
var columnIndex = range.EntireRow.Find("AMT_ISSUED",
misValue, XlFindLookIn.xlValues, XlLookAt.xlWhole,
XlSearchOrder.xlByColumns, XlSearchDirection.xlNext,
false);
var index = columnIndex?.Column ?? 0;
columnNumbers.Add(index);
更新:
我什至做到了:
var value = ((Range)range.Cells[1, 4]).Value2.ToString();
var columnIndex = range.EntireRow.Find(value,
misValue, XlFindLookIn.xlValues, XlLookAt.xlWhole,
XlSearchOrder.xlByColumns, XlSearchDirection.xlNext,
false);
var index = columnIndex?.Column ?? 0;
columnNumbers.Add(index);
value
找到了正确的文本,但列索引仍然是 null
。
解决方法(我不喜欢它,但它会让我越过这个障碍)
注意:标题可以在第 1 行或第 2 行,如果它在第 2 行,则第一行的第一个单元格已填充
for (int i = 1; i < 3; i++)
{
for (var h = 1; h <= colCount; h++)
{
object cellValue = ((Range)range.Cells[i, h]).Value2;
if ((h== 1 || h==2) && cellValue == null)
{
break;
}
if (columns.Contains(cellValue))
{
columnNumbers.Add(h);
}
}
}
Range.Find方法returnsRange
对象。因此,首先,您需要获取 Range
,然后,如果不是 null
,则检索列索引:
// Create Excel instance
Excel.Application excel = new Excel.Application { Visible = true };
Excel.Workbook book = excel.Workbooks.Open(@"PATH_TO_FILE");
Excel.Worksheet sheet = book.Sheets[1] as Excel.Worksheet;
// Search in the first row
Excel.Range header = sheet.Range["1:1"].Find("AMT_ISSUED", LookAt: Excel.XlLookAt.xlWhole);
if (header != null)
{
// Header is found
int index = header.Column;
}
else
{
// Header is not found
}
所以我有一个电子表格,我试图在其中找到特定列的索引 headers。
我发现 XlLookAt.xlWhole
没有找到值。但是,如果我使用 XlLookAt.xlPart
它会。
我无法使用 xlPart
,因为它在某些情况下找不到正确的匹配项。
我已经确认只有 AMT_ISSUED
在实际电子表格的单元格中,并且两端没有任何空格。
有谁知道为什么 XlLookAt.xlWhole
不起作用。这是我正在使用的代码
List<int> columnNumbers = new List<int>();
object misValue = System.Reflection.Missing.Value;
var columnIndex = range.EntireRow.Find("AMT_ISSUED",
misValue, XlFindLookIn.xlValues, XlLookAt.xlWhole,
XlSearchOrder.xlByColumns, XlSearchDirection.xlNext,
false);
var index = columnIndex?.Column ?? 0;
columnNumbers.Add(index);
更新:
我什至做到了:
var value = ((Range)range.Cells[1, 4]).Value2.ToString();
var columnIndex = range.EntireRow.Find(value,
misValue, XlFindLookIn.xlValues, XlLookAt.xlWhole,
XlSearchOrder.xlByColumns, XlSearchDirection.xlNext,
false);
var index = columnIndex?.Column ?? 0;
columnNumbers.Add(index);
value
找到了正确的文本,但列索引仍然是 null
。
解决方法(我不喜欢它,但它会让我越过这个障碍) 注意:标题可以在第 1 行或第 2 行,如果它在第 2 行,则第一行的第一个单元格已填充
for (int i = 1; i < 3; i++)
{
for (var h = 1; h <= colCount; h++)
{
object cellValue = ((Range)range.Cells[i, h]).Value2;
if ((h== 1 || h==2) && cellValue == null)
{
break;
}
if (columns.Contains(cellValue))
{
columnNumbers.Add(h);
}
}
}
Range.Find方法returnsRange
对象。因此,首先,您需要获取 Range
,然后,如果不是 null
,则检索列索引:
// Create Excel instance
Excel.Application excel = new Excel.Application { Visible = true };
Excel.Workbook book = excel.Workbooks.Open(@"PATH_TO_FILE");
Excel.Worksheet sheet = book.Sheets[1] as Excel.Worksheet;
// Search in the first row
Excel.Range header = sheet.Range["1:1"].Find("AMT_ISSUED", LookAt: Excel.XlLookAt.xlWhole);
if (header != null)
{
// Header is found
int index = header.Column;
}
else
{
// Header is not found
}