Jaspersoft Report - net.sf.jasperreports.engine.JRException:net.sf.jasperreports.engine.fill.JRExpressionEvalException:评估表达式时出错

时间:2015-11-17 08:30:31

标签: java jasper-reports

我使用的是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.";
  }
}

1 个答案:

答案 0 :(得分:0)

答案在你的stacktrace

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);