Why does print functionality use foreign key values and excel export doesn't? Because Xceed hates you.
There is a workaround by rolling your own excel export class that extends Xceed's ExcelExporter base class though.
Here is it: <download>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Xceed.Wpf.DataGrid;
using Xceed.Wpf.DataGrid.Export;
namespace sfc.Controls.Custom
{
public class CustomExcelExporter : ExcelExporter
{
private DataGridControl _dgc;
public CustomExcelExporter(DataGridControl dgc)
: base(dgc)
{
_dgc = dgc;
}
protected override void StartDataItemField(ExportContext exportContext, object fieldValue)
{
// Attempt to find the export column in the master section of the DataGrid
var column = (Column)_dgc.Columns[exportContext.Column.FieldName];
// If the column cannot be found in the master section, search the columns of the detail configurations
if (column == null)
{
foreach (DetailConfiguration detailConfiguration in _dgc.DetailConfigurations)
{
if ((column = (Column)detailConfiguration.Columns[exportContext.Column.FieldName]) != null)
{
break;
}
}
}
if (column != null)
{
ForeignKeyConfiguration fkc = column.ForeignKeyConfiguration;
// Check if the column being exported has a ForeignKeyConfiguration and export the mapped value if so
if (fkc != null && fkc.ForeignKeyConverter != null)
{
fieldValue = fkc.ForeignKeyConverter.GetValueFromKey(fieldValue, fkc);
}
}
base.StartDataItemField(exportContext, fieldValue);
}
}
}
One gotacha I found when writing this is that if the foreign key lookup returns a null its going to corrupt your excel document.