Seite 1 von 1

Inhalt in die Zwischenablage kopieren und dann in eine Tabelle in LO Writer einfügen

Verfasst: Dienstag 11. Februar 2020, 22:07
von pixewakb
In LibreOffice Writer kann ich Inhalt in eine Tabelle schreiben, dann die Zellen markieren und in die Zwischenablage kopieren und an anderer Stelle einfügen und LO Writer erkennt den Inhalt weiterhin als Tabelleninhalt und teilt ihn auf Zellen auf. Dieses Verhalten möchte ich gern kopieren und Daten für das Einfügen in eine Tabelle in LO Writer präparieren, dass LO die Inhalte wiederum auf Zellen aufteilt.

Im Netz gab es dazu leider ein Posting, aber keine Antwort.

Ich habe versucht:

Code: Alles auswählen

>>> import clipboard
>>> clipboard.paste()
'1\r\n2\r\n3\r\n4\r\n'
>>> content = clipboard.paste()
>>> clipboard.copy(content)
Man erkennt, wie LO die Daten für die Zwischenablage vorbereitet, wenn ich die Daten aus LO kopiere und dann wieder von Python in die Zwischenablage lege, dann geht leider die Struktur der Daten verloren und ich gebe in LO eine Liste mit 4 Elementen (mit Absätzen) ein, die in einer Zelle (!) einfach nur untereinander erscheinen.

Meine Idee/Vermutung: Ich vermute, dass LO in die Zwischenablage die Repräsentation packt, die ich dort auslesen kann und sich wiederum intern jeweils bei jedem Kopieren in die Zwischenablage merkt, was es dort abgelegt hat und dabei intern anders repräsentiert, so dass bei einem Einfügen nicht der Inhalt aus der Zwischenablage verwendet wird, sondern das, was LO sich gemerkt hat. Ich habe mal ein Word-Dokument genommen und von dort eine Tabelle nach Writer kopiert und kam bei der selben Liste mit Absätzen in einer Zelle aus.

Liege ich richtig?

Re: Inhalt in die Zwischenablage kopieren und dann in eine Tabelle in LO Writer einfügen

Verfasst: Dienstag 11. Februar 2020, 22:27
von sparrow
Welches OS?
Ist ein bisschen her, dass ich etwas mit dem Clipboard gemacht habe, aber ich nahm damals Qt. In der Zwischenablage steht, vor allem bei Windows, nicht nur Text sondern unter anderem ein MimeType, damit das aufrufende Programm weiß, was da kommt.

Re: Inhalt in die Zwischenablage kopieren und dann in eine Tabelle in LO Writer einfügen

Verfasst: Mittwoch 12. Februar 2020, 08:54
von sparrow
Das hier sollte dir helfen:

Code: Alles auswählen

import sys
from PyQt5.Qt import QApplication

if __name__ == "__main__":
    app = QApplication(sys.argv)
    print("Text:", app.clipboard().text())
    print("MimeData:", app.clipboard().mimeData().html())
Die Text-Repräsentation scheint nur die kleinstmögliche Darstellungslösung zu sein. Damit kannst du deine Tabelle dann auch in einem Editor einfügen.
LibreOffice schmeißt den Kram im HTML-Format in die Zwischenablage. Das heißt, dass du das auch tun kannst, wenn du eine Tabelle in der Zwischenablage haben möchtest, die man einfach in LibreOffice Writer einfügen kann. Du musst ihm dann aber sagen, dass das HTML und nicht Text ist, damit LibreOffice das entsprechend verarbeiten kann. Sonst würde der HTML-Formattext eingefügt werden (was ja in bestimmten Situationen auch sinnvoll ist.)
Mit Qt kannst du ein QMimeData-Objekt erstellen, das nimmt mit set_html() HTML-Quelltext an und setzt den MimeType korrekt. QClipboard kennt dann setMimeData() um das in die Zwischenablage zu tun.
An eine Instanz von QClipboard kommst du, indem du auf einem beliebigen QObject clipboard() aufrufst.

Die wichtigen klassen in Qt: QClipboard und QMimeData.

Wie das bei der von dir verwendeten Bibliothek für die Zwischenablage ist, weiß ich leider nicht. Möglicherweise unterstützt sie nur Plain-Text.

Edit:
Und weil heute so ein wundervoller Tag ist und ich das gerade spannend fand:

Code: Alles auswählen

import sys
from PyQt5.Qt import QApplication, QMimeData

HTML = """
<html>
 <table>
  <tr>
    <td><b>Spalte 1</b></td>
    <td><b>Spalte 2</b></td>
  </tr>
  <tr>
    <td>Olaf</td>
    <td>Klaus</td>
  </tr>
 </table>
</html>
"""

if __name__ == "__main__":
    app = QApplication(sys.argv)
    data = QMimeData()
    data.setHtml(HTML)
    app.clipboard().setMimeData(data)
    print("Text:", app.clipboard().text())
    print("MimeData:", app.clipboard().mimeData().html())
Das kann man dann einfach einfügen.


Edit 2:
Wenn clipboard aus pipy verwendest, verwendet das intern einfach nur pyperclip und da steht:
Currently only handles plaintext.
Dann wird das damit nicht gehen.

Re: Inhalt in die Zwischenablage kopieren und dann in eine Tabelle in LO Writer einfügen

Verfasst: Donnerstag 13. Februar 2020, 20:20
von pixewakb
Danke, das hat mir weitergeholfen!

Re: Inhalt in die Zwischenablage kopieren und dann in eine Tabelle in LO Writer einfügen

Verfasst: Donnerstag 13. Februar 2020, 21:07
von sparrow
Wie hast du es denn gelöst?
Nimmst du jetzt Qt?

Re: Inhalt in die Zwischenablage kopieren und dann in eine Tabelle in LO Writer einfügen

Verfasst: Donnerstag 13. Februar 2020, 21:24
von pixewakb
Jepp. Ich habe eine HTML-Seite, die Daten ausspuckt, allerdings nicht zum Download anbietet. Im Kern geht es darum, dass man den Inhalt der Seite herauskopiert, in ein Fenster einfügt, bereinigen lässt und dann wieder herauskopiert. Ich habe das mit plaintext umgesetzt, allerdings sind die Daten (Liste) eigentlich für das Einfügen in Tabellen von Word- oder Writer-Dokumente vorgesehen. Es wäre von Vorteil, wenn LO Writer oder Word dann HTML-Daten bekommen, die Tabelle erkennen und direkt richtig übernehmen. Das würde in dem Prozess einen Arbeitsschritt ersparen helfen...