Hallo
Die oben verlinkte Exceldatei funktioniert in OOo auch nach diversen Anpassungen im Code nicht.
Aber:
Hier gibts ein paar Beispiele aus Calc heraus Python-funktionen zu nutzen.
Im Basic-Module benötigst du zusätzlich :
Code: Alles auswählen
Function geoinfo( addresse )
sURL = URL_Main & "geoinfo" & URL_Args
oMSP = getMasterScriptProvider()
oScript = oMSP.getScript(sURL)
x = oScript.invoke(Array( addresse ),Array(),Array())
geoinfo = x
end Function
im Pythonscript ist es leider nicht unbedingt plattformunabhängig:
Code: Alles auswählen
# -*- coding: utf-8 -*-
import re ,urllib
wrapper = uno.createUnoStruct('com.sun.star.script.ArrayWrapper')
wrapper.IsZeroIndex = False
geourl ="""http://local.yahooapis.com/MapsService/V1/geocode?appid=XXXXXXXXX&location={0:}""".format
pat = re.compile(r'''(?:Result precision="|Latitude>|Longitude>|Address>|City>)(.+?)(?:">|</Latitude|</Longitude|</Address|</City)''' )
def geoinfo( adresse ):
request = urllib.urlopen(geourl( adresse ))
xml = request.read().decode('utf8')
request.close()
relist = pat.findall(xml)
## ! für die Rückgabe in mehrere Zellen (als Arrayformel ) die nächsten 3 Zeilen entkommentieren ! ##
#relist = tuple((elem.encode('utf8'),) for elem in relist)
#wrapper.Array = relist
#return wrapper
### ! und die folgende Zeile auskommentieren ! ###
return '\n'.join( relist )
Die obere Funktion ist plattformunabhängig liefert aber mit der OOoPython version stillschweigend kein Ergebnis.
Die Funktion unten funktioniert hier unter Linux auch direkt aus Calc, ist aber wahrscheinlich nicht plattformunabhängig weil sie hässlicherweise die xml-daten nicht mit python-eigenen Modulen holt, sondern das Kommandozeilentool "w3m" benutzt.
Auf den meisten "Linux"en dürfte das aber entweder schon dabei sein oder einfachst zu installieren.
Wenn ich Google glauben darf gibts auch für Windows "w3m"
Code: Alles auswählen
# -*- coding: utf-8 -*-
import re
from subprocess import Popen, PIPE
wrapper = uno.createUnoStruct('com.sun.star.script.ArrayWrapper')
wrapper.IsZeroIndex = False
geourl ="""http://local.yahooapis.com/MapsService/V1/geocode?appid=XXXXXXXXX&location={0:}""".format
pat = re.compile(r'''(?:Result precision="|Latitude>|Longitude>|Address>|City>)(.+?)(?:">|</Latitude|</Longitude|</Address|</City)''' )
def geoinfo( adresse ):
request = Popen(["w3m" ,"-dump", geourl( "%s" % adresse.encode('utf8') )],stdout=PIPE).communicate()[0]
xml = request.decode('utf8')
relist = pat.findall(xml)
relist = [elem.encode('utf8') for elem in relist]
#relist = [(elem,) for elem in relist]
#wrapper.Array = tuple(relist)
return '\n'.join( relist )#wrapper
Ps.
Wenn du eigentlich eine Datenbank aufbauen willst aus vielen ( > 100 < 10000 Einzeladressen ),
würde ich :
1. die Einzeladressen einfach zeilenweise in eine Textdatei schreiben.
2. das obere Pythonscript anpassen, sodass es die Textdatei zeilenweise an die Funktion "geoinfo" übergibt und die Rückgabe ebenso in eine neue Ausgabedatei schreibt.
Die Ausgabedatei kannst du dann als "Datenbank" in Calc einbinden.
Gruß Karo