Сначала я добавлю комментарий об использовании EPPlus.Я думаю, что у него даже есть метод для преобразования таблицы данных в лист, так что этот обработчик события щелчка можно свести к примерно 4 строкам кода.Посмотрите на этот вопрос SO - Экспорт DataTable, чтобы преуспеть с EPPlus
Во-вторых, я думаю, что ваша настоящая проблема - простая ошибка "один на один"
Вы сказали(мой перефразировать)
если я использую запрос, который возвращает один столбец, например select abc from services
, ничего не выводится
Вот как вы выводите столбец:
for(int col = 1; col < table.Columns.Count; col++)
Ваша таблица имеет один столбец.Сравнение для запуска цикла выглядит следующим образом: is 1 less than 1?
False
Цикл не запускается
Если в вашей таблице 10 столбцов, цикл будет выполняться 9 раз.Последний столбец никогда не будет выведен.У вас есть запрос с новым столбцом в конце, вы ожидаете его увидеть, его нет, потому что ваш c # не выводит его, а не потому, что в данных столбца есть что-то странное ...
С точки зрения того, что с этим делать, измените сравнение, которое вы делаете в части «следует запустить цикл»:
for(int col = 1; col <= table.Columns.Count; col++)
Или измените способ индексации (индекс на 0 вместо индекса на1):
for(int col = 0; col < table.Columns.Count; col++)
excel[row, col+1] = table[row][col]; //excel is 1 based, c# is 0 based
Относительно этих понятий «но данные не изменились, и код не изменился, и наблюдается нечто иное» - это почти никогда не происходит.Гораздо более вероятно, что человек в уравнении ошибочно что-то запутал.Возможно, первый парень, который написал код, столкнулся с той же проблемой и просто продублировал последний столбец в SQL, чтобы обойти его, затем вы / кто-то другой увидел это и, хотя "это выглядит неправильно, я просто уберу это ..."Через несколько месяцев вы ищете и собираетесь: «Раньше это работало, я уверен, что оно работало ...»
:)
А если серьезно;использовать EPPlus;) это восхитительно, просто, создает файлы xlsx напрямую (они являются просто файлами xml внутри zip, переименованы в xlsx) и является очень простым.Excel COM - большая головная боль, и вам не нужно будет создавать кошмар технической поддержки для себя.С EPPlus (используйте менеджер пакетов nuget для добавления ссылки на EPPlus) ваш код будет выглядеть примерно так:
using(SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM services", "PUT YOUR CONN STRING IN A CONFIG FILE")){
DataTable dt = new DataTable();
da.Fill(dt);
using (ExcelPackage ep = new ExcelPackage(newFile))
{
ExcelWorksheet ws = ep.Workbook.Worksheets.Add("Sheetname");
ws.Cells["A1"].LoadFromDataTable(dt, true);
ep.SaveAs(new FileInfo("YOUR SAVE PATH HERE"));
}
}