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

时间:2015-03-27 10:29:13

标签: c# .net winforms devexpress xtragrid

我正在尝试使用以编程方式创建的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")));

关于我缺少的任何想法?

1 个答案:

答案 0 :(得分:1)

当您调用view.ExportToXlsx时,此视图(以及整个GridControl)最终未初始化并加载数据。
您可以非常简单地检查它 - 只需在view.ExportToXlsx电话上设置断点,您就可以在此时看到view.RowCount == 0,所以无需导出。

实际上,当控件变得可见时,会发生这种“最终初始化”。但是在您的代码中,您没有将control添加到Form或UserControl的Controls集合中,因此实际上它永远不可见,并且没有行。

如果它是预期的行为,你只想使用GridControl将数据从dataTable导出到Excel作为某个“适配器”而不在表单上显示这个GridControl - 你可以做一些技巧,如

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

请注意,如果tblErrors中的数据量很大,可能会导致某些“闪烁”控制,因为控件实际上已添加到表单中,然后强制初始化,导出数据,然后控制从表单中删除。

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

<强>更新

经过深思熟虑之后 - 你可以通过在将控件添加到表单之前设置control.Visible = false;来防止“闪烁”。但是从我的观点来看,这种使用GridControl的方法仍然不是最好的。