C # Interop.Excel '# N / A' Значение ячейки преобразовано в -2146826246

У меня есть приложение C #, которое использует Interop.Excel (v15) для открытия нескольких книг с данными клиентов, их анализа и вывода некоторой информации. Проблема, с которой я столкнулся, заключается в том, что некоторые из ячеек книги имеют значение # N / A; который в Excel является CVErr, указывающим на наличие ошибки определенного типа. В контексте данных наших клиентов они используют # N / A для обозначения неприменимо - нет основной проблемы с формулой, это просто значение, которое они используют.

Когда я использую следующие функции для обхода строк рабочего листа, я получаю значение Int -2146826246 каждый раз, когда сталкиваюсь с # N / A:

private void traverseRows(Excel._Worksheet worksheet)
{
    //Get the used Range
    Excel.Range usedRange = worksheet.UsedRange;

    //Last Row/Column
    int lastUsedRow = usedRange.Row + usedRange.Rows.Count - 1;
    int lastUsedColumn = usedRange.Column + usedRange.Rows.Columns.Count;

    foreach (Excel.Range row in usedRange.Rows)
    {
        List<String> rowData = rangeToList(row);
    }
}

List<string> rangeToList(Microsoft.Office.Interop.Excel.Range inputRng)
{
    object[,] cellValues = (object[,])inputRng.Value2;
    List<string> lst = cellValues.Cast<object>().ToList().ConvertAll(x => Convert.ToString(x));
    return lst;
}

Отладка Visual Studio

Я пробовал исследовать каждую ячейку по отдельности, но это замедлило работу приложения до того момента, когда оно было непригодным (в большинстве книг есть 10 000 строк по 38 столбцов). Я попытался преобразовать в Text, Value и Value2 безрезультатно. Мне нужно иметь возможность читать значения # N / A в их истинной форме, чтобы я мог проводить сравнения и позже выводить значение в другую книгу. Как лучше всего этого добиться?


person slashNburn    schedule 15.03.2017    source источник
comment
вместо преобразования в строку используйте @ verabtim, чтобы получить его как литерал.   -  person Sivaprasath Vadivel    schedule 15.03.2017
comment
@SivaprasathV Где я могу использовать @ verbatim? Значения поступают из объекта COM-строки, даже в этой форме они имеют значение -214682646.   -  person slashNburn    schedule 15.03.2017


Ответы (1)


Может быть, ссылка ниже вам поможет.

https://xldennis.wordpress.com/2006/11/29/dealing-with-cverr-values-in-net-part-ii-solutions/

Я не уверен, но только мое предложение: поскольку -2146826246 - это код для значения # N / A, вы можете проверить значение / текст ячейки на то же самое, и вы можете добавить # N / A в качестве текста в свой список «lst».

Но лучший подход - использовать OpenXml для извлечения данных из Excel.

person Trusha Savsani    schedule 15.03.2017
comment
На самом деле я наткнулся на статью Майка на начальном этапе исследования / устранения неполадок; статье уже более 10 лет, и я надеялся, что за последнее десятилетие получилось более элегантное решение этой проблемы (т.е. отсутствие необходимости вручную переводить все # N / A). Я изучу использование OpenXml. - person slashNburn; 15.03.2017