如果你使用 Jxls,你应该使用最近发布的 Jxls-2。如果您需要创建动态列,Jxls-2 具有更好的性能和更灵活的功能。检查Jxls 演示项目中的动态列示例,该示例显示了如何使用Jxls-2生成动态列的示例。
该示例使用XML 配置来构建Jxls 命令,但您也可以使用 Java API 或 Excel 标记来构建它们。
XML 配置如下所示
<xls>
<area ref="Template!A1:B4">
<each items="headers" var="header" ref="Template!A3:A3" dir="RIGHT">
<area ref="Template!A3:A3"/>
</each>
<each items="rows" var="row" ref="Template!A4:A4">
<area ref="Template!A4:A4">
<each items="row" var="cell" ref="Template!A4:A4" dir="RIGHT">
<area ref="Template!A4:A4"/>
</each>
</area>
</each>
</area>
</xls>
在这种情况下,模板 Excel 文件非常简单,仅在 2 个单元格中包含一个标记(用于标题和数据):
${header}
${cell}
java代码读取模板并构建XlsArea进行处理
InputStream is = DynamicColumnsDemo.class.getResourceAsStream(TEMPLATE);
OutputStream os = new FileOutputStream(OUTPUT);
Transformer transformer = TransformerFactory.createTransformer(is, os);
InputStream configInputStream = DynamicColumnsDemo.class.getResourceAsStream(DYNAMIC_COLUMNS_DEMO_XML_CONFIG);
AreaBuilder areaBuilder = new XmlAreaBuilder(configInputStream, transformer);
List<Area> xlsAreaList = areaBuilder.build();
Area xlsArea = xlsAreaList.get(0);
接下来,它将所需的数据设置到上下文中并将转换应用于源区域
// creating context
Context context = transformer.createInitialContext();
context.putVar("headers", headers);
context.putVar("rows", rows);
// applying transformation
logger.info("Applying area " + xlsArea.getAreaRef() + " at cell " + new CellRef("Result!A1"));
xlsArea.applyAt(new CellRef("Result!A1"), context);
转换的结果是一个表格,其中填充了表格标题、列和行的动态数据值。