gpt4 book ai didi

java - Apache POI Excel 表格-TotalsRow

转载 作者:数据小太阳 更新时间:2023-10-29 01:56:28 26 4
gpt4 key购买 nike

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

我相信一定有一些神奇的东西,比如公式计算器或类似的东西,但我还没有在 javadoc 或示例代码中偶然发现它。我正在使用 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>

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

最佳答案

如果我为命名空间使用正确的完整 URI,只要我不尝试使用 POI 计算公式,工作簿就会保存并且一切正常。我使用工作簿 setForceFormulaRecalculation on 并且它在打开 Excel 时工作。我认为这仍然是 POI 中的一个错误,但我需要快速修复,这对我来说已经完成了。

关于java - Apache POI Excel 表格-TotalsRow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32949171/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com