Взаимодействие Excel .ind () полное совпадение не находит значения, частичное совпадение делает - PullRequest
0 голосов
/ 09 января 2020

Итак, у меня есть электронная таблица, в которой я пытаюсь найти индекс определенных заголовков столбцов. Я обнаружил, что XlLookAt.xlWhole не находит значения. Однако, если я использую XlLookAt.xlPart, это так.

Я не могу использовать xlPart, так как в некоторых случаях он не находит правильного совпадения.

Я подтвердил, что в ячейке в реальной таблице есть только AMT_ISSUED и нет ' t любые пробелы на обоих концах.

Кто-нибудь знает, почему 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);
                    }
                }
            }

1 Ответ

1 голос
/ 13 января 2020

Метод Range.Find возвращает объект Range. Итак, сначала вам нужно получить 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
}
...