in eine .xls schreieben



  • Hallöchen ich hab ein Problem beim füllen einer .xls
    Ich fülle sie immoment so, das klappt auch ohne weiteres erstmal

    System.IO.StreamWriter sw = new System.IO.StreamWriter(strFile, true);
    sw.Write(SaveTmpFileOk);
    sw.Close();
    

    Mein Problem ist jetzt wenn ich die .xls öffnen will bekomme ich mit Excel 2003 und 2007 eine Fehlermeldung, das evtl die Datei beschädigt ist und ob sie aus einer vertrauenswürdigen Quelle stammt.

    MFG george310



  • Ohne den Inhalt und die Struktur der SaveTmpFileOk zu kennen wird eine Antwort fast unmöglich sein ...



  • Ich bau mir in der SaveTmpFileOk meinen String zusammen, den ich mit der oben genannten Methode in eine .xls schreibe.

    Values value = Values.getInstance();
    string SaveTmpFileOk = "\r\n" + value.id + "\t" + value.name + "\t" + value.prozentwert + "\t" + value.prozentsatz + "\t" + value.erg;
    

    Der Fehler taucht auf wenn ich die .xls öffnen will, wenn diese aber mit ja bestätige kann ich trotzdem die .xls öffnen

    Ich kann leider kein Screenshot von der Fehler Meldung machen, weil ich den auf meinen PC nicht reproduzieren kann.



  • Du erzeugst doch (inhaltlich) gar keine Excel-XLS-Datei, sondern eine einfache tabulator-getrennte Text-Datei.
    Du solltest also entweder eine XML-Datei erzeugen (dann aber mittels der XML-Klassen) oder aber eine CSV (comma separated values) - Datei (wobei der Trenner dabei dann standardmäßig ein Semikolon (;) ist).

    Alos ändere einfach mal die Dateienedung auf ".csv" ab, tausche das Trennzeichen aus und lasse die Datei dann von Excel öffnen.



  • Auch XML und CSV sind keine "echten" Exel Dateien, sie lassen sich nur mit Excel öffnen. Wenn Du echte Excel Dateien speicher / bearbeiten willst, dann musst Du die API von Excel verwenden.



  • Hallo ich habe es jetzt mit der Excelklasse gelöst bekommen.

    using Excel = Microsoft.Office.Interop.Excel;
    using System.Reflection;
    
    private void createXlsFile()
            {
                Excel.Application oXL;
                Excel._Workbook oWB;
                Excel._Worksheet oSheet;
                Excel.Range oRng;
    
                try
                {
                    //Startet Excel und erzeugt ein Excel Objekt
                    oXL = new Excel.Application();
                    oXL.Visible = false;
    
                    //Erstellt eine neue Arbeitsmappe und ein Excelsheet
                    oWB = (Excel._Workbook)(oXL.Workbooks.Add(Missing.Value));
                    oSheet = (Excel._Worksheet)oWB.ActiveSheet;
    
                    //Erzeugt die "Überschrift" Zelle für Zelle
                    oSheet.Cells[1, 1] = "Id";
                    oSheet.Cells[1, 2] = "Name";
                    oSheet.Cells[1, 3] = "Datum";
                    oSheet.Cells[1, 4] = "Betrag EUR";
                    oSheet.Cells[1, 5] = "Prozentwert";
                    oSheet.Cells[1, 6] = "Prozentsatz";
                    oSheet.Cells[1, 7] = "Darlehen";
    
                    //Formatiert A1:D1 Fett und Vertikal in der Mitte
                    oSheet.get_Range("A1", "G1").Font.Bold = true;
                    oSheet.get_Range("A1", "G1").VerticalAlignment = Excel.XlVAlign.xlVAlignCenter;
    
                    //Füllt die Spalten A:G
                    oSheet.Cells[3, 1] = "Test ID";
                    oSheet.Cells[3, 2] = "Test Name";
                    oSheet.Cells[3, 3] = "Test Datum";
                    oSheet.Cells[3, 4] = "Test Betrag EUR";
                    oSheet.Cells[3, 5] = "Test Prozentwert";
                    oSheet.Cells[3, 6] = "Test Prozntsatz";
                    oSheet.Cells[3, 7] = "Test Darlehen";
                    ...
    

    ich übergebe dann das Workbookobjekt oWB an meine SaveToFile Methode.
    Aber wenn ich jetzt kein Excel installiert habe, stürzt das Prog doch ob an der Stelle wo diese Methode aufgerufen wird. Habt ihr noch verbesserungsvorschläge für mich 🙂 würde mich freuen über jeden Tip.



  • george310 schrieb:

    Aber wenn ich jetzt kein Excel installiert habe, stürzt das Prog doch ob an der Stelle wo diese Methode aufgerufen wird. Habt ihr noch verbesserungsvorschläge für mich 🙂 würde mich freuen über jeden Tip.

    Mein Verbesserungsvorschlag: Verzichte auf die Excel-Klasse - das damit verbundene Problem kennst du ja bereits.

    Für die Lösung gibt es nur zwei Möglichkeiten:

    1. Schreib und lies die Dateien im Microsoft Office Binary (doc, xls, ppt) File Formats. Microsoft hat dieses Format vor Kurzem offengelegt. Details: http://www.microsoft.com/interop/docs/OfficeBinaryFormats.mspx

    2. Setze auf den Ecma-Standard Office Open XML. Dieses Containerformat ist ausführlich dokumentiert (über 6.000 Seiten!) und wird m. E. die proprietären, alten Formate vollständig ablösen. Aber lies selbst: http://de.wikipedia.org/wiki/Office_Open_XML



  • Für die Lösung gibt es nur zwei Möglichkeiten:

    Als dritte Möglichkeit gäbe es noch das Überdenken der Anforderung. Es könnte durchaus reichen, eine CSV (*.csv) Datei zu erzeugen um den Anwender zufrieden zu stellen.

    //Formatiert A1:D1 Fett und Vertikal in der Mitte
    oSheet.get_Range("A1", "G1").Font.Bold = true;
    oSheet.get_Range("A1", "G1").VerticalAlignment = Excel.XlVAlign.xlVAlignCenter;

    Sollten Formatierungen zwingend sein, könnte man zuvor noch nach einer Lib suchen, die das Implementieren der von schmidt-webdesign angesprochenen Wege übernimmt.

    [ot]
    @schmidt: Die Seite schaut nett aus, die URL weniger. Ein Impressum wäre auch ein großes plus.
    [/ot]



  • Eine bestehende Excel-Datei kann man glaube ich auch über ADO.NET lesen und beschreiben (allerdings glaube ich keine Spalten anlegen/löschen etc.), der Excel-Treiber scheint bei Windows auch ohne Excel-Installation vorhanden zu sein.

    Ansonsten gibt es auch ein paar OpenSource-Libs, die das neue Office 2007 Excel-Format (*.xlsx) lesen und schreiben können...



  • Knuddlbaer schrieb:

    [[ot]
    @schmidt: Die Seite schaut nett aus, die URL weniger. Ein Impressum wäre auch ein großes plus.
    [/ot]

    Danke schön für das "die Seite schaut nett aus", das hört wohl jeder gern 🙂 Was gefällt dir denn an der URL nicht? Das große plus für ein Impressum findest du übrigens auf allen Seiten ganz unten rechts und das Farbschema kannst du dir (ebenfalls auf allen) oben links anpassen.

    Deiner dritten Möglichkeit (Überdenken der Anforderung) stimme ich zu, ein Blick auf das Grid-Control dürfte diese Überdenk-Entscheidung noch erleichtern/beschleunigen.


Anmelden zum Antworten