【问题标题】:how to add JRParagraph.DEFAULT_TAB_STOP_WIDTH before fill the report in Jasper如何在 Jasper 中填写报告之前添加 JRParagraph.DEFAULT_TAB_STOP_WIDTH
【发布时间】:2014-01-30 22:53:14
【问题描述】:

我正在根据用户输入动态生成 jrxml 文件并尝试填写报告。 它适用于某些情况。当用户添加更多列时,系统会抛出以下异常:

net.sf.jasperreports.engine.util.ParagraphUtil.getFirstTabStop(ParagraphUtil.java:208) 
net.sf.jasperreports.engine.fill.TextMeasurer.renderNextLine(TextMeasurer.java:1009) 
net.sf.jasperreports.engine.fill.TextMeasurer.renderParagraph(TextMeasurer.java:717) 
net.sf.jasperreports.engine.fill.TextMeasurer.measure(TextMeasurer.java:416) 
net.sf.jasperreports.engine.fill.JRFillTextElement.chopTextElement(JRFillTextElement.java:504) 
net.sf.jasperreports.engine.fill.JRFillTextField.prepare(JRFillTextField.java:593) 
net.sf.jasperreports.engine.fill.JRFillElementContainer.prepareElements(JRFillElementContainer.java:328) 
net.sf.jasperreports.engine.fill.JRFillBand.fill(JRFillBand.java:377) 
net.sf.jasperreports.engine.fill.JRFillBand.fill(JRFillBand.java:351) 
net.sf.jasperreports.engine.fill.JRVerticalFiller.fillColumnBand(JRVerticalFiller.java:2039) 
net.sf.jasperreports.engine.fill.JRVerticalFiller.fillDetail(JRVerticalFiller.java:771) 
net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportContent(JRVerticalFiller.java:301) 
net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:148) 
net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:909) 
net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:841) 
net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:88) 
net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:653) 
net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:634) 
net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:956)

我正在使用 JasperReports 4.7 库。

以下是填充和导出 jrxml 的 java 代码。

InputStream inputStream = null;
    JasperPrint jasperPrint = null;

    JExcelApiExporter  apiExporter = null;
    HashMap map = new HashMap();
    JRSwapFileVirtualizer virtualizer = null;

    try {

        inputStream = new FileInputStream(jasperFilePath);

        if (reportType.equals("REPORTGENERATOR")) {
            map.put(JRParameter.IS_IGNORE_PAGINATION, Boolean.TRUE);            
        }

        map.put("REALPATH", realPath);

        String directory = realPath+"tempdocs";
        JRSwapFile swapFile = new JRSwapFile(directory, 1024, 100);
        virtualizer = new JRSwapFileVirtualizer(50, swapFile, true);
        map.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);               
        jasperPrint = JasperFillManager.fillReport(inputStream, map, resultSetDataSource);


        apiExporter = new JExcelApiExporter();
        apiExporter.setParameter(JRXlsExporterParameter.IS_DETECT_CELL_TYPE, Boolean.TRUE);
        apiExporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE);
        apiExporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_COLUMNS, Boolean.TRUE);
        apiExporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
        apiExporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, 
                realPath + "tempdocs/jasper/" + reportName + ".xls");


        apiExporter.exportReport();

    } catch (Exception e) {
        e.printStackTrace();            
    }finally{
        try{
            if (virtualizer != null) virtualizer.cleanup();
            inputStream.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }

建议我处理这个问题的好方法。

【问题讨论】:

  • 您应该发布相关的 Java 代码以重现问题
  • 完整的堆栈跟踪是什么?

标签: java jasper-reports


【解决方案1】:

我已在查询的每个 varchar 列中使用 replace(col,chr(9),' ') 将制表符替换为空格。现在它工作正常。 但我知道这不是一个正确的答案。这只是一个解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多