Правильный метод - указать Excel точно, где в таблице найти заголовки столбцов и данные.Импортирование всего листа и попытка восстановить заголовки из произвольной строки данных создает серьезные проблемы. OPENQUERY не гарантирует порядок строк. При тестировании будет казаться, что импорт всегда выполняется по порядку, но как только вы переместите его в систему с многотомной базой данных tempdb или сильно загруженной производственной системой, ваш импортбольше не будет заказываться, и ваш код будет пытаться интерпретировать ваши данные как заголовки столбцов.
вместо:
string query = String.Format("select * from [{0}$]", "Sheet1");
use:
string query = String.Format("select * from [{0}${1}]", "Sheet1","A2:ZZ");
EDIT:используйте "A2:end"
вместо "A2:ZZ"
.