【问题标题】:Jaspersoft Report - net.sf.jasperreports.engine.JRException: net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expressionJaspersoft 报告 - net.sf.jasperreports.engine.JRException:net.sf.jasperreports.engine.fill.JRExpressionEvalException:评估表达式时出错
【发布时间】:2016-07-03 05:29:47
【问题描述】:

我正在使用 TIBCO Jaspersoft Studio-6.1.1.final。

我有一份报告,其中在 scriptlet 中添加了 java jar 文件以读取 doc 文件。

当我在 Jasper 报告中运行时,出现以下错误。

net.sf.jasperreports.engine.JRException: net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression for source text: $P{Read_DocFile_SCRIPTLET}.readline()
at com.jaspersoft.studio.editor.preview.view.control.ReportControler.fillReport(ReportControler.java:511)
at com.jaspersoft.studio.editor.preview.view.control.ReportControler.access$20(ReportControler.java:486)
at com.jaspersoft.studio.editor.preview.view.control.ReportControler$5.run(ReportControler.java:367)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)
Caused by: net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression for source text: $P{Read_DocFile_SCRIPTLET}.readline()
    at net.sf.jasperreports.engine.fill.JREvaluator.evaluate(JREvaluator.java:291)
    at net.sf.jasperreports.engine.fill.JRCalculator.evaluate(JRCalculator.java:618)
    at net.sf.jasperreports.engine.fill.JRCalculator.evaluate(JRCalculator.java:586)
    at net.sf.jasperreports.engine.fill.JRFillElement.evaluateExpression(JRFillElement.java:1015)
    at net.sf.jasperreports.engine.fill.JRFillTextField.evaluateText(JRFillTextField.java:568)
    at net.sf.jasperreports.engine.fill.JRFillTextField.evaluate(JRFillTextField.java:552)
    at net.sf.jasperreports.engine.fill.JRFillElementContainer.evaluate(JRFillElementContainer.java:281)
    at net.sf.jasperreports.engine.fill.JRFillBand.evaluate(JRFillBand.java:504)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillColumnBand(JRVerticalFiller.java:2029)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillDetail(JRVerticalFiller.java:755)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportStart(JRVerticalFiller.java:262)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:122)
    at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:555)
    at net.sf.jasperreports.engine.fill.BaseFillHandle$ReportFill.run(BaseFillHandle.java:119)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NoSuchMethodError: org.apache.poi.POIDocument: method <init>()V not found
    at org.apache.poi.hwpf.HWPFDocument.<init>(HWPFDocument.java:144)
    at org.apache.poi.hwpf.HWPFDocument.<init>(HWPFDocument.java:133)
    at com.Read_DocFile.readline(Read_DocFile.java:25)
    at Blank_

Java 文件有两个外部 jar 文件,我将它们添加到 lib 文件夹并在 Eclipse 中生成 jar 文件。

下面添加的Java代码

package com;

import java.io.*;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.extractor.WordExtractor;
import net.sf.jasperreports.engine.JRDefaultScriptlet;
import net.sf.jasperreports.engine.JRScriptletException;

public class ReadDocFile extends JRDefaultScriptlet {

  public String readline() throws JRScriptletException {
    File file = null;
    WordExtractor extractor = null;
    try {
      file = new File("C:\\Tempp\\RTF_view.doc");
      FileInputStream fis = new FileInputStream(file.getAbsolutePath());
      HWPFDocument document = new HWPFDocument(fis);
      extractor = new WordExtractor(document);
      String[] fileData = extractor.getParagraphText();
      for (int i = 0; i < fileData.length; i++) {
        if (fileData[i] != null)
          return fileData[i];     
      }
    } catch (Exception exep) {
        exep.printStackTrace();
    }   
    return "Hello! I'm the report's scriptlet object.";
  }
}

【问题讨论】:

    标签: java jasper-reports


    【解决方案1】:

    答案在您的堆栈跟踪中

    com.Read_DocFile.readline(Read_DocFile.java:25)
    
    java.lang.NoSuchMethodError: org.apache.poi.POIDocument: method <init>()V not found
    

    如果您的 IDE 中没有错误,请确保您在运行报告的位置部署了相同版本的类库 (POI)。

    问题:可能是不同版本的 poi 库(或类路径中具有不同版本的多个 POI)

    解决方法:使用相同的版本

    它到底在哪里加载 POI 类?

    ClassLoader classloader =
       org.apache.poi.poifs.filesystem.POIFSFileSystem.class.getClassLoader();
    URL res = classloader.getResource(
             "org/apache/poi/poifs/filesystem/POIFSFileSystem.class");
    String path = res.getPath();
    System.out.println("Core POI came from " + path);
    

    【讨论】:

    • 我在 Eclipse 的 lib 文件夹中添加了相同的 jar 文件,然后生成了 Read_DocFile jar 文件。我将此 jar 文件添加到 jasper report scriptlets 。下面是我的碧玉代码。
    • 注意你的类路径中现在可能有两个 POI 副本,将 catch (Exception exep) 更改为 catch (Throwable exep),你会发现这不是你的报告的问题...... ,但是类路径问题...
    • 我已经添加了一些代码(见答案的编辑,见鬼)所以你可以检查出来......
    • 我将您的代码添加到 java 类中。但是尝试 catch 块不执行。
    • 你还有在 org.apache.poi.hwpf.HWPFDocument.(HWPFDocument.java:144) 还是其他错误?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    相关资源
    最近更新 更多