微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – Apache POI Excel Table-TotalsRow

在编写将结果集导出到Excel的工具时,我遇到了一个问题.我在列标题上成功创建了带格式和过滤器的表,没问题.问题是我无法弄清楚如何使总行“工作”.我想使用真正的总行数,以便它们响应所应用的过滤器,但到目前为止,我可以获得一个包含函数但不是表的一部分的小计的行,或者我可以得到一个空白的小计行.

我相信必须有一些魔法,比如公式评估器或类似的东西,但我还没有在javadocs或示例代码中偶然发现它.我在this location使用代码进行了以下修改.在设置列标题的循环内:

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

然后在循环之外:

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

没有运气,如果我为总计添加一个空白行,它将被格式化为表格的一部分,但没有值显示.如果我为公式中的任何一个单元格设置公式,但Excel不喜欢该表并删除总行,尽管公式在那里并且有效,而不是作为总行.

当我查看下面的原始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文件生成以下内容

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

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

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

如果我手动编辑存档中的工作表并删除命名空间标记或限定符,它就可以工作!我没有看到如何在不保存工作簿的情况下解决NS问题,然后继续打开它并修复文件IO的问题.有人对此有任何暗示吗?

解决方法:

如果我为命名空间使用正确的完整URI,那么只要我不尝试使用POI评估公式,工作簿就会保存并且一切都很好.我使用工作簿setForceFormulaRecalculation,它在Excel打开时有效.它仍然是我认为的POI中的一个错误,但我需要一个快速修复,这对我来说.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。