Hallo in die Runde der Experten,
ich habe mit c# eine Exceldatei erstellt und möchte nun die letzte beschriebene Zeile ermitteln. Mit UsedRange ist das ja möglich. Ich habe 3 Tabellenbereiche die eine unterschiedliche Anzahl von Zeilen aufweisen und ich möchte gern die letzte beschriebene Zeile der Spalte H ermitteln. Ich habe schon viel im Netz gesucht und einiges gefunden, doch leider alles ohne Erfolg. Mit VBA gibt es ja die Möglichkeit - Cells(Rows.Count, 2).End(xlUp).Row
Vielleicht hat irgendjemand einen Ansatz für mich.
Besten Dank im Voraus
WDani
Hallo wdani,
mit welchem Library greifst du auf Excel zu bzw. hast die Excel-Datei erstellt? Danach richten sich dann auch die Lösungsmöglichkeiten.
eine Exceldatei erstellt und möchte nun die letzte beschriebene Zeile ermitteln
Wenn die Datei eh erstellt wird, kannst du dabei nicht einfach verfolgen was die letzte Zeile (pro Spalte, etc.) ist?
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
Hallo,
mit Microsoft.Office.Interop.Excel.
Bisher habe ich mit UsedRange gearbeitet. Da ich aber auf der Tabelle quasi 3 Tabellen habe, die ich dann mit ListObject jeweils in eine formatierte Tabelle umwandele, benötige ich die letzte beschriebene Zelle z. B. aus der Spalte "H", da die Anzahl der Zeilen unterschiedlich sind. Ich hoffe, ich habe mich einigermaßen verständlich ausgedrückt.
Du weißt, wo deine Tabelle beginnt (vermutlich die 1. Zeile) und Du weißt, wie viele Zeilen Du eingefügt hast - wo ist das Problem?
Anzahl Zeilen + 1 (für Header) und Du hast die letzte beschriebene Zeile, schreib ein "H" davor und Du hast die Zell-Referenz.
NuGet Packages im Code auslesen
lock Alternative für async/await
Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.
Hallo,
ja die Daten fangen alle mit Header in Zeile 1 an, dann sind die Datenzeilen variabel, weil diese einmal aus einer CSV Datei und zum anderen aus einer SQL-Datenbank kommen.
Beispiel:
CSV Daten Zeile 1 Spalte A hat 750 Zeilen.
SQL Daten Zeile 1 Spalte H haben 450 Zeilen.
Um die diese Daten - CSV und SQL - als formatierte Tabellen (ListObject) zu erstellen, benötige ich die letzte beschriebene Zeile in Spalte H.
Wenn ich UsedRange nehme, wird auch die formatierte Tabelle "SQL" mit 750 Zeilen formatiert und ich habe 300 leer Zellen in der "Tabelle".
Ich hoffe, dass ich das verständlich ausgedrückt habe. Es muss doch etwas Ähnliches wie in VBA geben, oder?
MfG
Wdani
Wenn die API nichts dafür hat, musst Du eben selber Zeile für Zeile prüfen und zählen.
Kurzer Blick in die Doku zeigt:
workSheet.Cells[1, "A"] = "ID Number";
workSheet.Cells[1, "B"] = "Current Balance";
Ich rate mal, dass man über den Indexer auch den Wert abrufen kann und wenn da etwas drin steht, ist die Zelle beschrieben und Du kannst deinen Index +1 zählen.
Aber ich verstehe immer noch nicht, warum Du nicht einfach beim Befüllen mit zählst.
Ist doch egal, woher die Daten kommen, wenn Du sie in die Excel-Datei schreibst, zählst Du einen Counter mit hoch und hast deine letzte beschriebene Zeile.
Abgesehen davon:
Wenn Du nicht zwingend etwas brauchst, was nur mit Interop geht, würde ich dir von Interop abraten. Interop ist furchtbar, außerdem gibt es einige Einschränkungen, wie z.B. es muss Office in der passenden Architektur installiert sein und mehrere Dateien gleichzeitig bearbeiten geht meine ich auch nicht.
Lieber mit Hilfe von DocumentFormat.OpenXml, oder - mein Favorit - Du nutzt das Framework ClosedXml, was das durchaus komplexe OpenXml-ObjektModel deutlich vereinfacht. In beiden Fällen erstellst Du die xlsx-Datei, speicherst sie ab und kannst sie dem Nutzer anbieten.
NuGet Packages im Code auslesen
lock Alternative für async/await
Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.
Ich habe das KI-Modell codegemma befragt und folgenden Snippet als Antwort erhalten:
// Erhalten Sie die letzten beschriebenen Zeile in der angegebenen Spalte
int lastRow = worksheet.Cells[worksheet.Rows.Count, columnNumber].End(Excel.XlDirection.xlUp).Row;
Hallo Palladin007,
Du hast natürlich recht mit dem Counter.
Manchmal sieht man den Wald vor lauter Bäumen nicht.
Nochmals vielen Dank für Deine Antwort
MfG
Wdani
Hallo und Danke für den Code. Werde es eventuell noch heute ausprobieren.
MfG
Wdani