Apache POI Excel表格-总行

6
在编写将结果集导出到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问题的方法。有没有人有任何提示?

2个回答

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

2

注意:我知道这是一个非常旧的帖子,但以防将来有人遇到与我刚遇到的同样问题寻找解决方案...

你走在了正确的轨道上,但我没有看到你在实际总行中应用公式到单元格。如果你不设置这个,打开文件后总行将存在但为空。

创建表格时

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。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接