Еще одна точка в дополнение к другим здесь:
не включают частных определений во включать файл. Например, любое определение, которое используется только в xxx.cpp, должно быть в xxx.cpp, не xxx.h.
Кажется очевидным, но я часто вижу его.
Похоже, вы столкнулись с проблемой в 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
}
}
Таким образом, если начальный столбец любой строки пуст, то предполагается, что файл готов.
Некоторые способы обойти это:
] Первые два - это обходные пути (и не очень хорошие). Третий вариант может быть лучшим, но каково состояние конца файла? Вероятно, вся пустая строка будет достаточно хорошей проверкой (но даже это может не всегда работать во всех случаях).
Благодаря помощи Тузо я смог найти способ решить эту проблему. Я добавил метод в класс 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;
}
Конечно, если пользователь оставляет пустую строку между двумя строками данных, строки после этого один не будет обработан, но я думаю, что будет хорошо продолжать работать над этим.
Спасибо