Excel Datei auf TXT Konvertieren

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Excel Datei auf TXT Konvertieren

    Hi,

    ich würde gerne eine Excel Liste in eine TXT Datei mit C# umwandeln, gelesen wird das ganze aus dem ersten Sheet das "Daten" heißt.

    Ausgelesen werden soll alles ab Zeile 8 und von Spalte A bis J, das ganze soll solange weitergehen bis eine Zeile der Spalt A keinen Wert hat, ich denke eine Schleife hilft hier am besten allerdings weis ich noch nicht ganz wie ich die einzelnen Zeilen am besten auslese und in ein Array einfüge.

    Der Abbruch des einlesen kann auch durch ein spezialles Wort ausgeführt werden das in der A Spalte hinterlegt wird.

    Die Zeilen für die TXT sollen natürlich aus diesem Array gelesen werden und entsprechend mit einem ; separiert werden.

    Danke für euere Tipps.
    @aviefotografy Willkommen im Forum. :thumbup:
    Wenn ich Dich Recht verstehe, sollen wir Deine Hausaufgaben machen. :thumbdown:
    Falls ich Dich nicht richtig verstanden haben sollte, lass uns an Deinen bisherigen Misserfolgen Teilhaben.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    aviefotografy schrieb:

    Die Zeilen für die TXT sollen natürlich aus diesem Array gelesen werden und entsprechend mit einem ; separiert werden.
    Wie öffnest du die Excel-Datei?
    Über Microsoft.Office.Interop?

    Ansatz:

    Visual Basic-Quellcode

    1. Daten.Copy;
    2. NewWorksheet.Range("1:7").Delete(xlup);
    3. NewWorksheet.Parent.SaveAs (Filename:="c:\bla.csv", FileFormat:=xlCSV);
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Bisher stehe ich hier, es liest die Liste aus aber ich kann die einzelnen Zellen nicht separieren zudem sind zu viele Leerzeilen darin enthalten.


    Try
    Dim fs As FileStream
    Dim sw As StreamWriter
    Dim Filename As String
    Filename = (lblChoosePath.Text & "\Text.txt")

    Dim excel As Application = New Application

    Dim w As Workbook = excel.Workbooks.Open(lblChooseFile.Text)

    For i As Integer = 1 To w.Sheets.Count

    Dim sheet As Worksheet = w.Sheets(i)

    Dim r As Range = sheet.UsedRange

    Dim array(,) As Object = r.Value(XlRangeValueDataType.xlRangeValueDefault)

    If array IsNot Nothing Then
    Console.Write("Length: {0}", array.Length)

    Dim bound0 As Integer = array.GetUpperBound(0)
    Dim bound1 As Integer = array.GetUpperBound(1)

    Console.Write("Dimension 0: {0}", bound0)
    Console.Write("Dimension 1: {0}", bound1)
    fs = New FileStream(Filename, FileMode.Create)
    sw = New StreamWriter(fs)
    For j As Integer = 1 To bound0
    For x As Integer = 1 To bound1
    Dim s1 As String = array(j, x)
    Console.Write(s1)
    sw.WriteLine(s1)
    Console.Write(" "c)

    Next

    Console.WriteLine()

    Next
    sw.Close()
    End If
    Next

    w.Close()

    MessageBox.Show("Daten wurden in die Datei Konvertiert")

    Catch ex As Exception
    MessageBox.Show(ex.Message, My.Resources.sErrorTitle, MessageBoxButtons.OK, MessageBoxIcon.Error)
    End Try

    Grüße
    Andi

    aviefotografy schrieb:

    Bisher stehe ich hier
    OK.
    Editiere mal Deinen Post, markiere den Quellcode und drück auf den VB.NET-Button:
    Um Deinen Effekt nachvollziehen zu können, wäre es gut, wenn Du das ganze Projekt anhängst, zunächst Erstellen -> Bereinigen, dann als ZIP packen und Erweiterte Antwort -> Dateianhänge -> Hochladen.
    Pack die betreffenden Dateien (XLS, TXT oder Teile davon) mit in die ZIP.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich bin etwas weiter gekommen jetzt ist nur noch die frage wie ich weitere Zeilen einbinde

    VB.NET-Quellcode

    1. Dim fs As FileStream
    2. Dim sw As StreamWriter
    3. Dim sFilename As String
    4. sFilename = (lblChoosePath.Text & "\Text.txt")
    5. Dim Excel As Application = New Application
    6. Dim wb As Workbook = Excel.Workbooks.Open(lblChooseFile.Text)
    7. Dim rRange As Range
    8. rRange = (wb.Sheets("Kasse").Range("A9:J9"))
    9. Dim array(,) As Object = rRange.Value
    10. If array IsNot Nothing Then
    11. fs = New FileStream(sFilename, FileMode.Create)
    12. sw = New StreamWriter(fs)
    13. Dim iBound0 As Integer = array.GetUpperBound(0)
    14. Dim iBound1 As Integer = array.GetUpperBound(1)
    15. For j As Integer = 1 To iBound0
    16. For x As Integer = 1 To iBound1
    17. Dim s1 As String = array(j, x)
    18. sw.Write(s1 & ";")
    19. Next
    20. Next
    21. wb.Close()
    22. sw.Close()
    23. Excel = Nothing

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

    aviefotografy schrieb:

    Ich bin etwas weiter gekommen
    Fein.
    Verwende bitte den VB.NET-Code-Tag, siehe Post #6.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    aviefotografy schrieb:

    wie ich weitere Zeilen einbinde
    Welche Zellen wo einbinden?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das er dannach fortfährt mit der lesen Zeile 10, 11, 12, usw und in einer leeren Zeile die Schleife verlässt sowie aufhört die XLS weiter auszulesen.

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

    aviefotografy schrieb:

    fortfährt mit der lesen Zeile 10, 11, 12, usw
    Da musst Du Deine Philosophie ändern, wo Du keine Ranges vorgibst, sondern Dich durch die Zeilen und Spalten durchiterierst.
    Such mal nach XLS auslesen oder so was, das gibt es im Forum hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke für die bisherigen Hilfen.

    Das Tool ist soweit fertif allerdings trete,
    ich in dieser Schleife momentan auf der Stelle.
    Durch ein hinterlegte Keyword kann ich die Schleife zwar verlassen,
    aber er springt mir dann automatisch weiter auf dem StreamWriter darunter und wirft logischerweise einen Fehler,
    da Excel und Konmsorten ja schon geschlossen sind.

    Das Else mag er aber leider nicht diese wird mir sofort unterstrichen und es heißt das End If fehlt obwohl es da ist.
    Habt Ihr einen Tipp?

    Visual Basic-Quellcode

    1. Dim fs As FileStream
    2. Dim sw As StreamWriter
    3. Dim sFilename As String = lblChooseFile.Text.Replace(".xls", ".txt")
    4. Dim Excel As Application = New Application
    5. Dim wb As Workbook = Excel.Workbooks.Open(lblChooseFile.Text)
    6. Dim rRange As Range
    7. rRange = (wb.Sheets("Kasse").Range("A9:J70"))
    8. Dim array(,) As Object = rRange.Value
    9. If array IsNot Nothing Then
    10. fs = New FileStream(sFilename, FileMode.Create)
    11. sw = New StreamWriter(fs)
    12. Dim iBound0 As Integer = array.GetUpperBound(0)
    13. Dim iBound1 As Integer = array.GetUpperBound(1)
    14. For j As Integer = 1 To iBound0
    15. For x As Integer = 1 To iBound1
    16. Dim s1 As String = array(j, x)
    17. If s1 = "STOP" Then
    18. wb.Close()
    19. sw.Close()
    20. fs.Close()
    21. Excel = Nothing
    22. End If
    23. sw.Write(s1 & ";")
    24. Next
    25. sw.Write(";;" & vbNewLine)
    26. Next
    27. wb.Close()
    28. sw.Close()
    29. fs.Close()
    30. Excel = Nothing
    31. End If


    Danke Andi
    Du willst aus einer strukturierten Umgebung ausbrechen.
    In diesem Fall würde ich sogar ein unstrukturiertes Goto akzeptieren.

    VB.NET-Quellcode

    1. If array IsNot Nothing Then
    2. fs = New FileStream(sFilename, FileMode.Create)
    3. sw = New StreamWriter(fs)
    4. For j As Integer = 1 To iBound0
    5. For x As Integer = 1 To iBound1
    6. Dim s1 As String = array(j, x)
    7. If s1 = "STOP" Then Goto Done
    8. sw.Write(s1 & ";")
    9. Next
    10. sw.Write(";;" & vbNewLine)
    11. Next
    12. Done:
    13. End If

    Alle anderen strukturierten oder pseudostrukturierten Elemente sind höherer Aufwand und auch nicht leichter lesbar.
    Denkbar wären "Boolean als Ausstiegsvariable", "zwei verschiedenartige Schleifen und Exit For", "Raise Error und Try/Catch".
    Das sind (von der Ausstiegsvariablen mal abgesehen) alles aufwendige Hilfskonstruktionen, die am Ende einen Haufen Ressourcen verschwenden, um am Ende dann doch ein GoTo zu produzieren.



    Aber dein Excel kannst du schon viel früher beenden, nämlich sobald du die Daten im Array hast.
    Also erst der Code-Block

    VB.NET-Quellcode

    1. Dim array(,) As Object = rRange.Value
    2. wb.Close()
    3. Excel=Nothing
    und danach erst die Verarbeitung des Arrays beginnen.


    Noch was:
    For j As Integer = 1 To iBound0
    For x As Integer = 1 To iBound1
    Falls das übergebene Array nullbasiert ist verlierst du die erste Zeile und Spalte.
    Das solltest du überprüfen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „petaod“ ()

    aviefotografy schrieb:

    Ich dachte mit GoTo soll man nicht arbeiten?
    Jou. Mach 2 Prozeduren draus, da kannst Du mit Return raus.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!