Чтение из файла Excel — ячейки со значениями отображаются пустыми

Я написал некоторый код, который считывает каждую строку в файле Excel (для двух определенных столбцов), который я буду использовать позже для выполнения SQL-запроса обновления для каждой из строк со значением.

Я отобразил эти значения в списке, и я получаю гораздо больше нулей, чем ожидалось, при сравнении с кодами запасов в файле Excel.

Я попытался изменить форматирование файла excel, но это не имело никакого значения. Есть строки, в которых определенно есть биржевые коды в этой позиции, но когда программа выполняет сравнение ячеек, программа идентифицирует их как нулевые, когда они действительно имеют значения.

Кто-нибудь знает, в чем проблема с моим кодом?

private void btnStockCodes_Click(object sender, RoutedEventArgs e)
{
    string file = @"\\amn-fs-01\users$\Shanel\Desktop\Stock Codes.xlsx";
    Microsoft.Office.Interop.Excel.Application ExcelApp = new Microsoft.Office.Interop.Excel.Application();
    Workbook ExcelWorkbook = ExcelApp.Workbooks.Open(file);
    Worksheet ews = ExcelApp.ActiveWorkbook.Sheets[1];
    Microsoft.Office.Interop.Excel.Range usedRange = ews.UsedRange;

    int TotalCounter = 0;
    string StockCode = "";
    string ReserveID = "";
    int nullcounter = 0;
    int foundcounter = 0;

    foreach (Microsoft.Office.Interop.Excel.Range row in usedRange.Rows)
    {
        StockCode = "";
        ReserveID = "";
        TotalCounter = TotalCounter + 1;

        if (row.Cells[TotalCounter,7].Value == null)
        {
            Listbox1.Items.Add(TotalCounter + " null");
            nullcounter = nullcounter + 1;
        }
        else
        {
            StockCode = row.Cells[TotalCounter,7].Value.ToString();
            ReserveID = row.Cells[TotalCounter, 3].Value.ToString();
            Listbox1.Items.Add(TotalCounter + " " + StockCode + " " + ReserveID);
            foundcounter = foundcounter + 1;
        }
    }

    txtTotal1.Text = foundcounter.ToString() + " Found";
    txtTotal2.Text = nullcounter.ToString() + " Null Values";
    txtTotal3.Text = TotalCounter.ToString() + " Total Records";
}

person Shane Lea    schedule 28.11.2017    source источник
comment
Пожалуйста, загрузите образец файла, чтобы мы могли протестировать код. Не стесняйтесь сократить его до нескольких строк данных, которые показывают проблему.   -  person mjwills    schedule 28.11.2017
comment
Спасибо за ваше предложение! Я добавил ссылку на дропбокс на пример файла excel в описании.   -  person Shane Lea    schedule 28.11.2017


Ответы (2)


Я бы не стал доверять тому, что Worksheet.UsedRange всегда работает правильно, иногда он содержит больше ячеек, чем должен, или меньше. Я предлагаю прочитать все строки на листе, пока у вас есть какие-либо значения. Как только значений больше не будет, просто перестаньте его читать. А если у вас слишком много строк, вы можете одновременно прочитать все значения в массив, например здесь, и работать с массив.

person Alex Butenko    schedule 28.11.2017

Спасибо за ваш вклад, я устранил ошибку!

Это происходит в row.Cells[TotalCounter,7].Value.ToString().

Это должно было быть row.Cells[7].Value.ToString()

Мне не нужно было указывать индекс строки, так как об этом позаботится цикл Foreach. Я рассмотрю альтернативные способы написания кода, поскольку Worksheet.UsedRange может работать не во всех случаях, как предложил Алекс.

person Shane Lea    schedule 28.11.2017
comment
Вы спасли мой день! - person Roshan; 30.03.2021