使用以编程方式创建的 DevExpress GridView 将 DataTable 导出到 Excel

Export DataTable to Excel using programmatically created DevExpress GridView

我正在尝试使用以编程方式创建的 DevExpress GridControl 将 DataTable 导出到 Excel。我的代码导出了 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.RowCount == 0,所以还没有要导出的内容。

事实上,这个 "final initialization" 会在控件可见时发生。但是在您的代码中,您没有将 control 添加到 Form 或 UserControl 的 Controls 集合中,因此实际上它永远不会可见,并且没有行。

如果这是预期的行为,并且您只想使用 GridControl 将数据从 dataTable 导出到 Excel "adaptor" 并且不在表单上显示此 GridControl - 您可以做一些技巧,例如

control.DataSource = tblErrors;
Controls.Add(control);
control.ForceInitialize();
view.ExportToXlsx(....
Control.Remove(control);

请注意,如果您在 tblErrors 中的数据量很大,可能会导致一些 "blinking" 的控制,因为实际上是将控件添加到表单,然后强制初始化、导出数据,然后从中删除控件形式。

对我来说 - 这不是将数据从 dataTable 导出到 Excel 的最佳方法。考虑使用一些库来直接写入 Excel 文件,例如 NPOI。

更新

经过一番思考 - 您可以防止 "blinking" 我已经提到过,只需在向表单添加控件之前设置 control.Visible = false;。但是从我的角度来看,这种使用 GridControl 的方法仍然不是最好的。