データが入力された後に 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);
}