如何在转换模板中的JXLS API中动态合并单元格

时间:2013-04-10 09:18:23

标签: java excel jxl jxls

我正在使用Jxls API

我现在可以创建,将数据列表传递给模板,根据需要创建excel输出表

但现在我必须合并带有相同值的列单元格

对于重复细胞的每个标签,这是我的

<jx:forEach items="${dummyData}" var="dummy" groupBy="col1">
<jx:forEach items="${group.items}" var="myList123">
${myList123.col1} ${myList123.col2} ${myList123.col3} ${myList123.col4} ${myList123.col5} ${myList123.col6} ${myList123.col7}
</jx:forEach>
</jx:forEach>

WHAT I HAve

WHAT I WANT

2 个答案:

答案 0 :(得分:4)

我不确定这是否会有所帮助。但这是我的想法

  1. 生成上面显示的文件,然后保存文件
  2. 使用apache POI重新加载文件,然后实现逻辑以合并所需的单元格。 POI具有以下我用过的功能
  3. 您可以使用POI库中的sheet.addMergedRegion(rowFrom,rowTo,colFrom,colTo);

    我从未参与过Jxlx,但看起来他们没有这个功能。

答案 1 :(得分:1)

我创建了一个自定义jx:each-merge命令来执行自动合并操作。但需要注意我正在使用org.jxls:jxls:2.4.2org.jxls:jxls-poi:1.0.13并且具有主子数据结构(意味着数据已经按之前分组)。 您可以从下面的图片中看到模板和渲染结果: enter image description here

代码示例:

public void xls() throws Exception {
  // from template
  InputStream template = getClass().getClassLoader().getResourceAsStream("templates/each-merge.xls");

  // output to
  File out = new File("target/each-merge-result.xls");
  if (out.exists()) out.delete();
  OutputStream output = new FileOutputStream(out);

  // template data
  Map<String, Object> data = generateData();

  // render
  JxlsUtils.renderTemplate(template, data, output);

  // verify
  assertThat(out.exists(), is(true));
  assertThat(out.getTotalSpace() > 0, is(true));
}

您可以从github项目simter-jxls-ext获取源代码。测试类为EachMergeCommandTest.java

数据结构是:

[
  {
    sn: 1, 
    name: 'row1',
    subs: [
      {sn: '1-1', name: 'row1sub1'},
      ...
    ]
  },
  ...
]

希望这有用。