🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Calc Addin mit Python - Parameterübergabe funktioniert nicht

Alles zur Programmierung im LibreOffice.
Antworten
hendrikm78
Beiträge: 3
Registriert: Mo 12. Okt 2015, 21:06

Calc Addin mit Python - Parameterübergabe funktioniert nicht

Beitrag von hendrikm78 » Mo 12. Okt 2015, 21:29

Hallo zusammen,

ich benötige mal eure Hilfe. Z. Zt. arbeite ich an einem Add-In, das mir Kurswerte von einer Webseite einliest. Es soll eine Funktion entstehen, an die die URL übergeben wird und der aktuell Kurs anschließend zurückgegeben wird.

Die Umsetung habe ich mit Python3 gemacht. Der Test in Python liefert auch die richtigen Ergebnisse. Die Installation in Calc funktioniert ebenfalls problemlos. Möchte ich jetzt die Funktion in einer Zelle einsetzen, gibt es im Funktions-Assistenten keine Möglichkeit einen Parameter zu übergeben, es erschient folgendes: (normalerweise sollte eine URL als String übergeben werden)

GETDOLLAR()

Als Rückgabewert erscheint Err:504

Anbei mal die Dateien, an denen meiner Meinung nach das Problem liegt. Sollte noch mehr benötigt werden, bitte kurze Info an mich.
Testweise habe ich die Funktion GETTEST eingebaut, auch diese funktioniert nicht.
Basis ist das Add-In "SMF-Extension", dies lies sich nach Anpassung der .idl-Datei Übersetzen.

Ich hoffe, Ihr könnt mir helfen.
Viele Grüße
Hendrik

Onvista.py

Code: Alles auswählen

import os
import sys
import inspect
import csv

import unohelper
from com.Onvista.ticker.getinfo import XOnvista

# Add current directory to path to import yahoo, morningstar and advfn modules
cmd_folder = os.path.realpath(os.path.abspath
                              (os.path.split(inspect.getfile
                                             ( inspect.currentframe() ))[0]))
if cmd_folder not in sys.path:
    sys.path.insert(0, cmd_folder)

import pyDollar
import pyKurs

class OnvistaImpl(unohelper.Base, XOnvista ):
    """Define the main class for the SMF extension """
    def __init__( self, ctx ):
        self.ctx = ctx

    def getKurs( self, a ):
        return pyKurs.getKurs( a )

    def getDollar( self, a ):
        return pyDollar.getDollar( a )
    
    def getTest( self ):
        return( "Test" )
    
    
def createInstance( ctx ):
    return OnvistaImp( ctx )

g_ImplementationHelper = unohelper.ImplementationHelper()
g_ImplementationHelper.addImplementation( \
    createInstance,"com.Onvista.ticker.getinfo.python.OnvistaImpl",
        ("com.sun.star.sheet.AddIn",),)

XOnvista.idl

Code: Alles auswählen

#ifndef INCLUDED_ORG_OPENOFFICE_SHEET_ADDIN_XCALCADDIN_IDL
#define INCLUDED_ORG_OPENOFFICE_SHEET_ADDIN_XCALCADDIN_IDL

#include <com/sun/star/beans/XPropertySet.idl>
#include <com/sun/star/sheet/AddIn.idl>

module com {
  module Onvista {
    module ticker {
      module getinfo {

    interface XOnvista
    {
      // Modeled as an 'any' to allow it to be NULL/None/Missing.
      any getDollar( [in] string a );
      any getKurs( [in] string a );
      any getTest( );
    };
    
    service Onvista
    {
        interface XOnvista;
        
        service com::sun::star::sheet::AddIn;
    };

}; }; }; };
#endif
Onvista.xcu

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8"?>
<oor:component-data xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema" oor:name="CalcAddIns" oor:package="org.openoffice.Office">
<node oor:name="AddInInfo">
  <node oor:name="com.Onvista.ticker.getinfo.python.OnvistaImpl" oor:op="replace">
    <node oor:name="AddInFunctions">
      <node oor:name="getDollar" oor:op="replace">
        <prop oor:name="DisplayName">
          <value xml:lang="en">getDollar</value>
        </prop>
        <prop oor:name="Description">
          <value xml:lang="en">Fetches Dollar-Kurs from Onvista.</value>
        </prop>
        <prop oor:name="Category">
          <value>Add-In</value>
        </prop>
        <prop oor:name="CompatibilityName">
          <value xml:lang="en">AutoAddIn.XOnvista.getDollar</value>
        </prop>
        <node oor:name="Parameters">
          <node oor:name="a" oor:op="replace">
            <prop oor:name="DisplayName">
              <value xml:lang="en">a</value>
            </prop>
            <prop oor:name="Description">
              <value xml:lang="en">The URL to the Onvista-Site</value>
            </prop>
          </node>
        </node>
      </node>
      <node oor:name="getKurs" oor:op="replace">
        <prop oor:name="DisplayName">
          <value xml:lang="en">getKurs</value>
        </prop>
        <prop oor:name="Description">
          <value xml:lang="en">Fetches Aktien-Kurs from Onvista.</value>
        </prop>
        <prop oor:name="Category">
          <value>Add-In</value>
        </prop>
        <prop oor:name="CompatibilityName">
          <value xml:lang="en">AutoAddIn.XOnvista.getKurs</value>
        </prop>
        <node oor:name="Parameters">
          <node oor:name="a" oor:op="replace">
            <prop oor:name="DisplayName">
              <value xml:lang="en">a</value>
            </prop>
            <prop oor:name="Description">
              <value xml:lang="en">The URL to the Onvista-Site</value>
            </prop>
          </node>
        </node>
      </node>
      <node oor:name="getTest" oor:op="replace">
        <prop oor:name="DisplayName">
          <value xml:lang="en">getTest</value>
        </prop>
        <prop oor:name="Description">
          <value xml:lang="en">Test-Function</value>
        </prop>
        <prop oor:name="Category">
          <value>Add-In</value>
        </prop>
        <prop oor:name="CompatibilityName">
          <value xml:lang="en">AutoAddIn.XOnvista.getTest</value>
        </prop>
        <node oor:name="Parameters">
          <node oor:name="" oor:op="replace">
            <prop oor:name="DisplayName">
              <value xml:lang="en"></value>
            </prop>
            <prop oor:name="Description">
              <value xml:lang="en"></value>
            </prop>
          </node>
        </node>
      </node>
    </node>
  </node>
</node>
</oor:component-data>
Libreoffice 4.3.3.2, Debian Testing

Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2539
Registriert: Fr 10. Dez 2010, 10:01

Re: Calc Addin mit Python - Parameterübergabe funktioniert nicht

Beitrag von karolus » Mo 12. Okt 2015, 23:49

Hallo

Die Hilfe liefert zu Err.504:
Libre-Hilfe hat geschrieben:504
Fehler in der Parameterliste
Der Funktionsparameter ist nicht gültig; z. B. Text anstelle einer Zahl oder ein Domänenbezug anstelle eines Zellbezugs.
Mit welches Argumenten rufst du die Funktion auf?

ansonsten, in der .idl fallen mir die drei Zeilen:

Code: Alles auswählen

    service Onvista
    {
        interface XOnvista;
       
        service com::sun::star::sheet::AddIn;
    };
auf, kannst du die mal testweise weglassen? (...und natürlich neu kompilieren )

der import-hook in der python datei ist auch nicht gerade übliche Praxis, steck die zu importierenden Module einfach in einen Unterordner namens `pythonpath` dann findet die normale import -maschinerie von LO die Module auch.

Dann kannst du auch die komplette .oxt hier anhängen, damit lässt sich dann leichter testen und verifizieren.
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

hendrikm78
Beiträge: 3
Registriert: Mo 12. Okt 2015, 21:06

[gelöst] Calc Addin mit Python - Parameterübergabe funktioniert nicht

Beitrag von hendrikm78 » Di 13. Okt 2015, 20:26

Hallo karolus,

danke für den Tipp mit den Import, funktioniert bestens.

Ich habe den (Tipp-)Fehler gefunden:

In der Onvista.py ist in der Funktion CreateInstance die return-Anweisung falsch. Richtig ist:

Code: Alles auswählen

def createInstance( ctx ):
    return OnvistaImpl( ctx )     #hier war der Fehler
Das l bei OnvistaImpl fehlte ... (Manchmal sieht man den Wald vor lauter Bäumen nicht.)
Hat mich 2 Tage genervt der Sapß.

Anbei noch der bereinigte und funktionierende Code.

Vielen Dank für die Hilfe.

PS: .oxt kann man hier nicht hochladen, keine Berechtigung.
Dateianhänge
Onvista_V0.2.0.zip
Inhalt: fertiges .oxt, Sourcen und Test.ods
(41.88 KiB) 274-mal heruntergeladen
Libreoffice 4.3.3.2, Debian Testing


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten