Markierter Text direkt in Excel...

  • Hallo Leute,

    ich versuche ein kleines Script zu schreiben, welches einen kopierten Text (aus einem pdf-file per ^c) direkt in eine Exceltabelle einfügt. Jedoch würde ich gerne die Umbrüche im Text gleich mit löschen, damit ich ein fließenden Text rausbekomme.

    Konkret:

    • Text im PDF markieren
    • Strg + c
    • Umbrüche aus dem Text löschen
    • wechsel in Excel ( Tabelle schon offen)
    • Inhalt des Zwischenspeichers in das selektier Feld schrieben
    • {enter} (um in die nächste Zeile zu springen)
    • zurückspringen in Acrobat


    Erstern Ansatz:

    Spoiler anzeigen
    [autoit]


    HotKeySet ("^c", "_copy")
    Run ("excel.exe")
    While 1
    Sleep (1000)
    WEnd

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

    Func _copy ()
    $cache = ClipGet ()
    WinActivate ("[CLASS:XLMAIN]", "")
    WinWaitActive ("[CLASS:XLMAIN]", "")
    MsgBox (48, "Cache", $cache)
    send ( $cache )
    EndFunc

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

    Damit bin ich aber nicht wirklich weit gekommen. Sobald das Script läuft funktioniert der Zwischenspeicher nicht mehr. Das Script schreibt immerwieder den Inhalt von vor dem Start des Scripts...

    Dann hab ich das hier gefunde:

    Spoiler anzeigen
    [autoit]

    #include <GuiConstantsEx.au3>
    #include <ClipBoard.au3>
    #include <WindowsConstants.au3>
    #include <SendMessage.au3>

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

    Global Const $WS_EX_COMPOSITED = 0x2000000
    $hGUI = GUICreate("ClipboardViewer", 300, 400, -1, -1, BitOr($GUI_SS_DEFAULT_GUI, $WS_SIZEBOX), $WS_EX_COMPOSITED)
    $iMemo = GUICtrlCreateEdit("", 2, 2, 296, 396, $WS_VSCROLL)
    GUICtrlSetFont(-1, 10, 400, 0, "Courier New")
    GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
    GUISetState()
    WinSetOnTop($hGUI, '', 1)
    $hNext = _ClipBoard_SetViewer ($hGUI)
    GUIRegisterMsg($WM_CHANGECBCHAIN, "WM_CHANGECBCHAIN")
    GUIRegisterMsg($WM_DRAWCLIPBOARD, "WM_DRAWCLIPBOARD")
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    _ClipBoard_ChangeChain ($hGUI, $hNext)

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

    Func WM_CHANGECBCHAIN($hWnd, $iMsg, $iwParam, $ilParam)
    If $iwParam = $hNext Then
    $hNext = $ilParam
    ElseIf $hNext <> 0 Then
    _SendMessage ($hNext, $WM_CHANGECBCHAIN, $iwParam, $ilParam, 0, "hwnd", "hwnd")
    EndIf
    EndFunc ;==>WM_CHANGECBCHAIN

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

    Func WM_DRAWCLIPBOARD($hWnd, $iMsg, $iwParam, $ilParam)
    GUICtrlSetData($iMemo, _ClipBoard_GetData() & @CRLF, 1)
    If $hNext <> 0 Then _SendMessage ($hNext, $WM_DRAWCLIPBOARD, $iwParam, $ilParam)
    EndFunc ;==>WM_DRAWCLIPBOARD

    [/autoit]

    Das ist ja schon in die richtige Richtung. Hier blick ich aber nicht so richtig durch. Deswegen kann ich das nicht für meinen Zweck umschreiben. Weiß auch nicht, ob das überhaupt möglich ist. Auch fehlt noch das Löschen von Umbrüchen im Text... Hat jemand von euch eine Ahnung, wie ich das ganze realisieren kann?

    schon mal danke
    Daniel

    Einmal editiert, zuletzt von Mertox (23. September 2009 um 20:07)

  • wie schaut das dann an einem konkreten Beispielt aus? Etwa so?

    [autoit]


    $text = "Text mit Ubrüchen...."

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

    $text2 = StringReplace ("$text", "Chr(13)", " ")

    [/autoit]
  • Hi
    habe mich mal ein bischen hingesetzt und ausprobiert. Hier ein erster Entwurf.

    Spoiler anzeigen
    [autoit]

    Opt("WinTitleMatchMode", 2)
    HotKeySet("+!d", "ShowMessage") ; Shift-Alt-d

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

    While 1
    Sleep (1000)
    WEnd
    Func ShowMessage()
    WinActivate ( "Adobe Reader")
    WinWaitActive("Adobe Reader","")
    ClipPut ( "" ) ;Zwischenablage leeren damit überprüft werden kann ob etwas kopiert worden ist
    Send("^c")
    $cache = ClipGet ()
    If $cache <> "" Then
    $cache = StringRegExpReplace ( $cache,@crlf, " ")
    MsgBox (48, "Cache", $cache)
    ClipPut ( "" )
    Else
    MsgBox (48, "Cache", "cache ist leer")
    EndIf
    EndFunc

    [/autoit]


    den Rest in Excel muß ich erst noch programmieren da auf dem Pc hier kein MS-Office installiert ist.
    Cu bis Morgen

  • So

    ich habe jetzt mich ein bischen mit Excel beschäftigt und folgendes herausgefunden.
    Um Excel zu steuern mußt du die Excel.au3 einbinden. Jetzt kannst du Excel-Dateien öffnen, speichern, bearbeiten und schließen.

    Folgende Befehle bräuchtest du am dringendsten.

    Spoiler anzeigen
    [autoit]


    $sValue = "test was" ;$cache
    $sRangeOrRow = "B8"
    $iColumn = 1
    $fAlerts = 0
    $oExcel = _ExcelBookOpen("Pfad\Datei", 1) ;1=sichtbar 0=unsichtbar
    _ExcelWriteCell($oExcel, $sValue, $sRangeOrRow, $iColumn)
    _ExcelBookSave($oExcel, $fAlerts)
    WinClose($oExcel) ;funktioniert bei mir nicht richtig Programm wird geschloßen, aber der Prozess nicht beendet

    [/autoit]

    für weitere Befehle schau einfach in der Excel.au3 im Include-Ordner nach.
    Da ich leider nicht genau weiß, was du machen willst, kann ich dir momentan keine komplette Funktion schreiben.

    bis später

  • Also ich hab jetz einige Zeit getüftelt und einiges von dir bei mir eingefügt. Im Prinzip läuft die Sache schon recht gut.

    Spoiler anzeigen
    [autoit]


    Opt("SendKeyDelay", 1)
    Opt ("WinWaitDelay", 0)

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

    #include <GUIConstants.au3>
    ; #include <ModernMenu.au3>
    ; #include <sampleGUIandTray.au3>
    ; #include <sample_Win2Tray.au3>
    ; #include <sampleGUIandTray-unicode.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Copystation", 180, 157, 193, 128)
    $Button1 = GUICtrlCreateButton("Close", 40, 120, 97, 25, 0)
    $Button2 = GUICtrlCreateButton("Save", 40, 90, 97, 25, 0)
    $Input1 = GUICtrlCreateInput("", 75, 16, 33, 21)
    $Label1 = GUICtrlCreateLabel("alt = !", 30, 48, 30, 17)
    $Label2 = GUICtrlCreateLabel("shift = +", 30, 65, 41, 17)
    $Label3 = GUICtrlCreateLabel("strg = ^", 90, 48, 39, 17)
    $Label4 = GUICtrlCreateLabel("{F1} - {12}", 90, 65, 53, 17)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    Exit
    Case $Button2 ; Zum einlesen der Tastenkombination und Hotkey setzten
    $key = GUICtrlRead ( $Input1 )
    MsgBox ( 48, "Meldung", "Tastenkombination wurde gesetzt" )
    HotKeySet ( $key, "_copy")
    EndSwitch
    WEnd

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

    While 1
    Sleep (1000)
    WEnd

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

    Func _copy ()
    ClipPut ( "" )
    send ("^c")
    $cache = ClipGet () ; Zwischenspeicher auslesen
    $cache = StringRegExpReplace ( $cache,@crlf, " ") ; Umbrüche entfernen
    ClipPut ( $cache ) ; Zwischenspeicher zurückschreiben
    WinActivate ("[CLASS:XLMAIN]", "")
    WinWaitActive ("[CLASS:XLMAIN]", "")
    ; MsgBox (48, "Cache", $cache)
    ; send ( "{F2}" )
    send ( "^v")
    ; send ( $cache )
    send ( "{ENTER}" ) ; Zelle wechseln
    WinActivate ("[CLASS:AcrobatSDIWindow]", "")
    WinWaitActive ("[CLASS:AcrobatSDIWindow]", "")
    EndFunc

    [/autoit]

    So jetz hatte ich noch die Idee das ganze in ein Traymenu einzubinden:

    Spoiler anzeigen
    [autoit]


    #Include <Constants.au3>

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

    Opt("TrayMenuMode",1) ; Default tray menu items (Script Paused/Exit) will not be shown.

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

    $settingsitem = TrayCreateMenu("Settings")
    $about = TrayCreateItem("About")
    $shortcut = TrayCreateItem("Shortcut", $settingsitem)
    ;$printeritem = TrayCreateItem("Printer", $settingsitem)
    $exititem = TrayCreateItem("Exit")

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

    TraySetState()

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

    Func _copy ()
    ClipPut ( "" )
    send ("^c")
    $cache = ClipGet ()
    $cache = StringRegExpReplace ( $cache,@crlf, " ")
    ClipPut ( $cache )
    WinActivate ("[CLASS:XLMAIN]", "")
    WinWaitActive ("[CLASS:XLMAIN]", "")
    ; MsgBox (48, "Cache", $cache)
    ; send ( "{F2}" )
    send ( "^v")
    ; send ( $cache )
    send ( "{ENTER}" )
    WinActivate ("[CLASS:AcrobatSDIWindow]", "")
    WinWaitActive ("[CLASS:AcrobatSDIWindow]", "")
    EndFunc

    While 1
    $msg = TrayGetMsg()
    Select
    Case $msg = $about
    MsgBox ( 64, "About:", "Scriped by Daniel Glauche")
    Case $msg = 0
    ContinueLoop
    Case $msg = $shortcut

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Copystation", 180, 157, 193, 128)
    GUISetIcon("E:\REG-IS Archiv\_REG_IS 20090419\Favicon.ico")
    $Button1 = GUICtrlCreateButton("Close", 40, 120, 97, 25, 0)
    $Button2 = GUICtrlCreateButton("Save", 40, 90, 97, 25, 0)
    $Input1 = GUICtrlCreateInput("", 75, 16, 33, 21)
    $Label1 = GUICtrlCreateLabel("alt = !", 30, 48, 30, 17)
    $Label2 = GUICtrlCreateLabel("shift = +", 30, 65, 41, 17)
    $Label3 = GUICtrlCreateLabel("strg = ^", 90, 48, 39, 17)
    $Label4 = GUICtrlCreateLabel("{F1} - {12}", 90, 65, 53, 17)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg

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


    Case $Button2
    $key = GUICtrlRead ( $Input1 )
    MsgBox ( 48, "Meldung", "Tastenkombination wurde gesetzt" )
    HotKeySet ( $key, "_copy")
    GUISetState ( @SW_MINIMIZE )
    Case $Button1
    ; GUISetState ( @SW_Hide)
    GUIDelete ( $Form1 )
    EndSwitch
    WEnd

    While 1
    Sleep (1000)
    WEnd

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

    Case $msg = $exititem
    Exit
    EndSelect
    WEnd

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

    Exit

    [/autoit]

    ganz theoretisch funktioniert das auch schon. Aber leider bleibt das Script stehen, wenn ich versuche auf irgendeine Weise das "Shortcut" Fenster zu schliesen. Habs schon mit GUISetStat (@SW_Hide) /Show, Exit, exitloop und GUI delete proviert. Bei Exit wird das ganze Script logischeer weise geschlossen. Bei GUIdelete verschwindet zwar das Fenster jedoch lässt sich das GUI dann nicht nochmal öffnen und das script verweigert den Dienst.
    Gewollt ist das ganze eigentlich wie bei des MsgBox bei About. Nur irgendwie klappt das nicht...

  • Hi
    habe deinen Code ein bischen geändert. Er funktioniert zwar bei mir, allerdings weiß ich nicht ob er so noch richtig ist. (Übersteigt mein Autoit wissen)

    Spoiler anzeigen
    [autoit]

    #Include

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

    Opt("TrayMenuMode",1) ; Default tray menu items (Script Paused/Exit) will not be shown.

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

    $settingsitem = TrayCreateMenu("Settings")
    $about = TrayCreateItem("About")
    $shortcut = TrayCreateItem("Shortcut", $settingsitem)
    ;$printeritem = TrayCreateItem("Printer", $settingsitem)
    $exititem = TrayCreateItem("Exit")

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

    TraySetState()

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

    Func _copy ()
    ClipPut ( "" )
    send ("^c")
    $cache = ClipGet ()
    $cache = StringRegExpReplace ( $cache,@crlf, " ")
    ClipPut ( $cache )
    WinActivate ("[CLASS:XLMAIN]", "")
    WinWaitActive ("[CLASS:XLMAIN]", "")
    ; MsgBox (48, "Cache", $cache)
    ; send ( "{F2}" )
    send ( "^v")
    ; send ( $cache )
    send ( "{ENTER}" )
    WinActivate ("[CLASS:AcrobatSDIWindow]", "")
    WinWaitActive ("[CLASS:AcrobatSDIWindow]", "")
    EndFunc

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Copystation", 180, 157, 193, 128)
    GUISetIcon("E:\REG-IS Archiv\_REG_IS 20090419\Favicon.ico")
    GUISetState ( @SW_HIDE, $Form1 )
    $Button1 = GUICtrlCreateButton("Close", 40, 120, 97, 25, 0)
    $Button2 = GUICtrlCreateButton("Save", 40, 90, 97, 25, 0)
    $Input1 = GUICtrlCreateInput("", 75, 16, 33, 21)
    $Label1 = GUICtrlCreateLabel("alt = !", 30, 48, 30, 17)
    $Label2 = GUICtrlCreateLabel("shift = +", 30, 65, 41, 17)
    $Label3 = GUICtrlCreateLabel("strg = ^", 90, 48, 39, 17)
    $Label4 = GUICtrlCreateLabel("{F1} - {12}", 90, 65, 53, 17)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $msg = TrayGetMsg()
    $nMsg = GUIGetMsg()
    Select
    Case $msg = $about
    MsgBox ( 64, "about:", "Scriped by Daniel Glauche")
    Case $msg = $shortcut
    GUISetState(@SW_SHOW,$Form1)
    Case $nMsg = $Button2
    $key = GUICtrlRead ( $Input1 )
    MsgBox ( 48, "Meldung", "Tastenkombination wurde gesetzt" )
    HotKeySet ( $key, "_copy")
    GUISetState ( @SW_HIDE, $Form1 )
    Case $nMsg= $Button1
    GUISetState ( @SW_Hide, $Form1)
    ;~ GUIDelete ( $Form1 )
    Case $msg = $exititem
    Exit
    EndSelect
    WEnd

    [/autoit]


    Gruß Flarkus

    • Offizieller Beitrag

    Das ist alles viel zu kompliziert. ;)
    Wenn du Excel bereits offen hast und die erste zu beschreibende Zelle markiert ist, starte einfach folgendes Skript.
    Wechsele dann in dein PDF-Dokument (egal ob mit dem lahmen Acrobat Reader oder was vernünftigem :D ), markiere den zu übertragenen Text und mit STRG+ALT+C wird alles ohne Zeilenumbrüche in Excel eingefügt. Dann wird in Excel auf die nächste Zeile gewechselt. Dabei bleibt Excel selbstverständlich im Hintergrund. Du kannst also bequem, ohne dein PDF-Dokument zu verlassen, beliebig viele Passagen so an Excel übergeben.
    Bist du fertig, beendest du das Skript mit STRG+ALT+E und speicherst dein Excel. (auch das läßt sich bei Bedarf gleich noch per Skript ausführen ;) )

    [autoit]

    HotKeySet('^!c', '_ClipToExcel') ; Strg + Alt + c ==> Text im PDF kopieren und dann in Excel einfügen
    HotKeySet('^!e', 'ende') ; Strg + Alt + e ==> Ende
    Global $oExcel = ObjGet("", "Excel.Application")

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

    While True
    Sleep(100)
    WEnd

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

    Func _ClipToExcel()
    Send('^c')
    $oExcel.ActiveCell.Value = StringRegExpReplace(ClipGet(), @CRLF, ' ')
    $oExcel.ActiveCell.Offset(1, 0).Select
    EndFunc

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

    Func ende()
    Exit
    EndFunc

    [/autoit]