А почему на валидации не проверить - наличие минимум всех требуемых колонок, жестко прибитых в коде? Это, кажется одна функция. На этом этапе принимается решение о том, что если что-то в составе, или наименование колонок изменилось - дальше идти не стоит. А на втором этапе, когда начнется по-строчная обработка, можно уже проверять, заполненность/валидность каждой ячейки в строке и принимать решение о том, что с этим делать. Наверное, сценарии в загрузке "если [пусто], тогда ищи по []" не так часты? Обычно, если пусто - выведи в лог.