This blog has moved to
http://blog.matthias-reining.com

Die bestehenden Artikel bleiben vorerst alle bei blogspot. Neue Artikel veröffentliche ich allerdings nur noch auf http://blog.matthias-reining.com

Freitag, 2. Juli 2010

POI - SVERWEIS und die Exception Unexpected eval type (org.apache.poi.hssf.record.formula.eval.MissingArgEval)


Seit ein paar Tagen gibt es etwas neues von der POI API – Seit 20. Juni 2010 die Version POI 3.7 beta 1.

Die ersten Experimente haben hiermit perfekt funktioniert! J

Nachdem ich allerdings einen SVERWEIS (englisch : VLOOKUP) verwendet habe und ein abhängiges Feld per POI API neu berechnen lassen habe, ist folgender Fehler aufgetreten:

java.lang.RuntimeException: Unexpected eval type (org.apache.poi.hssf.record.formula.eval.MissingArgEval)
       at org.apache.poi.hssf.record.formula.functions.LookupUtils.resolveRangeLookupArg(LookupUtils.java:422)
       at org.apache.poi.hssf.record.formula.functions.Vlookup.evaluate(Vlookup.java:57)
       at org.apache.poi.hssf.record.formula.functions.Var3or4ArgFunction.evaluate(Var3or4ArgFunction.java:36)
       at org.apache.poi.ss.formula.OperationEvaluatorFactory.evaluate(OperationEvaluatorFactory.java:132)
       …

Der Fehler ist an folgender Stelle aufgetreten:
...
FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
HSSFRow row = sheet.getRow(7);
HSSFCell cell = row.getCell(1);
CellValue cellValue = evaluator.evaluate(cell);
...

Die Ursache hierfür ist, dass ich im Excelsheet die Formel mit dem SVERWEIS per Autocomplete erstellt habe. Der letzte Parameter des Befehls SVERWEIS „Bereich_Verweis“ wird dann mit WAHR bzw. FALSCH per Autocomplete gefüllt. Wenn man sich dann die Formel allerdings nochmal genauer anschaut, stellt man fest, dass der letzte Parameter bei WAHR einfach nicht geschrieben wird. Excel arbeitet mit einem Defaultwert.

Die POI API kommt hiermit aber nicht zurecht! Hier muss der Parameter Bereich_Verweis explizit gesetzt werden. Für WAHR muss hier eine 1 gesetzt werden.

Anschließend funktioniert die Berechnung auch wieder einwandfrei J

Kommentare:

  1. Hallo,

    habe zur Zeit folgendes Problem:
    Wenn ich mit POI .evaluate aufrufe, berechnet er bei nahezu alle Zellen einer Spalte die richtigen Werte. Bei ein paar allerdings kommt #WERT (#VALUE) als Antwort.
    Hast du Erfahrungen damit ,das es evtl. etwas mit SVERWEIS zu tun hat? Auf eine SVERWEIS Spalte zeigt meine Formel.

    Wenn ich in Excel die Datei öffne, sehe ich auch erst #WERT, wenn Excel allerdings fertig gerechnet hat, wird der Wert korrekt dargestellt.
    Wie gesagt, nur bei ein paar Zeilen einer Spalte. Der Großteil der Spalten funktioniert richtig.

    AntwortenLöschen
  2. Hallo,
    diese Erfahrung habe ich bisher noch nicht gemacht.
    Allerdings kann man die Berechnung der Formeln mit der POI API relativ gut debuggen (Nachdem's OpenSource ist, kann man die Sourcen ja einfach downloaden...).
    Vielleicht bringt dies ja Aufschluss darüber...
    Was allerdings merkwürdig ist, dass du das Verhalten auch in Excel beobachten kannst...

    Ist aber kein Macro nach dem Öffnen oder so aktivert? Dies wird von der POI API natürlich nicht ausgeführt...

    Falls mir hier noch was auffällt schreib ich eine kurze Notiz dazu...

    Grüße, Matthias

    AntwortenLöschen