Как динамически объединять ячейки в API 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

Ответ 1

Я не уверен, поможет ли это. Но вот моя идея

  • Создайте файл, как показано выше, а затем сохраните файл
  • Перезагрузите файл с помощью apache POI, а затем выполните свою логику, чтобы объединить необходимые ячейки. POI имеет функцию ниже, которую я использовал

Вы можете использовать sheet.addMergedRegion(rowFrom,rowTo,colFrom,colTo); из библиотеки POI

Я никогда не работал над Jxlx, но похоже, что у них нет этой функции.

Ответ 2

Я делаю пользовательскую команду jx:each-merge для выполнения операций автоматического слияния. Но нужно обращать внимание на то, что я использую org.jxls:jxls:2.4.2, org.jxls:jxls-poi:1.0.13 и имеющий структуру данных основного раздела (означает, что данные были сгруппированы ранее). Вы можете увидеть шаблон и полученный результат из приведенного ниже рисунка: введите описание изображения здесь

Пример кода

:

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'},
      ...
    ]
  },
  ...
]

Надеюсь, что это будет полезно.