Laden...

C# WPF DataGrid nach Excel exportieren / Columns geht / Zeilen nicht ?

Letzter Beitrag vor einem Jahr 6 Posts 647 Views
C# WPF DataGrid nach Excel exportieren / Columns geht / Zeilen nicht ?

Hallo Zusammen,

ich beschäftige mich gerade mit C# / WPF / DataGrid und möchte den Inhalt des DataGrid nach Excel exportieren.

Das DataGrid befülle ich aus einer SQL - Datenbank.

Obwohl ich schon so einiges aus dem WWW ausprobiert habe, bekomme ich es nicht hin, das die Zeilen aus dem DataGrid nach Excel geschrieben werden.

Kann mir dabei jemand weiterhelfen, besten Dank?

        <DataGrid x:Name="DGV01" Margin="10,10,10,70" AlternatingRowBackground="LightGray" AlternationCount="2" AutoGenerateColumns="False">
            <DataGrid.Columns>
                  <DataGridTextColumn Binding="{Binding AUF_NR}" Width="60" Header="Proj.-Nr." />
                   <DataGridTextColumn Binding="{Binding AUF_LIEFERTERMIN, StringFormat=\{0:dd.MM.yy\}}" Width="75" Header="Liefertermin" />
              </DataGrid.Columns>
        </DataGrid>
     private void ButExcel_Click(object sender, RoutedEventArgs e) //, object Exceltabelle)
        {
            Excel.Application MyExcel = new Excel.Application();
            MyExcel.Visible = true;
            Workbook MyWorkbook = MyExcel.Workbooks.Add(System.Reflection.Missing.Value);
            Worksheet MySheets = (Worksheet)MyWorkbook.Sheets[1];
            MyWorkbook.Activate();

            //Header row
            for (int i = 0; i < DGV01.Columns.Count; i++)
            {
                MySheets.Range["A2"].Offset[0, i].Value = DGV01.Columns[i].Header;

            }

            //Rows
            for (int j = 0; j < DGV01.Items.Count; j++)
            {
                for (int k = 0; k < DGV01.Columns.Count; k++) 
                {
                    MySheets.Range["A3"].Offset[j, k].Value = DGV01.Items[j].ToString();
                    //MySheets.Range["A3"].Offset[j].Resize[1, k].Value = DGV01.Items[j].ToString();
                }
            }
        }

Hallo und willkommen,

mit

MySheets.Range["A3"].Offset[j, k].Value = DGV01.Items[j].ToString();

schreibst du auch nur jeweils die ganze Zeile (DataRowView), nicht einzelne Zellenwerte.

Diese erhältst du mit DGV01.Items[j][k].ToString().

Wenn du längerfristig bei WPF bleiben möchtest, dann solltest du unbedingt [Artikel] MVVM und DataBinding  lesen und anwenden - sowie generell auch die Drei-Schichten-Architektur.

Hallo,

vielen Dank für die rasche Rückmeldung.

MySheets.Range["A3"].Offset[j, k].Value = DGV01.Items[j][k].ToString();

Hiermit bekomme ich aber eine Fehlermeldung.

Die Links schaue ich mir an.

Gruß

Dirk

Hallo,

vielen Dank für die rasche Rückmeldung.

MySheets.Range["A3"].Offset[j, k].Value = DGV01.Items[j][k].ToString();

Hiermit bekomme ich aber eine Fehlermeldung.

Die Links schaue ich mir an.

Gruß

Dirk

Sorry, der Index-Operator ItemCollection.Item[] gibt nur ein unspezifiziertes (allgemeingültiges)object zurück - daher muß noch gecastet werden:

for (int j = 0; j < DGV01.Items.Count; j++)
{
    if (DGV01.Items[j] is DataRowView row)
    {
        for (int k = 0; k < DGV01.Columns.Count; k++)
        {
            MySheets.Range["A3"].Offset[j, k].Value = row[k].ToString();
        }
    }
}

Aber du wirst sehen, daß dies mit MVVM und einem geeigneten Datencontainer im ViewModel einfacher geht.

... vielen Dank, werde ich die Tage testen, jetzt erst einmal einige Tage Urlaub.

Vielen Dank auch für die Infos und Links.

Beste Grüße Dirk