Txt / Excel Spalten in Zeilen konvertieren

  • Hallo zusammen


    mir macht gerade ein Problem ziemlich zu schaffen und ich dachte evtl. kann ich da was mit AutoIT machen.


    Ich habe eine Excel Liste mit ca. 1100 Adressen. Die sind alle in dem Format wie in der angehängten XLS Datei sichtbar.

    Nun stehen die alle in einer Spalte, für einen Serienbrief benötige ich die aber pro Adresse in einer Zeile.


    Kann ich da was mit AutoIT machen ? Mir fehlt gerade der Anfangspunkt.

    Könnte ich z.B. die XLS als TXT abspeichern und dann mit AutoIT auslesen und dann wieder in eine Datei schreiben, nur diesmal jede Adresse mit Komma getrennt und in einer eigenen Zeile ?


    Hab da momentan null Plan. Kann mir da jemand helfen ?

    Herzlichen Dank


    Markus Ewald

  • Wäre es nicht das beste alles in ein Array einzulesen ?

    Das habe ich jetzt mal gemacht.


    Nun möchte ich einfach aus dem Array alle Leerzeilen löschen, zudem noch alle Zeilen mit Telefonnummer.

    Dann müsste ich doch immer 4 Zeilen in einer 1 Zeile per Komma getrennt schreiben können oder nicht ?

    Bin ich da auf dem Holzweg ?

  • Halo jmewald,

    ich habe mal aus der Hilfe ein paar Beispiele zusammenkopiert:

    Spoiler anzeigen
    [autoit]

    #include <Excel.au3>
    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Local $sFilePath1 = @ScriptDir & "\Test1.xls" ; Diese Datei sollte bereits existieren
    Local $iRows = 9999 ; hier letzte Zeilennummer eingeben
    Local $file = FileOpen(@ScriptDir & "\test.txt", 2)

    [/autoit] [autoit][/autoit] [autoit]

    $oExcel = _ExcelBookOpen($sFilePath1)

    [/autoit] [autoit][/autoit] [autoit]

    If @error = 1 Then
    MsgBox(0, "Fehler!", "Das Excel-Objekt konnte nicht erstellt werden")
    Exit
    ElseIf @error = 2 Then
    MsgBox(0, "Fehler!", "Die Datei existiert nicht!")
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $aArray1 = _ExcelReadArray($oExcel, 1, 1, $iRows, 1) ; Senkrecht (vertikal)
    _ArrayDisplay($aArray1, "Senkrecht")

    [/autoit] [autoit][/autoit] [autoit]

    ;hier kannst du dann mit for .. next das Array auslesen und in eine CSV etc speichern
    for $i = 1 to UBound($aArray1) step 7
    $sLine = $aArray1[1] & ";" & $aArray1[2] & ";" $aArray1[3] & ";" $aArray1[4] & ";" & $aArray1[5] & ";" & $aArray1[6] & ";" &$aArray1[7]
    FileWriteLine($file,$sLine)
    next

    MsgBox(0, "Beenden...", "Drücke OK, um die Datei zu speichern und Excel zu beenden.")
    _ExcelBookSaveAs($oExcel, @ScriptDir & "\NEU.xls", "xls", 0, 1) ; Nun wird die Datei unter neuem Namem gespeichert.
    ;Achtung>: Falls notwendig werden existierende Dateien überschrieben.
    _ExcelBookClose($oExcel) ; Und zum Schluss schließen wir die Datei.

    [/autoit]

    Ich habe aber aauf dem NetBook kein Excel (sondern OpenOffice). Das heisst du musst es testen und evtl. an deine Bedürfnisse anpassen,

    mfg (Auto)Bert

    • Offizieller Beitrag

    Ich habe mal ein Script geschrieben, was das macht, was Du haben willst:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    #include <Excel.au3>
    Opt('WinTitleMatchMode', 2)
    $oExcel = _ExcelBookOpen(@ScriptDir & '\Adressen.xls')
    $aData = _ExcelReadSheetToArray($oExcel)
    ;~ _ArrayDisplay($aData)
    $hFile = FileOpen(@ScriptDir & '\Adressen.txt', 2)
    If $hFile = -1 Then Exit
    For $row = 1 To $aData[0][0] - 7 Step 7
    $sData = ''
    For $i = 0 To 3
    $sData &= $aData[$row + $i][1] & ', '
    Next
    FileWriteLine($hFile, StringTrimRight($sData, 2))
    Next
    FileClose($hFile)
    _ExcelBookClose($oExcel)
    WinClose('Microsoft Excel')

    [/autoit]
  • Hallo Oscar, AutoBert


    dickes dickes Danke. Das Forum hier ist mit Abstand das Beste was ich im Internet finde.


    Vielen herzlichen Dank.


    Mfg

    Markus

  • Hallo Oscar,
    habe zwar kein Excel, aber eine Frage zu deinem Script. Gibt es einen speziellen Grund (ggf. Importformat für csv?) warum du bei

    [autoit]

    $sData &= $aData[$row + $i][1] & ', '

    [/autoit]

    hinter dem Komma ein Leerzeichen einfügst?

  • Hallo Oscar, Bert und Markus
    das Programm von Oscar ist völlig ok und löst die Aufgabe ordentlich.

    Mich hatte aber weniger die Lösung interessiert, sondern vor Allem die Ein- / Ausgabe von Daten in Excel. Mir ging es um den Lerneffekt und eine Musterlösung für spätere eigene Anwendungen. Vielleicht ist eine derartige Musterlösung auch für Andere interessant.

    In Oscars Lösung werden die Daten aus dem 1. Tabellenblatt der Excel-Datei in ein Array ausgelesen und anschliessend in eine csv-Datei geschrieben, die mit Excel problemlos geladen werden kann.

    Man kann die Daten aber auch direkt in Excel schreiben. Dazu wird ein neues Tabellenblatt erzeugt und hinter das Datenblatt verschoben. Dann werden die Daten direkt in dieses neue Tabellenblatt geschrieben. Nach 4 s wird Excel wieder geschlossen.

    Spoiler anzeigen
    [autoit]


    ; Muster für die Steuerung von Excel durch AutoIt
    ; aus http://www.autoit.de/index.php?page=Thread&threadID=17607

    [/autoit] [autoit][/autoit] [autoit]

    Opt("MustDeclareVars", 1)
    #include <Array.au3>
    #include <Excel.au3>
    Opt('WinTitleMatchMode', 2)

    [/autoit] [autoit][/autoit] [autoit]

    Global $oExcel, $s1ExcSheet, $s2ExcSheet
    Global $hFile, $row, $ii, $kk, $nn, $sData
    Global $nRow = 7, $nCol = 5, $a1Data, $a2Data[$nCol]

    [/autoit] [autoit][/autoit] [autoit]

    ; Excel-Tabellenblatt öffnen und Daten Auslesen
    $oExcel = _ExcelBookOpen(@ScriptDir & "\Adressen.xls" )
    $s1ExcSheet = _ExcelSheetNameGet( $oExcel )
    $a1Data = _ExcelReadSheetToArray( $oExcel )

    [/autoit] [autoit][/autoit] [autoit]

    ; _ArrayDisplay($a1Data)
    ; Daten in eine csv-Datei Ausgeben
    $hFile = FileOpen(@ScriptDir & '\Adressen.csv', 2)
    If $hFile = -1 Then Exit 1

    [/autoit] [autoit][/autoit] [autoit]

    For $row = 1 To $a1Data[0][0] - $nRow Step $nRow
    $sData = ""
    For $ii = 0 To $nCol - 1
    $sData &= StringStripWS($a1Data[$row + $ii][1], 3 ) & ";"
    Next
    ; Das ";" hinter dem letzten Feld wird abgeschnitten
    FileWriteLine($hFile, StringTrimRight($sData, 1))
    Next
    FileClose($hFile)

    [/autoit] [autoit][/autoit] [autoit]

    ; zum 2. Tabellenblatt wechseln
    ; _ExcelSheetActivate($oExcel, 2)
    ; oder eine neue Tabelle hinzufügen und hinter die Tabelle mit den Daten verschieben
    _ExcelSheetAddNew($oExcel, "" )
    $s2ExcSheet = _ExcelSheetNameGet( $oExcel )
    _ExcelSheetMove( $oExcel, $s2ExcSheet, $s1ExcSheet, False )
    IF @error <> 0 Then Exit 2

    [/autoit] [autoit][/autoit] [autoit]

    $nn = Floor( $a1Data[0][0] / 7 )

    [/autoit] [autoit][/autoit] [autoit]

    $kk = 0
    For $row = 1 To $a1Data[0][0] - $nRow Step $nRow
    For $ii = 0 To $nCol - 1
    $a2Data[$ii] = StringStripWS($a1Data[$row + $ii][1], 3 )
    IF $ii = $nCol - 1 Then
    $kk += 1
    ; _ArrayDisplay($a2Data)
    _ExcelWriteArray($oExcel, $kk, 1, $a2Data, 0 ) ; Zeilen in Excel schreiben
    Endif
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Sleep(4000)
    _ExcelBookClose($oExcel)
    WinClose('Microsoft Excel')

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    Viele Grüsse
    Detlef