在编写将结果集导出到Excel的工具时,我遇到了一个问题。我成功地创建了带有格式和列标题过滤器的表格,没有问题。问题是我无法弄清楚如何使总行“起作用”。我想使用真正的总行,以便它们响应应用的过滤器,但到目前为止,我只能得到一个包含子总计的行,虽然其功能正常,但并不属于表格,或者我可以得到一个空的小计行。
我相信必须有一些魔法,比如公式求值器或类似的东西,但我还没有在javadocs或示例代码中发现它。我正在使用此位置上的代码,并进行以下修改。在设置列标题的循环内部:
然后在循环外部:
在sheet1.xml文件中,将生成以下内容:
如果我使用createElement("f"),那么我就会得到:
我相信必须有一些魔法,比如公式求值器或类似的东西,但我还没有在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问题的方法。有没有人有任何提示?