我正在尝试使用以编程方式创建的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")));
关于我缺少的任何想法?
答案 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的方法仍然不是最好的。