Да, есть более эффективный способ.
Создайте диапазон, который точно соответствует ячейкам, которые вам действительно нужны.
Получить Value2 свойство этого диапазона.Результатом будет тип массива.
Итерация по массиву
Проблема с вашим подходом заключается в большом количестве межпроцессных запросовмежду вашим приложением и Excel.Ваш подход требует двух или трех запросов на ячейку.Предложенный подход намного быстрее, поскольку требует нескольких предварительных запросов, но не дополнительных запросов на ячейку.
Обратите внимание, что это работает примерно до 4000 ячеек.Если вам нужно обработать больше ячеек, вам нужно разделить его на несколько диапазонов, каждый из которых содержит менее 4000 ячеек.
Обновление
Предполагается, что Excel уже работает, это будет выглядеть примерно так (правильное количество строк в столбце B выбирается автоматически):
var excelApp = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
Excel._Worksheet workSheet = (Excel.Worksheet)excelApp.ActiveSheet;
var range = (Excel.Range)workSheet.Range[workSheet.Range["B2"],
workSheet.Range["B2"].End[Excel.XlDirection.xlDown]];
var cellData = (Object[,])range.Value2;
string result = "";
foreach (var cell in cellData) {
result += cell.ToString();
}