我有一个 DataGrid,在填充后我想将其导出为 Excel 格式。到目前为止,我能够做到这一点。当我尝试对列顺序进行排序时,我的问题就来了。标头是根据正确的顺序构建的,但 DataGridRows 不是。
图像显示了最终结果:
在此示例中,我将“ID Equipa”列与“Tipo Entidade”交换,但是在 excel 文件(右侧)中,行值继续,就好像在标题更新良好时没有发生任何变化一样。
不知道这是否有帮助,但我的“ExportToExcel”类基于此项目ExportToExcel 项目,但没有使用它的类标识符
public class ExportToExcel<T, U>
where T : class
where U : List<T>
{
// ...
}
我创造了这个
public class ExportToExcel
}
public ExportToExcel(List<DataGridColumn> columns, List<DataGridRow> dataToFill)
{
// ...
}
}
我认为问题出在我的“dataToFill”参数中,因为它保持默认的单元格顺序并且在列排序事件后不会更新。
我不明白为什么会这样。如果有人能对这个问题有所了解,我将不胜感激。
谢谢
编辑:
按照 Sheridan 的建议,我发布了一些额外的代码。
这就是我提取 DataGrid 行的方式
public IEnumerable<DataGridRow> GetDataGridRows()
{
var itemsSource = dgEntities.ItemsSource as IEnumerable;
if (null == itemsSource) yield return null;
foreach (var item in itemsSource)
{
var row = dgEntities.ItemContainerGenerator.ContainerFromItem(item) as DataGridRow;
if (null != row)
{
if (dgEntities.SelectedItems.Count == 0) yield return row;
else if (row.IsSelected) yield return row;
}
}
}
这就是我如何激活 ExportToExcel 类
public void ExportToExcel()
{
if (dgEntities.ItemsSource != null)
{
try
{
BLL.ExportToExcel export = new ExportToExcel(dgEntities.Columns.ToList(), GetDataGridRows().ToList());
export.GenerateReport();
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
}
}
下一点是我对前面提到的 CodeProject 项目中的原始代码的覆盖
private object[] CreateHeader()
{
// Create an array for the headers and add it to the
// worksheet starting at cell A1.
List<object> objHeaders = new List<object>();
foreach (DataGridColumn dgc in Columns)
{
if (dgc.Visibility == System.Windows.Visibility.Visible) objHeaders.Add(dgc.Header);
else deletedColumns.Add(dgc.DisplayIndex);
}
var headerToAdd = objHeaders.ToArray();
AddExcelRows("A1", 1, headerToAdd.Length, headerToAdd);
SetHeaderStyle();
return headerToAdd;
}
private void WriteData(object[] header)
{
object[,] objData = new object[DataToFill.Count, header.Length];
for (int j = 0; j < DataToFill.Count; j++)
{
DataGridRow row = DataToFill[j];
int i = 0;
for (int x = 0; x < Columns.Count; x++)
{
if (!deletedColumns.Contains(x))
{
DataGridCell cell = GetCell(row, j, x);
if (cell != null && cell.Content is TextBlock)
{
objData[j, i] = ((TextBlock)cell.Content).Text;
i++;
}
}
}
}
AddExcelRows("A2", DataToFill.Count, header.Length, objData);
AutoFitColumns("A1", DataToFill.Count + 1, header.Length);
}