XamDataGrid で GridViewSettings.OrientationHorizontal に設定すると、標準の ExcelExporter では画面の転置表示どおりのレイアウトでエクスポートできません。DataPresenterExcelExporterHeaderLabelExporting および CellExporting イベントで既定の書き出しをキャンセルし、行と列のインデックスを入れ替えてセル値を設定することで、画面表示どおりの位置で Excel に出力できます。

XamDataGrid の設定

Horizontal 表示にするには、XamDataGrid.ViewSettings に設定する GridViewSettingsOrientation プロパティに Horizontal を指定します。

<igWPF:XamDataGrid x:Name="xamDataGrid1" DataSource="{Binding}">
    <igWPF:XamDataGrid.ViewSettings>
        <igWPF:GridViewSettings Orientation="Horizontal" />
    </igWPF:XamDataGrid.ViewSettings>
    <igWPF:XamDataGrid.FieldLayouts>
        <igWPF:FieldLayout>
            <igWPF:FieldLayout.Settings>
                <igWPF:FieldLayoutSettings AutoGenerateFields="False" />
            </igWPF:FieldLayout.Settings>
            <igWPF:FieldLayout.Fields>
                <igWPF:Field Name="Id" />
                <igWPF:Field Name="Name" Label="氏名"/>
                ...
            </igWPF:FieldLayout.Fields>
        </igWPF:FieldLayout>
    </igWPF:XamDataGrid.FieldLayouts>
</igWPF:XamDataGrid>

HeaderLabelExporting / CellExporting イベントの処理

DataPresenterExcelExporterHeaderLabelExporting イベントと CellExporting イベントでは、それぞれ e.Canceltrue にして既定のセル書き出しをキャンセルし、e.CurrentRowIndexe.CurrentColumnIndex の値を入れ替えたうえで、Workbook の該当セルに値を設定しています。これにより、Horizontal 表示で転置されたグリッドの見た目どおりの位置に、ヘッダーラベルとセル値が出力されます。

var exporter = new DataPresenterExcelExporter();
exporter.HeaderLabelExporting += Exporter_HeaderLabelExporting;
exporter.CellExporting += Exporter_CellExporting;
exporter.Export(xamDataGrid1, @"..\..\..\Excel\out.xlsx", WorkbookFormat.Excel2007);

private void Exporter_HeaderLabelExporting(object? sender, HeaderLabelExportingEventArgs e)
{
    e.Cancel = true;
    var row = e.CurrentRowIndex;
    var col = e.CurrentColumnIndex;
    e.Workbook.Worksheets[e.CurrentWorksheet.Index].Rows[col].Cells
.Value = e.Label; } private void Exporter_CellExporting(object? sender, CellExportingEventArgs e) { e.Cancel = true; var row = e.CurrentRowIndex; var col = e.CurrentColumnIndex; e.Workbook.Worksheets[e.CurrentWorksheet.Index].Rows[col].Cells
.Value = e.Value; }

実行結果

サンプルを実行して「Excel Export」ボタンをクリックすると、XamDataGrid の Horizontal 表示のレイアウトのまま、行と列の位置が画面表示どおりに転置された状態で Excel ファイル(out.xlsx)が出力されます。

製品について

Ultimate UI for WPF