0

データが入力された後に Excel 形式にエクスポートしたい DataGrid があります。これまでのところ、私はそれを行うことができます。私の問題は、列の順序を並べ替えようとすると発生します。ヘッダーは正しい順序で作成されますが、DataGridRows はそうではありません。

画像は最終結果を示しています。

列の並べ替え

この例では、'ID Equipa' 列を 'Tipo Entidade' に置き換えましたが、Excel ファイル (右側) では、ヘッダーが適切に更新されている間、変更が発生していないかのように行の値が続きます。

これが役立つかどうかはわかりませんが、私の 'ExportToExcel' クラスはこのプロジェクトExportToExcel Projectに基づいていますが、クラス識別子を使用する代わりに

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);
    }
4

1 に答える 1