在POI中合并后设置值到单元格

时间:2013-12-19 07:33:50

标签: java apache-poi

我想在POI中形成如下的Excel输出:

enter image description here

从图像中可以清楚地看到,我分别在Header3,Header4和Header5下有3个子列。

列表如下:

ListA - 包含A列的值

ListB - 包含B列的值

List1 - 是每行3列的数据库行列表。第一列将在Header3下,第二列在Header 4下,第三列在Header 5下,即C,F和I列。

List2和List3 - 类似于List1,每个值分别位于Header3,4和5下。列表2位于列D,G和J下,List3位于列E,H和K下。

问题1:

我将标题名称存储为具有5个值的列表。

如何迭代此列表以将值分配给合并区域?

我正在做类似下面但却无法正常工作的事情:

// first two headers

for (int i = 0; i < headers.size() - 3; i++) {
            headerCell = headerRow.createCell(i);
            headerCell.setCellValue(allHeaders.get(i).toUpperCase());
            headerCell.setCellStyle(styles.get("header"));
        }

// Merging
sheet.addMergedRegion(org.apache.poi.ss.util.CellRangeAddress.valueOf("$C$1:$E$1"));
sheet.addMergedRegion(org.apache.poi.ss.util.CellRangeAddress.valueOf("$F$1:$H$1"));
sheet.addMergedRegion(org.apache.poi.ss.util.CellRangeAddress.valueOf("$I$1:$K$1"));

for (int i = 3; i < headers.size(); i++) {
            headerCell = headerRow.createCell(i);
            headerCell.setCellValue(allHeaders.get(i).toUpperCase());
            headerCell.setCellStyle(styles.get("header"));
        }

问题2:

如何通过List3迭代ListA以输入值,如上所述?

感谢阅读!

1 个答案:

答案 0 :(得分:9)

实际上我并不完全理解你的问题,但我认为一些关键点对你有所帮助。

  1. 合并区域的第一个单元格保留合并单元格的值,其余单元格保持空白值。意味着如果单元格A2到A5与值“Test”合并,那么在迭代A2上将显示“Test”,而rest将显示为空白。因此,如果要读取合并的单元格值,则需要仅读取其第一个单元格,类似地,如果要在合并的单元格中写入,则只需要在第一个单元格中写入。

  2. sheet.getNumMergedRegions();返回整数,该整数将是工作表中合并区域的总数。你也可以使用循环遍历它。

  3. CellRangeAddress merge = sheet.getMergedRegion(int index);将为您提供从getNumMergedRegions()

  4. 获取的指定索引的范围地址
  5. 现在merge.getFirstRow()merge.getLastRow()merge.getFirstColumn()merge.getLastColumn()merge.getNumberOfCells()是相同的方法。

  6. 包含合并单元格的行的迭代和不包含任何合并单元格的行没有太大区别。希望这能帮助您解决问题。