Eine Klasse die eine Pivot-Tabelle aus einem DataTable erstellt.
Somit kann eine Pivot-Tabelle zB in einem DataGridView ohne Fremdkomponenten angezeigt werden.
zB Quelltabelle:
Jahr | Quartal | Umsatz
j1 | q1 | u1
j2 | q2 | u2
... | ... | ...
daraus entsteht
Jahr | q1 | q2 | ...
j1 | s11| s12| ...
j2 | s21| s22| ...
... | ...| ...| ...
Aufruf für obiges Beispiel:
DataTable pivotTable = PivotTabelle.PivotTabelleErstellen(
quellDaten,
"Jahr",
"Quartal",
"Umsatz",
true);
dataGridView1.DataSource = pivotTabelle;
using System.Data;
namespace gfoidl.Daten.Pivot
{
public static class PivotTabelle
{
/// <summary>
/// Erstellt eine Pivot-Tabelle aus den Daten.
/// Die Daten werden nicht aggregiert!
/// </summary>
/// <param name="quellTabelle">
/// DataTable mit den Quelldaten
/// </param>
/// <param name="linkeSpalte">
/// Spaltenbeschriftung für die linkste Spalte (Spaltenname in Quelldaten)
/// </param>
/// <param name="spaltenBeschriftung">
/// Spaltenbeschriftung für die Datenzeilen (Spaltenname in Quelldaten)
/// </param>
/// <param name="werte">
/// angezeigte Werte (Spaltenwerte in Quelldaten)
/// </param>
/// <param name="SUM">
/// Gibt an ob die Daten aggregiert werden sollen. Wenn ja werden
/// die Werte aufsummiert. Die Werte müssen in <c>float</c>
/// konvertierbar sein.
/// </param>
/// <returns>
/// Pivot-Tabelle
/// </returns>
public static DataTable PivotTabelleErstellen(
DataTable quellTabelle,
string linkeSpalte,
string spaltenBeschriftung,
string werte,
bool SUM)
{
if (quellTabelle == null) return null;
// DataTables die benötigt werden:
DataTable pivotTabelle = new DataTable();
DataTable dtZeilenBeschriftung = new DataTable();
DataTable dtSpaltenHeader = new DataTable();
// Tabelle für die Werte der linken Spalte:
dtZeilenBeschriftung = quellTabelle.DefaultView.ToTable(
true,
quellTabelle.Columns[linkeSpalte].ColumnName);
// Tabelle mit den Spaltenüberschriften für die Datenzeile:
dtSpaltenHeader = quellTabelle.DefaultView.ToTable(
true,
quellTabelle.Columns[spaltenBeschriftung].ColumnName);
// Linke Spalte zur Pivot-Tabelle hinzufügen:
pivotTabelle.Columns.Add(
new DataColumn
{
ColumnName = linkeSpalte,
Caption = linkeSpalte
});
// Alle weiteren Spalten hinzufügen (Zeilenüberschriften):
foreach (DataRow zeile in dtSpaltenHeader.Rows)
{
pivotTabelle.Columns.Add(
new DataColumn
{
ColumnName = zeile[spaltenBeschriftung]
.ToString()
.Trim()
});
}
// Zeilen mit den Werten der linken Spalte hinzufügen:
foreach (DataRow zeile in dtZeilenBeschriftung.Rows)
{
DataRow dr = pivotTabelle.NewRow();
dr[0] = zeile[linkeSpalte];
pivotTabelle.Rows.Add(dr);
}
// Datenwerte schreiben.
// Alle Zeilen der Quell-Tabelle durchlaufen und
// die Werte in die entsprechenden Felder der
// Pivot-Tabelle schreiben:
foreach (DataRow quellZeile in quellTabelle.Rows)
{
string zeilenWert = quellZeile[linkeSpalte].ToString();
string spaltenWert = quellZeile[spaltenBeschriftung].ToString();
// Alle Zeilen der Ziel-Tabelle (Pivot-Tabelle) durchlaufen.
// Wenn die richtige Zeile gefunden wurde -> Spalten:
foreach (DataRow pivotZeile in pivotTabelle.Rows)
{
if (zeilenWert == pivotZeile[0].ToString())
{
// Zeile wurde gefunden -> alle Spalten durchlaufen
// bis die richtige gefunden wurde:
for (int i = 0; i < pivotZeile.Table.Columns.Count; i++)
{
if (pivotZeile.Table.Columns[i].ColumnName == spaltenWert)
{
// Index der Ziel-Zeile ermitteln und Wert
// schreiben:
int index = pivotTabelle.Rows.IndexOf(pivotZeile);
// Aggregation?
if (SUM)
pivotTabelle.Rows[index][i] =
(float)pivotTabelle.Rows[index][i] +
(float)quellZeile[werte];
else
pivotTabelle.Rows[index][i] =
quellZeile[werte];
// Dieses Spalte ist erledigt -> Schleife kann
// beendet werden:
break;
}
}
// Diese Zeile ist erledigt -> Schleife kann
// beendet werden:
break;
}
}
}
// Sortieren nach der linken Spalte:
pivotTabelle.DefaultView.Sort = pivotTabelle.Columns[0].ColumnName;
// Pivot-Tabelle zurückgeben:
return pivotTabelle;
}
}
}
Kommentare zum Snippet