Export von Daten aus dem DataSet in xml --> Wandlung in xlsx?

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von OliverSte.

    Export von Daten aus dem DataSet in xml --> Wandlung in xlsx?

    Hallo VB-Paradise-Gemeinde,

    ich habe mir einen Wolf gegooglet und keine richtige Lösung oder einen Ideenansatz gefunden. Im Prinzip bekomme ich die Problemstellung nur zur Hälfte geregelt.

    Ich übergebe meine abgefragten Daten über das DataSet bzw. DataTable in eine XML Datei. Dies funktioniert einwandfrei, auch wenn die Dateien teilweise sehr groß werden :whistling: . Aber jetzt komme ich nicht mehr weiter.

    Problemstellung/Aufgabenstellung:
    Aus dieser XML Datei, die nun lokal liegt, soll per Code eine XLSX Datei erstellt werden, ohne dass sie in Excel eingelesen werden muss. Ist das ohne große Zusatzpakte möglich?

    Vielen Dank für Eure Mithilfe :thumbup:

    Gruß vom Doc

    DrZwockel schrieb:

    per Code eine XLSX Datei erstellt werden, ohne dass sie in Excel eingelesen werden muss. Ist das ohne große Zusatzpakte möglich?
    Ohne Zusatzpaket wie Office.Interop oder epplus wirst du keine XLSX erzeugen können.
    Was geht, ist eine CSV.
    Die kannst du auch per Doppelklick mit Excel öffnen.

    Du kannst wahrscheinlich auch die XML-Datei in Excel öffnen.
    Aber es bleibt eine XML.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo,

    also Office.Interop würde noch gehen ...

    Was mich am XML stört, ist die extreme Dateigröße. Wie sieht es denn mit CSV aus, sind die Dateien da auch so groß?
    Wie macht man aus dem DataSet eine CSV?

    Gruß vom Doc
    CSV steht für comma separated values. Daher musst Du Dich natürlich selber drum kümmern, was welcher Wert bedeutet. Das wiederum ist der Vorteil bei XML. Es ist klar strukturiert und benannt, wenn man sich die Datei anschaut. XLSX wirst Du hingegen menschlich kaum auslesen können. Und ob es viel kleiner als die entsprechende XML ist, muss sich zeigen. Allerdings ist die Frage, wie Du Dir den Inhalt einer XML-Datei in Excel vorstellen würdest. XML ist eine Baumstruktur, Excel bekanntlich im Tabellenformat.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    Eine CSV Datei ist wesentlich kleiner, weil die ganzen XML-Tags wegfallen.
    Es kommt einfach auf den Anwendungszweck und die Menge der Daten an, sowie, wie und wohin die Datei übertragen werden soll.
    CSV wäre die einfacherer Lösung, lässt sich aber nicht per Dataset.WriteCSV() erzeugen. Gibt es dafür einen Converter? XML2CSV?
    Da musst Du Dir den Konverter selbst schreiben. Es gibt aber, wenn Dur richtig suchst, auch Beispiel im Netz.
    Suchbegriffe: [Export/Convert/Save] Dataset to CSV

    Wenn Du den ganzen Krampf rein wegen der Dateigröße der XML Datei machst, dann bau doch einfach einen Zipper drum.
    Musst Du Deine CSV-Dateien auch wieder einlesen? Wenn ja, dann bleib bei XML (komprimiert!) oder geh auf eine Datenbank.
    Den ganzen Spaß des Datenimports möchtest Du nicht haben, Tabellen müssen entsprechend der Abhängikeiten in der richtigen Reihenfolge eingelesen werden, Das Einlesen dauert sehr viel länger als das einfache Laden einer XML-Datei.
    Hallo,

    vielen Dank an alle, die hier ihre Hilfe angeboten haben. Ich habe den Hinweis von petaod aufgegriffen und den CSVHelper ausprobiert. Der Datenexport geht sehr schnell und mit ein paar Codezeilen ist die CSV Datei erstellt.

    Als Ergebnis kann man auf jeden Fall festhalten, dass der Datenexport von ca. 320.000 Datensätze in XML mit 780 Mbyte ein Unterschied zum CSV Export mit leidglich 150 Mbyte darstellt, womit sich zunächst einmal leben lässt.

    Dennoch wäre jetzt eine "Wandlung" in xlsx optimal ...


    Gruß vom Doc

    DrZwockel schrieb:


    Dennoch wäre jetzt eine "Wandlung" in xlsx optimal ...

    Hast Du die Information von @OliverSte gelesen? Eigentlcih dachte ich es wäre klar. Kannst auch leicht testen, einfach eine XLSX Datei als ZIP umbenennen und reingucken.

    Ansonsten wie mein Tip oben, nur den Suchbegriff leicht ändern und Du bekommst z.B. dieses Ergebnis: codeproject.com/Reference/7532…-using-Csharp-Excel-Inter

    Ist im Grunde jetzt auch nichts anderes als eine CSV zu erstellen, die Vorgehensweise ist identisch.

    OliverSte schrieb:

    dass xlsx nur deshalb so klein ist, weil es ZIP komprimiert ist?
    Auch.
    Das ist allerdings nur ein Nebeneffekt, weil die internen Objekte in eine ZIP-Ordnerstruktur gepresst werden.
    Auf den Kompressionsfaktor wird da nicht viel wert gelegt.

    Die echte Komprimierung wird erst aktiv, wenn du es als XLSB speicherst.
    Da werden die Worksheets (anstatt als gesprächige XML abzuspeichern) erst komprimiert, bevor sie in der ZIP-Struktur untergebracht werden.
    Das bringt bei großen Worksheets bis zu Faktor 10 zusätzlich.

    Beide Formate können übrigens durch Zippen nochmals verkleinert werden.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo,

    mir ist klar, dass die XLSX intern komprimiert sind und auch mit einem Zipper geöffnet werden können, um sich die interne Struktur anzusehen ... musste man ja auch immer, um das Ribbon unter "VBA" manipulieren zu können ^^ .

    Mir ging es bei meiner Problemstellung darum, aus einem DataTable oder DataSet direkt "on the fly" ein xlsx zu erstellen, ohne kostspielige Zusatz-DLL.

    Mir ist nicht ganz klar, wie das funktioniert, vielleicht fehlt mir hier der "Horizont" ... habe bis vor kurzem nur ausschließlich VBA gemacht :huh: .

    Trotzdem vielen Dank für Eure Hilfe ...

    Gruß vom Doc
    @'petaod'
    Bei dem 10-Zeiler fehlt noch der umschließende Code, um alle Tabellen des DataSets in mehrere CSV zu speichern ;)
    CSV kann ja nur eine Tabelle, XML Relationen.

    @DrZwockel

    Wir versuchen immer noch aus dir herauszulocken, warum es ein xlsx sein muss ;)


    Dksksm schrieb:

    Ansonsten wie mein Tip oben, nur den Suchbegriff leicht ändern und Du bekommst z.B. dieses Ergebnis: codeproject.com/Reference/7532…-using-Csharp-Excel-Inter


    Hallo Dksksm,

    vielen Dank für den Tipp bzw. den Link.

    In meiner Anwendung habe ich bereits einen XLS Export direkt in Excel hinein. Bei der Anwendung handelt es sich um ein AddIn für Excel (dll). Hier ist nach der Erstellung einer SQL-Abfrage ein Export in ein DataGrid (UserForm) bzw. ein Direktexport in ein Tabellenblatt des geöffneten Excels möglich. Das Funktioniert auch total super, nur sehr lang, da die Datensätze Zeile für Zeile "im Hintergrund" eingetragen werden. Da es gerade bei größeren Datenmengen recht lange dauert, suche ich eine schnellere Alternative ...

    Gruß vom Doc

    Irgendwie kann ich hier nicht mehr Antworten ... ????

    Deshalb mal so:

    OliverSte schrieb:

    @DrZwockel
    Wir versuchen immer noch aus dir herauszulocken, warum es ein xlsx sein muss


    Hallo OliverSte,

    vielen Dank für Deine Nachfrage.
    Da die Kollegen, die mit den Ergebnissen arbeiten müssen, mit Excel arbeiten und sich leider schwer damit tun, eine "Fremddatei" zu Importieren. Also der Datenimport von CSV, XML oder ähnl. wird gerne boykottiert .

    Also ist meine Vorgabe, direkt "Excel" zu bedienen oder eine "Exceldatei" zu erschaffen.

    Gruß vom Doc

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „DrZwockel“ ()

    DrZwockel schrieb:

    Hallo OliverSte,

    vielen Dank für Deine Nachfrage.
    Da die Kollegen, die mit den Ergebnissen arbeiten müssen, mit Excel arbeiten und sich leider schwer damit tun, eine "Fremddatei" zu Importieren. Also der Datenimport von CSV, XML oder ähnl. wird gerne boykottiert .

    Also ist meine Vorgabe, direkt "Excel" zu bedienen oder eine "Exceldatei" zu erschaffen.

    Gruß vom Doc




    Ich habe nicht die notwendigen Rechte zu Antworten ... zeigt mir immer eine Fehlermeldung an: Ich bin verwirrt !!!!

    Deshalb so ...

    petaod schrieb:

    Du kannst mit Nuget auch epplus einbinden.
    Da gibt's schöne Methoden auch XLSX zu schreiben.
    stackoverflow.com/questions/13…able-to-excel-with-epplus
    Gleich der erste Vierzeiler sollte deinen Ansprüchen genügen.


    Hallo pataod,

    ich habe mir über Nuget EPPlus geladen ... habe aber jetzt schon die Schwierigkeit, dass ich das als Verweis eingebunden habe (über Projektexplorer), aber nicht mittels

    VB.NET-Quellcode

    1. Imports EPPlus


    einbinden kann ...

    Ich habe mir dann mal den Codeschnippel bei Codeplex angesehen und ihn mal mittels Konverter von C# in VB.NET gebracht

    VB.NET-Quellcode

    1. Imports (ExcelPackage pck = New ExcelPackage(NewFile))
    2. {
    3. Dim ws As ExcelWorksheet = pck.Workbook.Worksheets.Add("Accounts")
    4. ws.Cells("A1").LoadFromDataTable(dataTable, True)
    5. pck.Save()
    6. }


    Auch hier werde ich nicht schlauer ... hast Du einen Tipp? Habe ich da was falsch gemacht?

    Gruß vom Doc

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „DrZwockel“ ()

    VB.NET-Quellcode

    1. Imports OfficeOpenXml


    DrZwockel schrieb:

    mittels Konverter von C# in VB.NET
    Welchen Konverter verwendest du?
    Der erzeugt Schrott.

    Visual Basic-Quellcode

    1. Using pck As New ExcelPackage(newFile)
    2. Dim ws As ExcelWorksheet = pck.Workbook.Worksheets.Add("Accounts")
    3. ws.Cells("A1").LoadFromDataTable(dataTable, True)
    4. pck.Save()
    5. End Using
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo petaod,

    vielen Dank für die Info. Der Converter ist online
    dotnetspider.com/convert/CSharp-To-Vb.aspx

    Ich wundere mich auch schon die ganze Zeit, was der da produziert ... welchen nutzt Du?

    Jetzt eine Frage: Wohin produziert er die Tabelle?

    Ich habe eine Codestelle gefunden, da weiß ich allerdings nicht, ob er das wieder gut übersetzt hat:

    VB.NET-Quellcode

    1. Public Sub ExportListUsingEPPlus()
    2. Dim excel As ExcelPackage = New ExcelPackage()
    3. Dim workSheet As var = excel.Workbook.Worksheets.Add("Sheet1")
    4. workSheet.Cells(1, 1).LoadFromCollection(data, True)
    5. Imports (var memoryStream = New MemoryStream())
    6. {
    7. Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
    8. Response.AddHeader("content-disposition", "attachment; filename=Contact.xlsx")
    9. excel.SaveAs(memoryStream)
    10. memoryStream.WriteTo(Response.OutputStream)
    11. Response.Flush()
    12. Response.End()
    13. }
    14. End Sub


    Hast Du einen Tipp ...?

    Gruß vom Doc

    DrZwockel schrieb:

    Wohin produziert er die Tabelle?

    petaod schrieb:

    Using pck As New ExcelPackage(NewFile)
    Nach ​NewFile.
    Gib dort einen Pfad zu deiner neuen Datei an.

    Wieso versuchst du nicht, mein Snippet zum Laufen zu bringen?
    Gefällt dir der Fünfzeiler nicht?
    Was du da noch ausgegraben hast, ist für eine Web-Anwendung.

    DrZwockel schrieb:

    Hast Du einen Tipp ...?
    Nimm zum Konvertieren den Telerik-Konverter.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    petaod schrieb:

    Wieso versuchst du nicht, mein Snippet zum Laufen zu bringen?
    Gefällt dir der Fünfzeiler nicht?


    Hallo Petaod,

    vielen Dank für Deine Hilfe. Ich habe Deinen "Fünfzeiler" mittlerweile in Gebrauch und nutze EPPLUS. Ich habe mich am Wochenende mal in Ruhe auf der Seite von EPPLUS umgesehen und zu diesem Thema gegooglet.

    Jetzt läuft alles sehr schnell und einwandfrei und das Beste, genauso, wie ich es wollte. Mir war nicht klar, dass EPPLUS das auch macht, wenn Excel geöffnet ist; aber macht das ohne Probleme "daran vorbei".

    Vor allem kann man damit ja die Exceldatei super aufbauen und auch schon formatieren und, falls erforderlich mit Formeln versehen :thumbsup: .

    Vielen Dank für Deine Geduld und den super Tipp ... :thumbup: . ( ... und natürlich auch bei allen Anderen ... ^^ ).


    Gruß vom Doc

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „DrZwockel“ ()