Filehelpers ExcelStorage. ExtractRecords перестал работать, когда первая ячейка пуста

Еще одна точка в дополнение к другим здесь:

не включают частных определений во включать файл. Например, любое определение, которое используется только в xxx.cpp, должно быть в xxx.cpp, не xxx.h.

Кажется очевидным, но я часто вижу его.

5
задан Sebastian 22 September 2009 в 23:48
поделиться

2 ответа

Похоже, вы столкнулись с проблемой в FileHelpers.

Что происходит, так это то, что метод ExcelStorage.ExtractRecords использует проверку пустой ячейки, чтобы увидеть, достиг ли он конца лист. Это можно увидеть в исходном коде ExcelStorage.cs:

while (CellAsString(cRow, mStartColumn) != String.Empty)
{
    try
    {
        recordNumber++;
        Notify(mNotifyHandler, mProgressMode, recordNumber, -1);

        colValues = RowValues(cRow, mStartColumn, RecordFieldCount);

        object record = ValuesToRecord(colValues);
        res.Add(record);

    }
    catch (Exception ex)
    {
        // Code removed for this example
    }
}


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

Некоторые способы обойти это:

  1. Не поместите все пустые ячейки в первую позицию столбца.
  2. Не используйте excel в качестве формата файла - сначала конвертируйте в CSV.
  3. Посмотрите, сможете ли вы получить исправление от разработчика или исправить исходный код самостоятельно.

] Первые два - это обходные пути (и не очень хорошие). Третий вариант может быть лучшим, но каково состояние конца файла? Вероятно, вся пустая строка будет достаточно хорошей проверкой (но даже это может не всегда работать во всех случаях).

4
ответ дан 13 December 2019 в 19:30
поделиться

Благодаря помощи Тузо я смог найти способ решить эту проблему. Я добавил метод в класс ExcelStorage для изменения условия завершения while. Вместо того чтобы искать в первой ячейке пустое значение, я смотрю, что все ячейки в текущей строке пусты. Если это так, тогда верните false. Это изменение в части while в ExtractRecords:

while (!IsEof(cRow, mStartColumn, RecordFieldCount))

вместо

while (CellAsString(cRow, mStartColumn) != String.Empty)

IsEof - это метод проверки того, что вся строка пуста:

    private bool IsEof(int row, int startCol, int numberOfCols)
    {
        bool isEmpty = true;
        string cellValue = string.Empty;

        for (int i = startCol; i <= numberOfCols; i++)
        {
            cellValue = CellAsString(row, i);
            if (cellValue != string.Empty)
            {
                isEmpty = false;
                break;
            }
        }

        return isEmpty;
    }

Конечно, если пользователь оставляет пустую строку между двумя строками данных, строки после этого один не будет обработан, но я думаю, что будет хорошо продолжать работать над этим.

Спасибо

4
ответ дан 13 December 2019 в 19:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: