1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Moombas

Beiträge von Moombas

  • Bildschirmbereich.....

    • Moombas
    • 11. Juli 2023 um 08:27

    Kannst du nicht ggf. direkt auf das anzeigende Programm zugreifen per Autoit (Autoit3.exe bzw. Autoit3_x64.exe nutzen um ggf. die ID's etc. zu bekommen) und dann die Werte direkt bewerten?

    Alternativ würde mir noch das per Screenshots zu machen, das stelle ich mir aber vom Aufwand als eher unpraktikabel vor, da kennen sich hier aber andere besser mit aus.

  • grundsätzliche Fragen zu Browser

    • Moombas
    • 11. Juli 2023 um 08:14

    Foilgendes ist ungeprüft:

    Variante 1 (einfügen vor dem Adlibregister und start() danach entfernen):

    AutoIt
    start()
    While 1
        sleep(1000); prüfen 1mal je Sekunde sollte reichen, sonst reduzieren
        If (StringSplit(_NowTime(), ':')[2] = '28') or _ ; prüfen ob 28 oder 58 min. erreicht wurden (einmalig)
           (StringSplit(_NowTime(), ':')[2] = '58') Then ;danach wäre Adlibregister mit alle 30minuten autom. immer auf 28/58 min.
            Uhr_ansagen();führe Uhr_ansagen aus 
            ExitLoop
        EndIf    
    WEnd

    Variante 2 (anstatt Adlib register und nach start() einfügen):

    AutoIt
    start()
    While 1
        sleep(1000); prüfen 1mal je Sekunde sollte reichen, sonst reduzieren
        If (StringSplit(_NowTime(), ':')[2] = '28') or _ ; prüfen ob 28 oder 58 min. erreicht wurden
           (StringSplit(_NowTime(), ':')[2] = '58') Then
            Uhr_ansagen()                                ;führe Uhr_ansagen aus 
            sleep(60000)                                 ;warte 1 Minute, damit es nicht versehentlich mehrfach ausgeführt wird
        ElseIf _NowTime() = $endtime Then ; ist now = endtime dann:
            Uhr_ansagen()                                ;endzeit erreicht führe Uhr_ansagen aus 
            HotKeybeenden()                              ;beende den webdriver + beendet das script.
        EndIf   
    WEnd
    Alles anzeigen
  • grundsätzliche Fragen zu Browser

    • Moombas
    • 10. Juli 2023 um 15:25

    Prüfe bitte ob die angegebene JSON.au3 ebenfalls in dem entsprechenden Ordner liegt.

    Diese wird von der wd_core.au3 benötigt., es könnten danach noch weitere folgen.

  • Microsoft Word: Suche und ersetze Text in den Inhalten der VBA-Progammierung (gelöst)

    • Moombas
    • 7. Juli 2023 um 09:30

    Hier mal die etwas korrigierte Version (mit deinen Test Dateien; ich habe die Anzeige des Word Dokuments mal auf False gesetzt (Zeile 50)):

    Ich gehe davon aus das der Dateiname (du suchst ja nach einem fixen Dateinamen) nur einmal zu finden ist (du speicherst mit einem festen Namen, der sich nicht auf Grund der gefundenen templates ändert), dann brauchst du die Schleife zum durchgehen der templates nicht, sondern kannst gleich auf den ersten Eintrag gehen.

    Zeile 13-18 musst du noch anpassen, ich habe es nur mal drinne gelassen (17&18) um zu Zeigen, was ich verwendet habe.

    AutoIt
    #include <File.au3>
    #include <FileConstants.au3>
    #include <MsgBoxConstants.au3>
    #include <StringConstants.au3>
    #include <Word.au3>
    #include <WordConstants.au3>
     ; https://autoit.de/thread/87817-microsoft-word-suche-und-ersetze-text-in-den-inhalten-der-vba-progammierung-gel%C3%B6/?postID=708429#post708429
    ;~ #DIESE ROUTINE WIRD ÜBER PARAMETER AUFGERUFEN
    
    Opt("MustDeclareVars", 1)
    #AutoIt3Wrapper_Au3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7
    
    ;~ If not $CmdLine[0] = 2 then
    ;~     MsgBox($MB_ICONERROR, 'Parameter', 'No or wrong amount of parameters provided.')
    ;~     Exit
    ;~ EndIf
    Global Const $sSearch_1  = 'SD - AAAA - DE - Händler' ;$CmdLine[1]
    Global Const $sSearch_2  = '12345678' ;$CmdLine[2]
    Global Const $file_s     = "f_search.txt"      ;~ File mit den Suchkriterien
    Global Const $file_r     = $sSearch_2 & ".txt" ;~ File mit den Replace-Strings
    Global Const $sExtension = ".docx" ; Verarbeite nur MS-Word Dokument ohne Macros.
    Global Const $sTemplates = _FileListToArrayRec(@ScriptDir, $sSearch_1 & $sExtension, $FLTAR_FILES, $FLTAR_RECUR, $FLTAR_SORT, $FLTAR_FULLPATH) ; Auflistung der rekursiv zu verarbeitenden MS-Word Dateien
    ;~ Global $iTotalProjectCount = 0, $iTotalComponentCount = 0, $iTotalReplacementCount = 0
    Global $aTags[1]
    
    If not IsArray($sTemplates) Then
        MsgBox($MB_ICONERROR, 'Error', 'Die Datei ' & $sSearch_1 & $sExtension & ' wurde nicht gefunden.')
        Exit
    EndIf
    
    _FileReadToArray($file_s, $aTags)
    _read_file($file_r, 1, $aTags)
    _Main($sTemplates[1], $aTags)
    
    ;Funktion zum Einlesen der Textfiles in Arrays
    Func _read_file($file_x, $col, ByRef $aArray)
    Local $aFile
        _ArrayColInsert($aTags, $col)
        _FileReadToArray($file_x, $aFile)
        For $iRow = 1 to $aFile[0]
            $aArray[$iRow][$col] = $aFile[$iRow]
        Next
    EndFunc
    
    Func _Main($sTemplate, $aArray)
    Local $oWordDoc, $sFileName
    Local $oWord = _Word_Create(False)
        If @error Then Return SetError(1, 0, MsgBox($MB_ICONERROR, '_Word_Open', '@error: ' & @error) * 0)
        If Not IsObj($oWord) Then Return SetError(1, 1, MsgBox($MB_ICONERROR, '_Word_DocOpen', '$oWord is not an Obj') * 0)
    
        $oWordDoc = _Word_DocOpen($oWord, $sTemplate)
        If @error Then Return SetError(2, 0, MsgBox($MB_ICONERROR, '_Word_DocOpen', '@error: ' & @error) * 0)
        If Not IsObj($oWordDoc) Then Return SetError(2, 0, MsgBox($MB_ICONERROR, '_Word_DocOpen', '$oWordDoc is not an Obj') * 0)
    
        For $j = 1 To $aArray[0][0]
            _Word_DocFindReplace($oWordDoc, $aArray[$j][0], $aArray[$j][1], Default, -1)
        Next
    
        $sFileName = @ScriptDir & "\" & $sSearch_1 & "-" & $sSearch_2 & ".pdf"
        _Word_DocExport($oWordDoc, $sFileName, Default, $wdExportCurrentPage)
    
        _Word_DocClose($oWordDoc, false) ; speichern nicht vergessen
        If @error Then Return SetError(3, 0, MsgBox($MB_ICONERROR, '_Word_DocClose', '@error: ' & @error) * 0)
    
        _Word_Quit($oWord)
        If @error Then Return SetError(4, 0, MsgBox($MB_ICONERROR, '_Word_Quit', '@error: ' & @error) * 0)
    
        Return SetError(0, 0, 1)
    EndFunc   ;==>_Main
    Alles anzeigen

    Andernsfalls müsstest du so vorgehen (dann gehe ich davon aus das der Dateiname mehrfach in versch. Unterordnern existiert):

    AutoIt
    #include <File.au3>
    #include <FileConstants.au3>
    #include <MsgBoxConstants.au3>
    #include <StringConstants.au3>
    #include <Word.au3>
    #include <WordConstants.au3>
     ; https://autoit.de/thread/87817-microsoft-word-suche-und-ersetze-text-in-den-inhalten-der-vba-progammierung-gel%C3%B6/?postID=708429#post708429
    ;~ #DIESE ROUTINE WIRD ÜBER PARAMETER AUFGERUFEN
    
    Opt("MustDeclareVars", 1)
    #AutoIt3Wrapper_Au3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7
    
    ;~ If not $CmdLine[0] = 2 then
    ;~     MsgBox($MB_ICONERROR, 'Parameter', 'No or wrong amount of parameters provided.')
    ;~     Exit
    ;~ EndIf
    Global Const $sSearch_1  = 'SD - AAAA - DE - Händler' ;$CmdLine[1]
    Global Const $sSearch_2  = '12345678' ;$CmdLine[2]
    Global Const $file_s     = "f_search.txt"      ;~ File mit den Suchkriterien
    Global Const $file_r     = $sSearch_2 & ".txt" ;~ File mit den Replace-Strings
    Global Const $sExtension = ".docx" ; Verarbeite nur MS-Word Dokument ohne Macros.
    Global Const $sTemplates = _FileListToArrayRec(@ScriptDir, $sSearch_1 & $sExtension, $FLTAR_FILES, $FLTAR_RECUR, $FLTAR_SORT, $FLTAR_FULLPATH) ; Auflistung der rekursiv zu verarbeitenden MS-Word Dateien
    ;~ Global $iTotalProjectCount = 0, $iTotalComponentCount = 0, $iTotalReplacementCount = 0
    Global $aTags[1]
    
    If not IsArray($sTemplates) Then
        MsgBox($MB_ICONERROR, 'Error', 'Es wurde keine Datei mit dem Namen ' & $sSearch_1 & $sExtension & ' gefunden.')
        Exit
    EndIf
    
    _FileReadToArray($file_s, $aTags)
    _read_file($file_r, 1, $aTags)
    
    For $iFiles = 1 To $sTemplates[0] ; rekursives Ermitteln der zu verarbeitenden Dateien
        _Main($sTemplates[$iFiles], $aTags)
    Next
    
    ;Funktion zum Einlesen der Textfiles in Arrays
    Func _read_file($file_x, $col, ByRef $aArray)
    Local $aFile
        _ArrayColInsert($aTags, $col)
        _FileReadToArray($file_x, $aFile)
        For $iRow = 1 to $aFile[0]
            $aArray[$iRow][$col] = $aFile[$iRow]
        Next
    EndFunc
    
    Func _Main($sTemplate, $aArray)
    Local $oWordDoc, $sFileName
    Local $Folders = StringSplit($sTemplate, '\')
    Local $oWord = _Word_Create(False)
        If @error Then Return SetError(1, 0, MsgBox($MB_ICONERROR, '_Word_Open', '@error: ' & @error) * 0)
        If Not IsObj($oWord) Then Return SetError(1, 1, MsgBox($MB_ICONERROR, '_Word_DocOpen', '$oWord is not an Obj') * 0)
    
        $oWordDoc = _Word_DocOpen($oWord, $sTemplate)
        If @error Then Return SetError(2, 0, MsgBox($MB_ICONERROR, '_Word_DocOpen', '@error: ' & @error) * 0)
        If Not IsObj($oWordDoc) Then Return SetError(2, 0, MsgBox($MB_ICONERROR, '_Word_DocOpen', '$oWordDoc is not an Obj') * 0)
    
        For $j = 1 To $aArray[0][0]
            _Word_DocFindReplace($oWordDoc, $aArray[$j][0], $aArray[$j][1], Default, -1)
        Next
    
        $sFileName = @ScriptDir & "\" & $sSearch_1 & "-" & $sSearch_2 & '-' & $Folders[$Folders[0] - 1] & ".pdf"
        _Word_DocExport($oWordDoc, $sFileName, Default, $wdExportCurrentPage)
    
        _Word_DocClose($oWordDoc, false) ; speichern nicht vergessen
        If @error Then Return SetError(3, 0, MsgBox($MB_ICONERROR, '_Word_DocClose', '@error: ' & @error) * 0)
    
        _Word_Quit($oWord)
        If @error Then Return SetError(4, 0, MsgBox($MB_ICONERROR, '_Word_Quit', '@error: ' & @error) * 0)
    
        Return SetError(0, 0, 1)
    EndFunc   ;==>_Main
    Alles anzeigen
  • ChatGPT für AutoIt - Talk, Ideen, Kuriositäten

    • Moombas
    • 6. Juli 2023 um 09:20

    Das chatGPT hier das "doppelt" falsch interpretiert, darüber sehe ich mal drüber hinweg. Eine Eindeutigere Formulierung wäre möglich, die es ChatGPT dann auch ermöglicht das besser zu machen:

    Imgur
    Discover the magic of the internet at Imgur, a community powered entertainment destination. Lift your spirits with funny jokes, trending memes, entertaining…
    imgur.com

    Abr die Sache bei den oberen Beipielen mit dem "Zufall" finde ich ne harte Nummer.

  • ChatGPT für AutoIt - Talk, Ideen, Kuriositäten

    • Moombas
    • 5. Juli 2023 um 13:04

    Da wir gerade darüber gepsorchen haben: https://imgur.com/a/PFQA3gw

    Hier mal meine Tests in Reihenfolge:

    1. https://imgur.com/a/l4cXUg2 -> kein Zufall, gleiches Ergebnis

    2. https://imgur.com/a/XpUQLoE -> ChatGPT kann aus seinem Fehler lernen

    3. Komplett neuer Chat (vorherigen gelöscht): https://imgur.com/a/hgtQ6a4 -> oder auch nicht, selbst nach der ersten Aufforderung nicht

    4. Jeder weitere test im Schema wie 3. kommt eben zu dem gleichen Ergebnis

    Und dann nochmal ein finaler test der besonders zum Schmunzeln einlädt. Ich habe es dann aufgegeben.

    Imgur
    Discover the magic of the internet at Imgur, a community powered entertainment destination. Lift your spirits with funny jokes, trending memes, entertaining…
    imgur.com
  • Microsoft Word: Suche und ersetze Text in den Inhalten der VBA-Progammierung (gelöst)

    • Moombas
    • 5. Juli 2023 um 11:23

    Japp, habs korrigiert und noch eine andere Stelle (du erwartest ja ein 1-basiertes Array und kein 0-basiertes).

    Ein wirkliches Testen ohne samplefiles ist halt schwer.

    Teste bitte nochmal das komplette Skript von oben.

  • Microsoft Word: Suche und ersetze Text in den Inhalten der VBA-Progammierung (gelöst)

    • Moombas
    • 5. Juli 2023 um 08:16

    Ich habe das von water mal in meins mit rein genommen, da diese Korrektur absolut sinnig ist und ich dies selber garnicht weiter betrachtet hatte beim durchschauen.

  • Microsoft Word: Suche und ersetze Text in den Inhalten der VBA-Progammierung (gelöst)

    • Moombas
    • 4. Juli 2023 um 13:26

    Ganz nebenbei:

    Dein Return in _read_file brauchst du nicht, da du die Funktion nicht mit Zuweisung aufrufst.

    Außerdem verhindert dies die Ausführung des File close.

    Zudem definierst du zwei Variablen LOCAL werden aber GLOBAL sein, da sie im globalen Kontext stehen

    Hier mal dein Skript abgeändert (Zeile 31 auskommentiert, da aktuell nicht verwendet in dem geposteten Code).

    Du müsstest es halt nochmal testen, da ich div. kleine Änderungen vorgenommen habe. Unteranderem:

    - Variablen in den richtigen Kontext verschoben (wenn sie Global gesetzt waren aber nur Lokal verwendet wurden)

    - Variablen deklaration an den Anfang der Funktion(en) gesetzt, anstatt mitten im Code

    - Variablen um Const ergänzt wenn diese nicht verändert werden (dürfen)

    - einzelne Variablennamen geändert um sie eindeutiger zu machen was sie beinhalten (z.B. $i in $iRow)

    - Das Array $aTags ByRef übergeben anstatt direkt auf die Globale Variable zuzugreifen.

    - Return aus der Funktion _read_file entfernt

    - Prüfung am Anfang des Skriptes ob Parameter übergeben wurden, sonst direkter Programmabbruch um Fehlermeldungen zu vermeiden

    - Bei den msgboxen den Wert 16 durch die Konstante ersetzt

    - Korrektur der Funktion _read_file auf die von water (s.u.)

    AutoIt
    #include <File.au3>
    #include <FileConstants.au3>
    #include <MsgBoxConstants.au3>
    #include <StringConstants.au3>
    #include <Word.au3>
    #include <WordConstants.au3>
     ; https://autoit.de/thread/87817-microsoft-word-suche-und-ersetze-text-in-den-inhalten-der-vba-progammierung-gel%C3%B6/?postID=708429#post708429
    ;~ #DIESE ROUTINE WIRD ÜBER PARAMETER AUFGERUFEN
    
    Opt("MustDeclareVars", 1)
    #AutoIt3Wrapper_Au3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7
    
    If not $CmdLine[0] = 2 then
        MsgBox($MB_ICONERROR, 'Parameter', 'No or wrong amount of parameters provided.')
        Exit
    EndIf
    Global Const $sSearch_1  = $CmdLine[1]
    Global Const $sSearch_2  = $CmdLine[2]
    Global Const $file_s     = "f_search.txt"      ;~ File mit den Suchkriterien
    Global Const $file_r     = $sSearch_2 & ".txt" ;~ File mit den Replace-Strings
    Global Const $sExtension = ".docx" ; Verarbeite nur MS-Word Dokument ohne Macros.
    Global Const $sTemplates = _FileListToArrayRec(@ScriptDir, $sSearch_1 & $sExtension, $FLTAR_FILES, $FLTAR_RECUR, $FLTAR_SORT, $FLTAR_FULLPATH) ; Auflistung der rekursiv zu verarbeitenden MS-Word Dateien
    ;~ Global $iTotalProjectCount = 0, $iTotalComponentCount = 0, $iTotalReplacementCount = 0
    Global $aTags[1]
    
    _read_file($file_s, 1, $aTags)
    _read_file($file_r, 2, $aTags)
    
    For $iFiles = 1 To $sTemplates[0] ; rekursives Ermitteln der zu verarbeitenden Dateien
        _Main($sTemplates[$iFiles])
    Next
    
    For $iFiles = 1 To $sTemplates[0] ; rekursives Ermitteln der zu verarbeitenden Dateien
        _Main($sTemplates[$iFiles])
    Next
    
    ;Funktion zum Einlesen der Textfiles in Arrays
    Func _read_file($file_x, $col, ByRef $aArray)
    Local $iRow = 1
    Local $hFileHandle = FileOpen($file_x, $FO_READ)
        ReDim $aArray[_FileCountLines($hFileHandle) + 1][$col]
        While 1
            $aArray[$iRow][$col-1] = FileReadLine($hFileHandle, $iRow)
            If @error Then ExitLoop
            $iRow += 1
        WEnd
        FileClose($hFileHandle)
    EndFunc
    
    Func _Main($sTemplate)
    Local $oWordDoc, $sFileName
    Local $oWord = _Word_Create()
        If @error Then Return SetError(1, 0, MsgBox($MB_ICONERROR, '_Word_Open', '@error: ' & @error) * 0)
        If Not IsObj($oWord) Then Return SetError(1, 1, MsgBox($MB_ICONERROR, '_Word_DocOpen', '$oWord is not an Obj') * 0)
    
        $oWordDoc = _Word_DocOpen($oWord, $sTemplate)
        If @error Then Return SetError(2, 0, MsgBox($MB_ICONERROR, '_Word_DocOpen', '@error: ' & @error) * 0)
        If Not IsObj($oWordDoc) Then Return SetError(2, 0, MsgBox($MB_ICONERROR, '_Word_DocOpen', '$oWordDoc is not an Obj') * 0)
    
        For $j = 0 To UBound($aTags, 1) - 1
            _Word_DocFindReplace($oWordDoc, $aTags[$j][0], $aTags[$j][1], Default, -1)
        Next
    
    ;~     consolewrite(@ScriptDir & @CRLF)
        $sFileName = @ScriptDir & "\" & $sSearch_1 & "-" & $sSearch_2 & ".pdf"
        _Word_DocExport($oWordDoc, $sFileName, Default, $wdExportCurrentPage)
    
        _Word_DocClose($oWordDoc, false) ; speichern nicht vergessen
        If @error Then Return SetError(3, 0, MsgBox($MB_ICONERROR, '_Word_DocClose', '@error: ' & @error) * 0)
    
        _Word_Quit($oWord)
        If @error Then Return SetError(4, 0, MsgBox($MB_ICONERROR, '_Word_Quit', '@error: ' & @error) * 0)
    
        Return SetError(0, 0, 1)
    EndFunc   ;==>_Main
    Alles anzeigen
  • Microsoft Word: Suche und ersetze Text in den Inhalten der VBA-Progammierung (gelöst)

    • Moombas
    • 30. Juni 2023 um 09:18
    Zitat von mumpel

    M.E. würde dafür VBA reichen. AutoIt wäre dafür überdimensioniert. ;)

    VBA erfordert aber .dotm Dokumente, die in einigen Unternehmen nicht erlaubt sind.

  • Funktionsnamen mit Unterstrich

    • Moombas
    • 28. Juni 2023 um 15:40

    Das wird in der Regel in AutoIt gerne mit einem Kleinbuchstaben gezeigt:

    AutoIt
    $sVariable = String
    $iVariable = Integer
    $oVariable = Objekt

    Wobei ich ggf. je nach Umfang dies auch kombiniere ob Global, Lokal (+ggf. Const):

    AutoIt
    Local        $L_sName = String
    Global       $G_sName = String
    Global Const $GCsName = String

    Aber im Endeffekt versuche ich Global im besten Fall ganz zu vermeiden und die Variable immer zu übergeben und jeder hat so ein bisschen seinen eigenen Stil.

  • iniRead Problem

    • Moombas
    • 26. Juni 2023 um 14:14

    Tipp 1: Benutze das Flag anstatt der Zahl in Zeile 3 & 4 (also anstatt "1" $FC_OVERWRITE), dann weisßt du später noch was für flags du gesetzt hast.

    Tipp 2: Hast du geprüft ob beide Dateien denn auch existieren? Also in deinem Fall "D:\Fse\Oberflaeche\Fse.ini", da du ja schreibst das nur die 2. Datei nicht kopiert wird. Achte auch auf Tippfehler im Pfad.

    Bei mir funktioniert das ohne Probleme.

    Tipp 3: Anstatt die Teamviewer version im Skript fix zu verdrahten, schau mal ob du sie auslesen kannst: $sTVVersion = FileGetVersion("c:\path\to\teamviewer.exe", $FV_PRODUCTVERSION). Ich mache das für ein anderes Programm um zu prüfen ob ich aktualisieren muss oder nicht.

  • iniRead Problem

    • Moombas
    • 23. Juni 2023 um 07:48

    Sporadische Meldungen sind immer schwer zu lokalisieren.

  • iniRead Problem

    • Moombas
    • 22. Juni 2023 um 14:26

    Naja die Fehlermeldung zeigt ja schon auf die entsprechende Zeile...

    Und da ich (bei mir) gemerkt habe, das die Fehler meist am Ende der Zeile passieren, von hinten nach vorne geschaut und gleich gesehen.

  • iniRead Problem

    • Moombas
    • 22. Juni 2023 um 14:01

    In Zeile 25 fehlt ein " vor dem letzten Komma

  • Webdriver Frage

    • Moombas
    • 21. Juni 2023 um 08:54

    Blöde Frage: Warum versteckst du den Browser nicht per SW_HIDE anstatt ihn headless zu starten?

    Dann könntest du ihn mit SW_SHOW wieder anzeigen.

    Gibt es da beim Verhalten unterschiede, das du headless benötigst?

  • Excel Zelle Formatierung ändern

    • Moombas
    • 20. Juni 2023 um 14:15

    Kein Problem, es ist gerade bei sowas oft eine Kleinigkeit. das Hochkomma hatte ich ja auch erst übersehen.

  • Excel Zelle Formatierung ändern

    • Moombas
    • 20. Juni 2023 um 12:57

    Eventuell hilft dir das weiter: https://www.autoitscript.com/forum/topic/12…ols_837278_menu

    Versuch mal , anstatt . zu nutzen bzw. ich sehe gerade, du hast ’ in dem String, entferne mal das nach der ersten #.

  • tabellarische Reporte oder Berichte aus Autoit

    • Moombas
    • 20. Juni 2023 um 09:22

    Ich würde gerne ein besseres Ergebnis liefern, bin mit der erstellten PDF extrem unzufrieden nur leider fehlen mir da die Kenntnisse um das gerade zu rücken.

    Hier aber mal die aktualisierte au3 um die Kommentare incl. Zeilenumbrüchen hinzuzufügen.

    AutoIt
    Opt('MustDeclareVars', 1)
    #cs ----------------------------------------------------------------------------
    
        AutoIt Version: 3.3.16.0
        Author:         Moombas
    
        Script Function:
    Get data from a csv (*.dat) file put it into a Listview and save it as PDF
    ToDo:
    - Align PDF style for wide tables
    
    #ce ----------------------------------------------------------------------------
    #AutoIt3Wrapper_Au3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7
    
    #include <Array.au3>
    #include <AutoItConstants.au3>
    #include <File.au3>
    #include <FileConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    #include <ListViewConstants.au3>
    #include <MsgBoxConstants.au3>
    #include "MPDF_UDF.au3"
    
    ;GUI
    Global $fMain, $lvData, $eComment, $bSave, $bClose, $bReset, $bNext, $iTableHigh
    Global Const $iMainWidth  = 1024
    Global Const $iMainHeight = 768
    Global Const $iCommHeight = 200
    Global Const $iBtnHeight  = 40
    Global Const $iBtnWidth   = 100
    Global Const $iBorder     = 5
    
    ;Variables
    Global $File, $FileName
    Global $bSaved = False
    Global Const $sInputFolder  = @ScriptDir & '\In\'
    Global Const $sOutputFolder = @ScriptDir & '\Out\'
    Global Const $sBackupFolder = @ScriptDir & '\Backup\'
    
        $FileName = FileFindNextFile(FileFindFirstFile($sInputFolder & '*.dat'))
        _FileReadToArray($sInputFolder & $FileName, $File, $FRTA_NOCOUNT, ';')
        If not IsArray($File) then
            MsgBox($MB_OK+$MB_ICONERROR, 'Fehler', 'Keine Datei gefunden.')
            Exit
        Else
            _GenerateGUI($File)
        EndIf
    
        While 1
            Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                    ExitLoop
                Case $bReset
                    _FileReadToArray($sInputFolder & $FileName, $File, $FRTA_NOCOUNT, ';')
                    _CreateListView($File)
                Case $bNext
                    _NextFile()
                Case $bSave
                    _DataToPDF()
                    _NextFile()
                Case $bClose
                    _Exit()
            EndSwitch
    ;~          sleep(100)
        WEnd
    
    
    Func _GenerateGUI($aFile)
    Local Const $sTitle = Stringsplit($FileName, '.')[1]
        $fMain    = GUICreate($sTitle, $iMainWidth, $iMainHeight)
    
        _CreateListView($aFile)
    
        $eComment = GUICtrlCreateEdit('Insert comments here', $iBorder, $iMainHeight-(2*$iBorder)-$iCommHeight-$iBtnHeight, $iMainWidth-(2*$iBorder), $iCommHeight)
        $bReset   = GUICtrlCreateButton('Reset'    , $iBorder                                   , $iMainHeight-$iBorder-$iBtnHeight, $iBtnWidth, $iBtnHeight)
        $bNext    = GUICtrlCreateButton('Nächste'  , (2*$iBorder)+$iBtnWidth                    , $iMainHeight-$iBorder-$iBtnHeight, $iBtnWidth, $iBtnHeight)
        $bSave    = GUICtrlCreateButton('Speichern', ($iMainWidth/2)-($iBtnWidth/2)-(2*$iBorder), $iMainHeight-$iBorder-$iBtnHeight, $iBtnWidth, $iBtnHeight)
        $bClose   = GUICtrlCreateButton('Beenden'  , $iMainWidth-$iBorder-$iBtnWidth            , $iMainHeight-$iBorder-$iBtnHeight, $iBtnWidth, $iBtnHeight)
        GUISetState(@SW_HIDE, $bNext)
    
        GUISetState(@SW_SHOW, $fMain)
    EndFunc
    
    Func _NextFile();Nimmt aktuell nur die erste gefundene Datei, Anpassungen notwendig, sofern durchgeklickt werden soll. Nach dem Speichern, wird hiermit die nächste Datei aufgerufen
        If not $bSaved then
            If MsgBox($MB_YESNO, 'Beenden ohne zu Speichern?', 'Wollen sie das Programm beenden ohne zu speichern?' & @CRLF & _
                                                               'Mögliche Änderungen gehen sonst verloren.') = $IDYES Then Return
        EndIf
    
        $FileName = FileFindNextFile(FileFindFirstFile($sInputFolder & '*.dat'))
        _FileReadToArray($sInputFolder & $FileName, $File, $FRTA_NOCOUNT, ';'); Kann gegen eine Funktion ausgetauscht werden um z.B. alle *.? Dateien in einem "Inputordner" o.ä. zu verarbeiten.
        If not IsArray($File) then
            MsgBox($MB_OK+$MB_ICONERROR, 'Fehler', 'Keine weitere Datei gefunden.')
            Exit
        Else
            _CreateListView($File)
        EndIf
    EndFunc
    
    Func _CreateListView($aFile)
    Local Const $iRows  = Ubound($aFile, $UBOUND_Rows)-1
    Local Const $iCols  = Ubound($aFile, $UBOUND_COLUMNS)-1
    Local Const $sTitle = Stringsplit($FileName, '.')[1]
    
        WinSetTitle($fMain, '', $sTitle)
        _GUICtrlListView_Destroy($lvData)
    
        $lvData   = GUICtrlCreateListView("", $iBorder, $iBorder, $iMainWidth-(2*$iBorder), $iMainHeight-(4*$iBorder)-$iCommHeight-$iBtnHeight, $LVS_NOCOLUMNHEADER)
        _GUICtrlListView_SetExtendedListViewStyle($lvData, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES))
    
        For $iCol = 0 To $iCols
            _GUICtrlListView_AddColumn($lvData, $aFile[0][$iCol], 150)
        Next
        For $iRow = 0 To $iRows
            _GUICtrlListView_AddItem($lvData, $aFile[$iRow][0], $iRow)
            For $iCol = 1 to $iCols
                _GUICtrlListView_AddSubItem($lvData, $iRow, $aFile[$iRow][$iCol], $iCol)
            Next
        Next
        GUICtrlSetData($eComment, 'Insert comments here')
        $bSaved = False
    Endfunc
    
    Func _DataToPDF()
    Local $aComment
    Local $aData    = _GUICtrlListView_CreateArray($lvData)
    Local Const $sTitle    = Stringsplit($FileName, '.')[1]
    Local Const $iBorder   = 1.5
    Local Const $bTest     = True
    Local Const $iRows     = Ubound($aData, $UBOUND_Rows)-1
    Local Const $iCols     = Ubound($aData, $UBOUND_COLUMNS)-1
        _ArrayDelete($aData, 0)
        $aComment = ReworkComment(GUICtrlRead($eComment))
    
        ;PDF Code comes here
    
        ;set the properties for the pdf
        _SetTitle($sTitle)
        _SetSubject('')
        _SetKeywords("pdf, data, sqllite")
        _OpenAfter($bTest);open after generation
        _SetUnit($PDF_UNIT_CM)
        _SetPaperSize("CUSTOM",841.890, 595.276); A4 landscape
        _SetZoomMode($PDF_ZOOM_FULLPAGE)
        _SetOrientation($PDF_ORIENTATION_LANDSCAPE)
        _SetLayoutMode($PDF_LAYOUT_CONTINOUS)
    
        ;initialize the pdf
        _InitPDF($sOutputFolder & Stringsplit($FileName, '.')[1] & '.pdf')
    
        ;=== load used font(s) ===
        ;fonts: Garamond
        _LoadFontTT("_CalibriB", $PDF_FONT_CALIBRI, $PDF_FONT_BOLD)
        _LoadFontTT("_CalibriI", $PDF_FONT_CALIBRI, $PDF_FONT_ITALIC)
        _LoadFontTT("_Calibri" , $PDF_FONT_CALIBRI)
    
        ;begin page
        _BeginPage()
            _InsertTable($aData, $iBorder, _GetPageHeight()/_GetUnit()-2-(0.8*$iRows) , 0, 0.8*$iRows, $iCols, $iRows)
            _SetTextRenderingMode(1)
            _InsertRenderedText((_GetPageWidth()/_GetUnit())/2, _GetPageHeight()/_GetUnit()-$iBorder                 , $sTitle        , "_Calibri", 16, 100, $PDF_ALIGN_CENTER, 0x000000, 0x000000)
            For $Row = 1 to $aComment[0]
                _InsertRenderedText($iBorder                  , _GetPageHeight()/_GetUnit()-$iTableHigh-$iBorder-$Row, $aComment[$Row], '_Calibri', 10, 100, $PDF_ALIGN_LEFT  , 0x000000, 0x000000)
            Next
            _SetTextRenderingMode(0)
        _EndPage()
    
        ;write the buffer to disk
        _ClosePDFFile()
    
        ;When ready
        FileMove($sInputFolder & $FileName, $sBackupFolder & $FileName, $FC_OVERWRITE + $FC_CREATEPATH)
        $bSaved = True
    EndFunc
    
    Func ReworkComment($sText)
    Local $aTempWords, $sTempText, $aReturn[1] = [0]
    Local $aTempLines = StringSplit($sText, @CRLF)
    Local Const $iMaxChars = 125
        For $i = 1 to 2
            For $Row = $aTempLines[0] to 1 Step -1
                If $aTempLines[$Row    ] =  '' and _
                   $aTempLines[$Row - 1] <> '' then _ArrayDelete($aTempLines, $Row)
            Next
            $aTempLines[0] = UBound($aTempLines, $UBOUND_ROWS) - 1
        Next
    
        For $RowLines = 1 to $aTempLines[0]
            If $aTempLines[$RowLines] <> '' then
                $aTempWords = StringSplit($aTempLines[$RowLines], ' ')
                For $RowWords = 1 to $aTempWords[0]
                    If StringLen($sTempText & ' ' & $aTempWords[$RowWords]) <= $iMaxChars Then
                        $sTempText &= $aTempWords[$RowWords] & ' '
                    Else
                        _ArrayAdd($aReturn, StringTrimRight($sTempText, 1))
                        $sTempText = ''
                    EndIf
                Next
                If $sTempText <> '' then
                    _ArrayAdd($aReturn, StringTrimRight($sTempText, 1))
                    $sTempText = ''
                Endif
            Else
                _ArrayAdd($aReturn, '')
            EndIf
        Next
        $aReturn[0] = UBound($aReturn, $UBOUND_ROWS) - 1
        Return $aReturn
    EndFunc
    
    
    Func _Exit()
        If $bSaved then
            Exit
        Else
            If MsgBox($MB_YESNO, 'Beenden ohne zu Speichern?', 'Wollen sie das Programm beenden ohne zu speichern?' & @CRLF & _
                                                               'Mögliche Änderungen gehen sonst verloren.') = $IDYES Then Exit
        EndIf
    EndFunc
    
    Func _InsertTable($aData, $iX, $iY, $iW = 0, $iH = 0, $iCols = 0, $iRows = 0, $lTxtColor = 0x000000, $lBorderColor = 0xdddddd)
    Local $lScale, $sLength, $sText, $iColW, $iRowH, $lRGB = 0xffffff
    Local $iPgW = Round(_GetPageWidth()  / _GetUnit(), 1)
    Local $iPgH = Round(_GetPageHeight() /_GetUnit() , 1)
        If $iW = 0 Then $iW = $iPgW - $iX - 2
        If $iH = 0 Then $iH = $iPgH - $iY - 2
        $iTableHigh = $iH
        _SetColourStroke($lBorderColor)
        _Draw_Rectangle($iX, $iY, $iW, $iH, $PDF_STYLE_STROKED, 0, 0xffffff, 0.01)
        _SetColourStroke(0)
        $iColW = $iW / $iCols
        $iRowH = $iH / $iRows
        For $i = 0 To $iRows - 1
            For $j = 0 To $iCols - 1
    ;~             If $i = 0 Then
    ;~                 $lRGB = 0xfefefe
    ;~             Else
    ;~                 $lRGB = 0xefefef
    ;~             EndIf
                _SetColourStroke($lBorderColor)
                _Draw_Rectangle($iX + $j * $iColW, $iY + $iH - ($i + 1) * $iRowH, $iColW, $iRowH, $PDF_STYLE_STROKED, 0, $lRGB, 0.01)
                _SetColourStroke(0)
    
                $sText   = $aData[$i][$j]
                If $sText = '' then $sText = ' '
                $sLength = Round(_GetTextLength($sText, "_Calibri", 8), 1)
                $lScale  = Ceiling(0.75 * $iColW * 100 / $sLength)
    
                _SetColourFill($lTxtColor)
                _SetTextHorizontalScaling($lScale)
                _DrawText($iX + $j * $iColW + $iColW / 10, $iY + $iH - ($i + 1) * $iRowH + ($iRowH - 10 / _GetUnit()) / 2, $sText, "_Calibri", 8, $PDF_ALIGN_LEFT, 0)
                _SetTextHorizontalScaling(100)
                _SetColourFill(0)
            Next
        Next
    EndFunc   ;==>_InsertTable
    
    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _GUICtrlListView_CreateArray
    ; Description ...: Creates a 2-dimensional array from a listview.
    ; Syntax ........: _GUICtrlListView_CreateArray($hListView[, $sDelimeter = '|'])
    ; Parameters ....: $hListView           - Control ID/Handle to the control
    ;                  $sDelimeter          - [optional] One or more characters to use as delimiters (case sensitive). Default is '|'.
    ; Return values .: Success - The array returned is two-dimensional and is made up of the following:
    ;                                $aArray[0][0] = Number of rows
    ;                                $aArray[0][1] = Number of columns
    ;                                $aArray[0][2] = Delimited string of the column name(s) e.g. Column 1|Column 2|Column 3|Column nth
    
    ;                                $aArray[1][0] = 1st row, 1st column
    ;                                $aArray[1][1] = 1st row, 2nd column
    ;                                $aArray[1][2] = 1st row, 3rd column
    ;                                $aArray[n][0] = nth row, 1st column
    ;                                $aArray[n][1] = nth row, 2nd column
    ;                                $aArray[n][2] = nth row, 3rd column
    ; Author ........: guinness
    ; Remarks .......: GUICtrlListView.au3 should be included.
    ; Example .......: Yes
    ; ===============================================================================================================================
    Func _GUICtrlListView_CreateArray($hListView, $sDelimeter = '|')
        Local $iColumnCount = _GUICtrlListView_GetColumnCount($hListView), $iDim = 0, $iItemCount = _GUICtrlListView_GetItemCount($hListView)
        If $iColumnCount < 3 Then
            $iDim = 3 - $iColumnCount
        EndIf
        If $sDelimeter = Default Then
            $sDelimeter = '|'
        EndIf
    
        Local $aColumns = 0, $aReturn[$iItemCount + 1][$iColumnCount + $iDim] = [[$iItemCount, $iColumnCount, '']]
        For $i = 0 To $iColumnCount - 1
            $aColumns = _GUICtrlListView_GetColumn($hListView, $i)
            $aReturn[0][2] &= $aColumns[5] & $sDelimeter
        Next
        $aReturn[0][2] = StringTrimRight($aReturn[0][2], StringLen($sDelimeter))
    
        For $i = 0 To $iItemCount - 1
            For $j = 0 To $iColumnCount - 1
                $aReturn[$i + 1][$j] = _GUICtrlListView_GetItemText($hListView, $i, $j)
            Next
        Next
        Return SetError(Number($aReturn[0][0] = 0), 0, $aReturn)
    EndFunc   ;==>_GUICtrlListView_CreateArray
    Alles anzeigen
  • tabellarische Reporte oder Berichte aus Autoit

    • Moombas
    • 19. Juni 2023 um 15:45

    Die Funktion _Iif muss manuell hinzugefügt werden, da diese aus alten AutoIt-Versionen stammt.

    Die Dateiendung müsste in meinem Beispielcode .dat sein, kannst du aber ändern in Zeile 41.

    Deine Beispieldatei habe ich entsprechend umbenannt und hier das ganze angehängt.

    Ich habe deine Datei auch mal als PDF erzeugt, allerdings auf Grund der Breite sieht das noch grauenhaft aus (siehe "out" Ordner).

    Und der Zeilenumbruch für die Texte aus dem Kommentarfeld muss noch eingebaut werden.

    Leider fehlen mir die Kenntnisse um das gerade zu rücken.

    Dateien

    DataToPDF.zip 29,96 kB – 132 Downloads

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™