JXLS 不写处理后的 JEXL

JXLS not writing the processed JEXL

按照他们网站上的示例,http://jxls.sourceforge.net/getting_started.html。尝试写入处理后的文件时遇到问题。它没有写入应由 JEXL 替换的数据,而是简单地再次写入模板文件,就好像它只是复制和粘贴模板文件一样。

这是我的模板文件的样子:

这是它的输出:

我的代码与指南几乎相同,所以我不确定为什么我的代码与他们的不同。我更改了一件事可能会影响它,那就是使用 createInitialContext() 而不是 getInitialContext()。这样做的原因是因为出于某种原因我的 jar 不包含 getInitialContext() 方法,即使这两个 jar 是相同的 (2.0.0),但是它确实包含 createInitialContext() 方法。从我的调试来看,代码确实处理了数据并用正确的数据替换了 JEXL,因为 xls 区域的大小从 4 变为 63。

我的代码:

InputStream is = getClass().getResourceAsStream("/transactions_template.xls");
OutputStream os = new FileOutputStream(file);
Transformer transformer = TransformerFactory.createTransformer(is, os);
AreaBuilder areaBuilder = new XlsCommentAreaBuilder(transformer);
List<Area> xlsAreaList = areaBuilder.build();
Area xlsArea = xlsAreaList.get(0);
Context context = transformer.createInitialContext();
context.putVar("transactions", transactions);
xlsArea.applyAt(new CellRef("Result!A1"), context);
transformer.write();
is.close();
os.close();

TLDR:JXLS 似乎处理 JEXL,但它写入模板文件。我确实将原始指南中的 getInitialContext 更改为 createInitialContext,因为 createInitialContext 不在我的版本中,即使该指南使用我的版本 2.0.0.

你检查过生成的Excel文档的结果工作sheet了吗?

Getting Started guide 中的示例不更改模板 sheet,只是在 Result sheet 处生成所有输出,如CellRef 参数传递给 applyAt 方法

xlsArea.applyAt(new CellRef("Result!A1"), context);

如果你想用数据填充模板 sheet 你应该提供一个合适的 CellRefapplyAt 方法。例如,如果你的模板 sheet 被命名为 Template 你应该有这样的东西

xlsArea.applyAt(new CellRef("Template!A1"), context);