LibreOffice calc mit python öffnen und Zeile darstellen

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
Alois
User
Beiträge: 16
Registriert: Dienstag 13. Dezember 2016, 14:45

Hallo Community,

ich möchte aus einer bestehenden LibreOfficeCalc-Datei (.ods) die Zeile X aus dem Tabellenblatt Y auslesen und mittels "print" in der Shell anzeigen lassen.

Dazu die erste Frage(n):
Welches Modul ist dazu zu empfehlen?

Wenn ich die Bezeichnung vom Modul weiß, dann könnte ich mich zumindest einmal in die richtige Doku einarbeiten.

Danke für Tipps

Viele Grüße
Alois
Ubuntu 14.04 / 16.04
Benutzeravatar
pixewakb
User
Beiträge: 1408
Registriert: Sonntag 24. April 2011, 19:43

[1] https://pypi.python.org/pypi/pyoo

[2] http://oosheet.hacklab.com.br/

[2] war ein Zufallstreffer. Ich habe mit beiden Bibliotheken keine Erfahrung und würde - an Deiner Stelle - einfach mal schauen, welche Syntax mir einfacher erscheint. Ich erinnere mich grob daran, dass bei einer (oder allen?) Bibliotheken LibreOffice geöffnet laufen musste. Es kann sein, dass LibreOffice auch nur im Hintergrund läuft, jedenfalls kann sich das geringfügig auf die Leistung Deines Systems auswirken.
Alois
User
Beiträge: 16
Registriert: Dienstag 13. Dezember 2016, 14:45

pixewakb hat geschrieben:[1] https://pypi.python.org/pypi/pyoo

[2] http://oosheet.hacklab.com.br/

[2] war ein Zufallstreffer. I...
Danke für die Tipps.

Habe oosheet-1.2 installiert https://pypi.python.org/pypi/oosheet/1.2

LibreOffice Calc ist geöffnet (über Shell):
libreoffice --calc --accept="socket,host=localhost,port=2002;urp;StarOffice.ServiceManager" &

Leider erscheint bei diesem Code http://oosheet.hacklab.com.br/using-oosheet.html

Code: Alles auswählen

from oosheet import OOSheet as S
S('a1').string = 'Hello world'
die Fehlermeldung:

Code: Alles auswählen

python3 oo.py
Traceback (most recent call last):
  File "oo.py", line 12, in <module>
    from oosheet import OOSheet as S
  File "<frozen importlib._bootstrap>", line 2237, in _find_and_load
  File "<frozen importlib._bootstrap>", line 2222, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 2164, in _find_spec
  File "<frozen importlib._bootstrap>", line 1940, in find_spec
  File "<frozen importlib._bootstrap>", line 1916, in _get_spec
  File "<frozen importlib._bootstrap>", line 1897, in _legacy_get_spec
  File "<frozen importlib._bootstrap>", line 863, in spec_from_loader
  File "<frozen importlib._bootstrap>", line 904, in spec_from_file_location
  File "/usr/local/lib/python3.4/dist-packages/oosheet-1.2-py3.4.egg/oosheet/__init__.py", line 166
    aDescriptor.Type = MODALTOP
                              ^
TabError: inconsistent use of tabs and spaces in indentation
Kann mir jemand weiter helfen?

pyoo habe ich auch probiert, bin jedoch ebenfalls gescheitert...

Viele Grüße
Alois
Ubuntu 14.04 / 16.04
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Alois: das Paket wird seit 6 Jahren nicht mehr weiterentwickelt und ist offensichtlich nicht für Python3.
Was ist mit pixewakb erstem Link?
Alois
User
Beiträge: 16
Registriert: Dienstag 13. Dezember 2016, 14:45

Sirius3 hat geschrieben:@Alois: das Paket wird seit 6 Jahren nicht mehr weiterentwickelt und ist offensichtlich nicht für Python3.
Was ist mit pixewakb erstem Link?
Hallo Sirius,

mit pyoo funktioniert es jetzt...
hatte wohl nicht alle Module installiert oder einen Fehler in der pyoo-Installation.

Werde mal das Skript zusammenbauen und dann posten...

Vielen Dank für die Hilfe

Viele Grüße
Alois
Ubuntu 14.04 / 16.04
Alois
User
Beiträge: 16
Registriert: Dienstag 13. Dezember 2016, 14:45

Hallo,

anbei mein fertiges Skript, vielleicht kann jemand etwas daraus gebrauchen:
  • Öffnen einer LibreOffice Calc Datei (.ods)
  • zufällige Auswahl einer Zeile (random)
  • Ausgabe der Zeile in der Shell
Viele Grüße und Danke für die Hilfe
Alois

Code: Alles auswählen

#!/usr/bin/python3
# -*- coding: utf-8 -*-

#Betriebssystem: Ubuntu 14.04

##### Installation von libreoffice-script-provider-python notwendig (anstatt python-uno):
# sudo apt-get install libreoffice-script-provider-python

##### Installation von pyoo 1.1
# https://pypi.python.org/pypi/pyoo
# im Verzeichnis entpackten Verzeichnis folgenden Befehl ausfuehren: sudo python3 setup.py install

##### libreoffice oeffnen: (Python-Skript funktioniert nur, wenn LibreOffice in der Shell geöffnet wird und kein "&" verwendet wird!)
# Shell oeffnen: Strg + Alt + T
# Calc oeffnen:  libreoffice --calc --accept="socket,host=localhost,port=2002;urp;StarOffice.ServiceManager"from 
# bzw. Shell-Skript ausfuehren: ./ods.sh
# weitere Shell oeffnen: Strg + Alt + T
# Python-Skript ausfuehren:  python3 ods.py

Pfad = "/Pfad/"	# Pfad zur ods-Datei
Dateiname = "Name.ods"				# Name der ods-Datei
Tabellenname = "Tabellennamen"					# Tabellenname
Zeile_max = 160							# max. Zeile

import pyoo, random

Zeile = random.randrange(0,Zeile_max)  # Zeile wird per Zufallsprinzip ermittelt, von 0 bis Zeile_max

desktop = pyoo.Desktop('localhost', 2002)
#doc = desktop.create_spreadsheet()	# leeres Dokument oeffen
doc = desktop.open_spreadsheet(Pfad+Dateiname)	# Dokument mit dem Namen xy oeffen

#sheet = doc.sheets['TabelleA']  # Name: TabelleA; oder Tabellennummer beginnend mit 0
sheet = doc.sheets[Tabellenname]
print (sheet[Zeile,0].value,sheet[Zeile,1].value,sheet[Zeile,2].value,sheet[Zeile,3].value)	# die ersten 4Spalten der Zeile ausgeben in der Shell
doc.close()	 # .ods-File wird wieder geschlossen
Ubuntu 14.04 / 16.04
karolus
User
Beiträge: 140
Registriert: Samstag 22. August 2009, 22:34

Hallo

Deine Kommentare im Code sind etwas irreführend.
`libreoffice-script-provider-python` wird benötigt um aus der grafischen Oberfläche von LibrOffice heraus python-code auszuführen.
es ist in den LO-paketen der (ubuntu)-distribution nicht "serienmässig" dabei.

`pyoo` solltest du schlicht per

Code: Alles auswählen

> pip3 install pyoo --user
installieren.

LibreOffice muss nicht in der shell gestartet werden, sondern so das externe Prosesse mit LO komunizieren können.
Ich mach das aus pragmatischen Gründen auch per python & subprocess ( und pipe statt socket ):

Code: Alles auswählen

from subprocess import Popen

officepath = 'soffice'
calc = '--calc'
pipe = "--accept=pipe,name=abraxas;urp;StarOffice.Servicemanager"

Popen([officepath,
       calc, 
       pipe]);

Um jetzt zu diesem laufenden LO-process "kontakt" aufzunehmen, nehme ich dann:

Code: Alles auswählen

import uno
from pythonscript import ScriptContext

local = uno.getComponentContext()
resolver = local.ServiceManager.createInstance("com.sun.star.bridge.UnoUrlResolver")


client = resolver.resolve( "uno:pipe,"
                           "name=abraxas;"
                           "urp;"
                           "StarOffice.ComponentContext")

createUnoService = client.ServiceManager.createInstance

(desktop,
 file_access,
 pathsubstitution,
 mri,
 pipe,
 textout,
 textin,
 contentfactory,
 core,
 intro) = map(   createUnoService,
                ("com.sun.star.frame.Desktop",
                 "com.sun.star.ucb.SimpleFileAccess",
                 "com.sun.star.util.PathSubstitution",
                 "mytools.Mri",
                 "com.sun.star.io.Pipe",
                 "com.sun.star.io.TextOutputStream",
                 "com.sun.star.io.TextInputStream",
                 "com.sun.star.frame.TransientDocumentsDocumentContentFactory",
                 "com.sun.star.reflection.CoreReflection",
                 "com.sun.star.beans.Introspection" )
             )
# die Liste hier oben ist nicht zwingend nötig, sondern nur als Beispiel gedacht.

XSCRIPTCONTEXT = ScriptContext(client, None, None)
Im Kontext einer ipython|jupyter notebook sitzung hab ich dann durch die letzte Zeile weitestgehend den gleichen Namensraum wie aus LO heraus ausgeführt.
Alois
User
Beiträge: 16
Registriert: Dienstag 13. Dezember 2016, 14:45

Hallo karolus,

danke für dein Feedback.
Dein Vorschlag mit pipe klappt bei mir nicht.

Zuerst führe ich dieses Skript aus:

Code: Alles auswählen

#!/usr/bin/python3
# -*- coding: utf-8 -*-


from subprocess import Popen
 
officepath = 'soffice'
calc = '--calc'
pipe = "--accept=pipe,name=abraxas;urp;StarOffice.Servicemanager"
 
Popen([officepath,
       calc,
       pipe]);
danach dieses Skript:

Code: Alles auswählen

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import uno
from pythonscript import ScriptContext
 
local = uno.getComponentContext()
resolver = local.ServiceManager.createInstance("com.sun.star.bridge.UnoUrlResolver")
 
 
client = resolver.resolve( "uno:pipe,"
                           "name=abraxas;"
                           "urp;"
                           "StarOffice.ComponentContext")
 
createUnoService = client.ServiceManager.createInstance
 
(desktop,
 file_access,
 pathsubstitution,
 mri,
 pipe,
 textout,
 textin,
 contentfactory,
 core,
 intro) = map(   createUnoService,
                ("com.sun.star.frame.Desktop",
                 "com.sun.star.ucb.SimpleFileAccess",
                 "com.sun.star.util.PathSubstitution",
                 "mytools.Mri",
                 "com.sun.star.io.Pipe",
                 "com.sun.star.io.TextOutputStream",
                 "com.sun.star.io.TextInputStream",
                 "com.sun.star.frame.TransientDocumentsDocumentContentFactory",
                 "com.sun.star.reflection.CoreReflection",
                 "com.sun.star.beans.Introspection" )
             )
# die Liste hier oben ist nicht zwingend nötig, sondern nur als Beispiel gedacht.
 
XSCRIPTCONTEXT = ScriptContext(client, None, None)

Code: Alles auswählen

Traceback (most recent call last):
  File "Links/test2.py", line 5, in <module>
    from pythonscript import ScriptContext
  File "/usr/lib/python3/dist-packages/uno.py", line 342, in _uno_import
    raise uno_import_exc
  File "/usr/lib/python3/dist-packages/uno.py", line 268, in _uno_import
    return _g_delegatee( name, *optargs, **kwargs )
ImportError: No module named 'pythonscript' (or 'pythonscript.ScriptContext' is unknown)
Muss ich zuvor pythonscript installieren?
Wenn ja, wie geht das?

Viele Grüße
Alois
Ubuntu 14.04 / 16.04
karolus
User
Beiträge: 140
Registriert: Samstag 22. August 2009, 22:34

Hallo
Muss ich zuvor pythonscript installieren?
Wenn ja, wie geht das?

Code: Alles auswählen

>> sudo apt-get install libreoffice-script-provider-python
Entgegen meiner Aussage im letzten Beitrag wird wird es auch hier benötigt.


Apropos:

Code: Alles auswählen

pipe = "--accept=pipe,name=abraxas;
Könntest du dich dazu entschliessen deiner pipe einen anderen Namen zu geben…?
Alois
User
Beiträge: 16
Registriert: Dienstag 13. Dezember 2016, 14:45

ok super.

Habe mir ein Bash-Skript erstellt, dass die beiden Python-Skripte nacheinander ausführt, incl. kleiner Pause (sleep):

Code: Alles auswählen

bash random.sh
mit:

Code: Alles auswählen

python3 ~/Links/open_LibreOfficeCalc.py && sleep 2s && python3 ~/Links/random_PVgl.py 
mit open_LibreOfficeCalc.py:

Code: Alles auswählen

#!/usr/bin/python3
# -*- coding: utf-8 -*-


from subprocess import Popen
 
officepath = 'soffice'
calc = '--calc'
pipe = "--accept=pipe,name=pipename;urp;StarOffice.Servicemanager"
 
Popen([officepath,
       calc,
       pipe]);
und mit random_PVgl.py:

Code: Alles auswählen

#!/usr/bin/python3
# -*- coding: utf-8 -*-

Pfad = "/Pfad/"	# Pfad zur ods-Datei
Dateiname = "Datei.ods"				# Name der ods-Datei
Tabellenname = "Tabellenname"					# Tabellenname
Zeile_max = 160							# max. Zeile

import pyoo, random

Zeile = random.randrange(0,Zeile_max)  # Zeile wird per Zufallsprinzip ermittelt, von 0 bis Zeile_max
#pyoo.Desktop(pipe='hello')
#desktop = pyoo.Desktop('localhost', 2002)
desktop = pyoo.Desktop(pipe='pipename')
#doc = desktop.create_spreadsheet()	# leeres Dokument oeffen
doc = desktop.open_spreadsheet(Pfad+Dateiname)	# Dokument mit dem Namen xy oeffen

#sheet = doc.sheets['TabelleA']  # Name: TabelleA; oder Tabellennummer beginnend mit 0
sheet = doc.sheets[Tabellenname]
print (sheet[Zeile,0].value,sheet[Zeile,1].value,sheet[Zeile,2].value,sheet[Zeile,3].value)	# die ersten 4Spalten der Zeile ausgeben in der Shell
doc.close()	 # .ods-File wird wieder geschlossen
Vielen Dank für die Mithilfe
Alois
Ubuntu 14.04 / 16.04
karolus
User
Beiträge: 140
Registriert: Samstag 22. August 2009, 22:34

Hallo

Darf man fragen wozu du das benötigst?

Soweit ich das sehe hättest du auch genausogut dein Tabellenblatt als .csv exportieren können, um dann die Aufgabenstellung in unter 10 Zeilen Code abzuhaken.
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Und wie ist das bei LibreOffice Writer, also mit einem leeren Blatt?
Denn scheinbar wird auf der Seite "https://pypi.org/project/pyoo/" nur über Tabellen geredet.
Benutzeravatar
pixewakb
User
Beiträge: 1408
Registriert: Sonntag 24. April 2011, 19:43

Du müsstest mal schauen, m. E. ist die Unterstützung für MS Office Komponenten besser, die du dann aber auch mit LO öffnen kannst. Ich würde es da mal versuchen, falls niemand sonst mehr antwortet. pyoo scheint wohl tatsächlich nur Calc zu unterstützen.
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Schade, denn ich möchte das auf meinem Raspberry Pi laufen lassen und da gibts kein MS Office.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@xXSkyWalkerXx1: Ein Writer Dokument erstellen zu wollen passt nicht so wirklich zum Titel dieses (alten) Themas. Vielleicht wäre so eine Frage in einem eigenen Thema besser aufgehoben.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten