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

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
pixewakb
User
Beiträge: 1413
Registriert: Sonntag 24. April 2011, 19:43

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?
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

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.
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

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.
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Wie hast du es denn gelöst?
Nimmst du jetzt Qt?
Benutzeravatar
pixewakb
User
Beiträge: 1413
Registriert: Sonntag 24. April 2011, 19:43

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...
Antworten