Excel导出另一个工作表引用错误

时间:2015-10-16 09:26:28

标签: excel apache-poi birt

我正在研究BIRT报告。在这里我可以使用spudsoft发射器导出到Excel时成功导出Excel公式,该发射器默认使用BIRT。问题是,当我从另一张纸张中引用纸张时,它会抛出错误。就像在BIRT报告中一样,我有两个表:第一个表名是table1,第二个表名是table2(这个名称用作表名)第一个表总是有pagebreak,所以将创建两个表。当我将其导出到Excel时,Excel报表成功创建了两个表'table1'和'table2'(没有引用另一个工作表的公式)。

当table1(sheet1)的一列从table2(sheet2)引用时,它引用并导出报告成功。

示例-1      table2中的一列引用table1列的值(B,该table2 dataelement onRender事件的代码是

if((reportContext.getRenderOption().outputFormat == "xlsx" )||(reportContext.getRenderOption().outputFormat == "XLSX"))
{
    p  = row.__rownum;
    this.text="table1!B"+prow;
}

它正确导出并引用table1值。

但是当从table1引用table2的列时,这次它会抛出error.Sheet index(-1)超出范围(0..0)

示例-2- table1中的一列引用table2列(C)的值,该table1 dataelement onRender事件的代码是

if((reportContext.getRenderOption().outputFormat == "xlsx" )||(reportContext.getRenderOption().outputFormat == "XLSX"))
{
    p  = row.__rownum;
    this.text="table2!C"+prow;
}

我的假设是当生成table1时,表table2不可用。如果这是正确的假设,那么我的解决方案是在渲染时改变元素的顺序(我不知道可能性)。

导出的Excel工作表中的错误是:

Caused by: java.lang.IllegalArgumentException: Sheet index (-1) is out of range (0..0) at org.apache.poi.xssf.usermodel.XSSFWorkbook.validateSheetIndex(XSSFWorkbook.java:1043) at org.apache.poi.xssf.usermodel.XSSFWorkbook.getSheetName(XSSFWorkbook.java:876) at org.apache.poi.xssf.usermodel.XSSFEvaluationWorkbook.getSheetNameByExternSheet(XSSFEvaluationWorkbook.java:135) at org.apache.poi.xssf.usermodel.helpers.XSSFFormulaUtils$1.getSheetNameByExternSheet(XSSFFormulaUtils.java:81) at org.apache.poi.ss.formula.ptg.ExternSheetNameResolver.prependSheetName(ExternSheetNameResolver.java:42) at org.apache.poi.ss.formula.ptg.Ref3DPtg.toFormulaString(Ref3DPtg.java:91) at org.apache.poi.ss.formula.FormulaRenderer.toFormulaString(FormulaRenderer.java:92) at org.apache.poi.xssf.usermodel.helpers.XSSFFormulaUtils.updateFormula(XSSFFormulaUtils.java:126) at org.apache.poi.xssf.usermodel.helpers.XSSFFormulaUtils.updateSheetName(XSSFFormulaUtils.java:106) at org.apache.poi.xssf.usermodel.XSSFWorkbook.setSheetName(XSSFWorkbook.java:1230) at uk.co.spudsoft.birt.emitters.excel.handlers.PageHandler.endPage(PageHandler.java:225) at uk.co.spudsoft.birt.emitters.excel.ExcelEmitter.endPage(ExcelEmitter.java:296) at org.eclipse.birt.report.engine.emitter.ContentEmitterUtil.endContent(ContentEmitterUtil.java:102) at org.eclipse.birt.report.engine.layout.html.buffer.DummyPageBuffer.endContainer(DummyPageBuffer.java:61) at org.eclipse.birt.report.engine.layout.html.HTMLPageLM.end(HTMLPageLM.java:183) at org.eclipse.birt.report.engine.layout.html.HTMLPageLM.layout(HTMLPageLM.java:98) at org.eclipse.birt.report.engine.layout.html.HTMLReportLayoutEngine.layout(HTMLReportLayoutEngine.java:100) at org.eclipse.birt.report.engine.api.impl.RenderTask$PageRangeRender.render(RenderTask.java:717) at org.eclipse.birt.report.engine.api.impl.RenderTask.render(RenderTask.java:321) ... 39 more

问题是当sheet1在生成时它引用了sheet2,此时sheet2不可用,所以抛出了错误,但是我们可以在生成阶段和渲染阶段更改元素执行的顺序回滚到以前的职位。

我无法更改订单,因为首先应显示sheet1,然后才显示sheet2。

有关BIRT中我的问题的任何想法吗?

0 个答案:

没有答案