Apache POI Excel Table-TotalsRow

在编写一个工具将结果集导出到Excel时遇到了一个问题。 我成功地创build了列标题上的格式和filter表,没有问题。 问题是我不知道如何使总行“工作”。 我想要使​​用真正的总行数,以便它们对所应用的filter作出响应,但是到目前为止,我可以获得一个带有小计的行,但不是表格的一部分,或者我可以得到一个空白的小计行。

我相信一定有一些魔法,比如公式评估器或类似的东西,但是我还没有在javadocs或者示例代码中find它。 我正在使用此位置的代码进行以下修改。 在设置列标题的循环中:

if(i == 0) column.setTotalsRowLabel("Totals:"); else column.setTotalsRowFunction(STTotalsRowFunctionImpl.COUNT); 

然后在循环之外:

 cttable.setTotalsRowShown(true); cttable.setTotalsRowCount(1); 

没有运气,如果我为总数添加一个空行,它被格式化为表的一部分,但没有值显示。 如果我为任何总单元格设置公式,公式可以工作,但Excel不喜欢该表并删除总行,尽pipe公式在那里工作,而不是作为总行。

当我查看下面的原始XML时,它与表格的Excel表格几乎没有区别,而工作表却有很大的不同。

更新:我已经离开了这个项目很长一段时间了,最​​近又回头了。 我已经放弃了POI自动执行此操作,转而尝试通过DOM操作来后门程序。

我如此接近,我不能放弃。 这一切都归结到最终工作表中的命名空间问题。 此代码:

 Element b = (Element) wb.getSheetAt(0).getCTWorksheet().getSheetData().getRowList().get(4).getCArray()[3].getDomNode(); Element f = b.getOwnerDocument().createElementNS("main", "f"); b.removeAttribute("t"); b.removeChild(b.getElementsByTagName("v").item(0)); f.appendChild(b.getOwnerDocument().createTextNode("SUBTOTAL(103,MYTABLE[Human])")); b.appendChild(f); 

在sheet1.xml文件中产生以下内容:

 <cr="D5"> <main:f>SUBTOTAL(103,MYTABLE[Human])</f> </c> 

如果我使用createElement(“f”),我会得到:

 <cr="D5"> <f xmlns="">SUBTOTAL(103,MYTABLE[Human])</f> </c> 

如果我手动编辑存档内的工作表,并删除名称空间标记或限定符,它的工作原理! 我看不到如何解决NS问题,而不保存工作簿,然后继续打开它并修复文件IO的问题。 有没有人有任何提示呢?

如果我为命名空间使用正确的完整URI,那么只要不尝试使用POI评估公式,工作簿就会保存并且一切正常。 我使用工作簿setForceFormulaRecalculation上,并打开Excel时它工作。 我相信这仍然是POI中的一个bug,但我需要一个快速修复,这对我来说是这样。