Мое решение этой проблемы не так элегантно, как некоторые могут использовать.
Сначала я сопоставляю столбцы с символами (A, B, C, D и т. Д.), Чтобы знать, что FirstName = A, LastName = B и Age = C.
Далее, я просматриваю dataCells, чтобы увидеть, есть ли ячейка со ссылкой на Age. Если есть ссылка на ячейку Age, я проверю тип данных ячейки.
ex: dataCells.Where (x => x.CellReference.Value.Contains (cellIndex)). First (). DataType == CellValues.SharedString)
В этом случае cellIndex будет = 'C'.
Если предыдущий запрос linq имеет значение true, то вы перейдете в таблицу sharedString и найдете значение для возраста по CellReference.
var age = sharedStrings.ChildElements [int.Parse (dataCells.Where (x => x.CellReference.Value.Contains (cellIndex)). FirstOrDefault (). InnerText)]. InnerText;
Вашей проблемы со случайной установкой LastName (столбец B) на любой возраст (столбец C) следует избегать, если вы отрабатываете ссылку на ячейку для каждой строки данных.
Примечание: я только что натолкнулся на то, что пустые ячейки в Excel хранятся двумя разными способами. Иногда есть ссылка на индекс SharedStringTable (cell.DataType = "s" и cell.InnerText = "37"), а иногда ячейка просто пуста (cell.DataType = null и cell.InnerText = "").