Seite 1 von 1

Calc Addin mit Python - Parameterübergabe funktioniert nicht

Verfasst: Mo 12. Okt 2015, 21:29
von hendrikm78
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>

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

Verfasst: Mo 12. Okt 2015, 23:49
von karolus
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.

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

Verfasst: Di 13. Okt 2015, 20:26
von hendrikm78
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.