[英]Apache POI Excel Table-TotalsRow
在编写将结果集导出到Excel的工具时,我遇到了一个问题。 我成功创建了带有格式和列标题上的过滤器的表,那里没有问题。 问题是我不知道如何使总行“有效”。 我想使用真实的总行,以便它们对应用的过滤器做出响应,但是到目前为止,我可以得到具有功能但不属于表的小计的行,或者可以得到空白的小计行。
我相信必须有一些魔术,例如公式求值器或类似的东西,但是我还没有在javadocs或示例代码中发现它。 我在此位置使用代码进行了以下修改。 在设置列标题的循环内:
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并在打开Excel时可以使用。 我相信这仍然是POI中的错误,但是我需要快速修复,这对我来说确实有用。
注意:我意识到这是一篇非常古老的文章,但以防万一将来有人遇到同样的问题时正在寻找解决方案...
您的路线正确,但我看不到要在实际总行中的单元格上应用公式的位置。 如果未设置,则总行将显示,但在打开文件时为空。
创建表格时
cttable.setTotalsRowShown(true);
cttable.setTotalsRowCount(1);
cttable.addNewAutoFilter();
创建列时
column.setTotalsRowFunction(STTotalsRowFunctionImpl.COUNT);
填充所有表数据后
Row totalsRow = sheet.createRow(tableLastRow);
Cell totalsCell = totalsRow.createCell(lastColumnPosition);
totalsCell.setCellFormula("SUBTOTAL(103,MYTABLE[Human])");
您将必须填充tableLastRow和lastColumnPosition以获取特定于代码的值。 这对我适用于Apache POI 3.17和Excel 2016。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.