none
geschicktes Handling von Daten in der Zwischenablage RRS feed

  • Frage

  • Einen wunderschönen guten Tag,

    leider schlage ich mich nun schon seit Tagen mit dem Problem herum, Daten aus der Zwischenablage in eine DataGridView-Tabelle einzufügen. Grundsätzlich komme ich natürlich an die Daten mit der Klasse [System.Windows.Forms.Clipboard] heran, doch kann ich mit dem Output der GetText()-Methode nicht so viel anfangen. Der OutPut bringt mit nur Strings pro Zeile, wobei ich eigentlich gehofft hatte, z.B. beim kopieren von Matrizen in Excel, auf die Spalten und Zeilen einzeln zugreifen zu können. Dadurch hätte ich diese dann auch leicht in die Spalten und Zeilen meines DataGridView einfügen können.
    Aktuell muss ich mir den OutPut von GetTex() per Split-Methode mühevoll zerlegen und sukzessive in mein DataGridView einfügen, was recht "lange" dauert.

    Gibt es denn nicht vielleicht eine einfachere Möglichkeit, auf die Spalten und Zeilen "Struktur" in der Zwischenablage zuzugreifen?

    viele Grüße und besten Dank

    Donnerstag, 4. Dezember 2014 12:43

Antworten

  • Hallo noppsen!

    Warum greifst du nicht mit PowerShell und COM direkt auf die Excel Tapete zu ?

    Das was du hier beschreibst hat nur noch im entferntesten mit PowerShell zu tun.

    Du benutzt .NET klassen und muss dann natürlich auch bei den .NET (C#) Programmierern suchen!

    Der in der folgenden suche bringt der erste Treffer schon die Antwort:

    http://lmgtfy.com/?q=c%23+clipboard+from+excel+

    Die Office Anwendungen legen Object Linking and Embedding (OLE) COM Objekte in den Zwischenspeicher. Für dich sieht das nur aus wie Text, weil das transparent umgewandelt wird.

    $dataObject = [System.Windows.Forms.Clipboard]::GetDataObject()
    $mstream = [System.IO.MemoryStream]$dataObject.GetData('XML Spreadsheet')
    
    # Note: For some reason we need to ignore the last byte otherwise
    # an exception will occur...
    $mstream.SetLength($mstream.Length - 1)
    
    $xml = [System.XML.Linq.XElement]::Load($mstream)
    
    $xml

    oder du erstellst dir unsichtbar im Speicher eine eigen Excel Tapete und fügst das dort ein, dann kannst du wieder Zellen adressieren.

    $ExlApp = New-Object -ComObject Excel.Application
    $WrkB = $ExlApp.Workbooks.Add()
    $WrkS = $WrkB.Worksheets.Add()
    $WrkS.Paste()
    # in Zelle A2 steht ein Wert den ich auslese
    $WrkS.Cells.Item(2,1).Value2



    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Donnerstag, 4. Dezember 2014 14:30

Alle Antworten

  • Hallo noppsen!

    Warum greifst du nicht mit PowerShell und COM direkt auf die Excel Tapete zu ?

    Das was du hier beschreibst hat nur noch im entferntesten mit PowerShell zu tun.

    Du benutzt .NET klassen und muss dann natürlich auch bei den .NET (C#) Programmierern suchen!

    Der in der folgenden suche bringt der erste Treffer schon die Antwort:

    http://lmgtfy.com/?q=c%23+clipboard+from+excel+

    Die Office Anwendungen legen Object Linking and Embedding (OLE) COM Objekte in den Zwischenspeicher. Für dich sieht das nur aus wie Text, weil das transparent umgewandelt wird.

    $dataObject = [System.Windows.Forms.Clipboard]::GetDataObject()
    $mstream = [System.IO.MemoryStream]$dataObject.GetData('XML Spreadsheet')
    
    # Note: For some reason we need to ignore the last byte otherwise
    # an exception will occur...
    $mstream.SetLength($mstream.Length - 1)
    
    $xml = [System.XML.Linq.XElement]::Load($mstream)
    
    $xml

    oder du erstellst dir unsichtbar im Speicher eine eigen Excel Tapete und fügst das dort ein, dann kannst du wieder Zellen adressieren.

    $ExlApp = New-Object -ComObject Excel.Application
    $WrkB = $ExlApp.Workbooks.Add()
    $WrkS = $WrkB.Worksheets.Add()
    $WrkS.Paste()
    # in Zelle A2 steht ein Wert den ich auslese
    $WrkS.Cells.Item(2,1).Value2



    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Donnerstag, 4. Dezember 2014 14:30
  • Hallo Peter,

    vielen Dank für deine schnelle Antwort und die Vorschläge. Bitte entschuldige auch, wenn ich hier u.U. an der falschen Stelle nachgefragt habe. Der Grund dafür ist, dass ich zwar ein kleiner Powershell-Fan bin und allerlei kleine Tools damit bau (learning by doing) aber es in das Gesamtkonstrukt .Net/C# noch nicht exakt einordnen konnte, weil ich von Haus aus leider auch kein Programmierer bin.

    Die direkte Handhabung und Steuerung von Excel über COM-Objekte ist mir geläufig. Wenn ich die Excel-Applikation kenne, aus der ich Daten abfragen will, ist das kein Problem. In meinem Fall kann ich damit aber nicht arbeiten, da Daten nur z.B. aus Excel aber auch aus anderen Quellen in die Zwischenablage gelegt werden können. Deine lmgtfy-Variante oben werde ich ausprobieren und hoffe somit die "Struktur" der Informationen in der Zwischenablage besser zu verstehen und dann damit auch besser arbeiten zu können.

    Ich gebe dir dann gern noch einmal Feedback zum Erfolg :) - soweit erstmal aber schon jetzt besten Dank

    noppsen

    Montag, 8. Dezember 2014 08:46
  • hallo Noppsen!

    Alles kein Problem, Foren sind dazu da Fragen zu stellen und jeder sucht sich aus ob er eine Frage beantworten möchte oder nicht. ;-)

    Wie du schon sagtest ist die Zwischenablage so etwas wie eine Blackbox.
    Irgend jemand legt etwas hinein und du muss hinein greifen und weißt nicht was drin ist.
    Dabei kann man sich die Finger verbrennen, das muss durch intelligente Programmierung abgefangen werden.
    Leider kenne ich auch keinen Mechanismus um die Zwischenablage abzufragen, welcher Objekt Typ in ihm abgelegt wird.
    Hier hilft nur Versuch und Irrtum.
    Man muss versuchen die Daten von der Zwischenablage in den Speziellen Typen umzuwandeln , den man benötigt (hier z.B. Excel Workbook). Dabei muss man die Fehler abfangen, die beim Umwandeln passieren, wenn die Umwandlung fehlschlägt.
    Wenn die Umwandlung fehlschlägt versucht man in einen allgemeineren Typen wie z.B. String (Text) umzuwandeln und muss dann mit diesem weiterarbeiten.
    Aber auch hier kannst du nur Vermutungen über die Struktur der Daten anstellen.
    Dein String (Text) kann ein Fliesstext aus einem Roman sein oder ein Text aus einer Tabelle mit einer Zeilen und Spalten Struktur und einem Trennzeichen. Das heißt, dein Code muss die Struktur des Strings (Text) analysieren oder der Code nimmt erst mal eine Struktur an und wenn die Struktur nicht vorhanden ist dann ..... Pech ... ist es Fließtext oder was anderes und du kannst die Daten nicht verwerten.

    Gruß Peter 



    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Montag, 8. Dezember 2014 09:18