Я пытаюсь экспортировать DataTable в Excel с помощью программно созданного DevExpress GridControl. Код, который я экспортировал столбцы GridView, но без каких-либо заполненных строк данных. Вот пример кода (tblErrors - это параметр DataTable, переданный методу):
GridControl control = new GridControl();
GridView view = new GridView();
control.ViewCollection.Add(view);
control.MainView = view;
foreach (DataColumn tCol in tblErrors.Columns)
{
GridColumn gCol = new GridColumn();
gCol.Name = "col" + tCol.ColumnName;
gCol.FieldName = tCol.ColumnName;
gCol.UnboundType = DevExpress.Data.UnboundColumnType.Bound;
view.Columns.Add(gCol);
gCol.Visible = true;
}
control.DataSource = tblErrors;
control.Visible = true;
view.ExportToXlsx(String.Format(@"{0}\{1} Error Report.xlsx", Environment.GetFolderPath(Environment.SpecialFolder.Desktop), DateTime.Today.ToString("yyyy-MM-dd")));
Какие-нибудь идеи относительно того, что мне не хватает?
В то время, когда вы вызываете view.ExportToXlsx
этот вид (и весь GridControl) не инициализируется и не загружается.
Вы можете проверить это очень просто - просто установите view.ExportToXlsx
останова на view.ExportToXlsx
и вы увидите, что в этот момент view.RowCount == 0
, так что пока ничего не экспортировать.
Фактически, эта "окончательная инициализация" произойдет, когда управление станет видимым. Но в вашем коде вы не добавляете control
над коллекцией Controls
Form или UserControl, поэтому на самом деле она никогда не будет видна и не будет содержать строк.
Если это предполагаемое поведение, и вы хотите просто экспортировать данные из вашей таблицы данных в Excel с помощью GridControl в качестве "адаптера" и не показывать этот GridControl в форме - вы можете сделать какой-то трюк
control.DataSource = tblErrors;
Controls.Add(control);
control.ForceInitialize();
view.ExportToXlsx(....
Control.Remove(control);
Обратите внимание, что это может привести к некоторому "миганию" элемента управления, если ваша сумма данных в tblErrors
велика, потому что управление фактически добавляется в форму, затем принудительно инициализирует, экспортирует данные и затем управляет удалением из формы.
Что касается меня - это не лучший подход для экспорта данных из dataTable в Excel. Подумайте об использовании вместо некоторых библиотек для прямой записи в файлы Excel, например, NPOI.
ОБНОВИТЬ
После некоторых мыслей - вы можете предотвратить "мигание", о котором я упомянул, установив control.Visible = false;
перед добавлением контроля в форму. Но этот подход с использованием GridControl по-прежнему не самый лучший с моей точки зрения.