package org.embulk.parser.poi_excel.visitor.util; import java.util.Map; import java.util.TreeMap; import java.util.concurrent.ConcurrentHashMap; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.util.CellRangeAddress; public class MergedRegionMap { private final Map>> sheetMap = new ConcurrentHashMap<>(); public CellRangeAddress get(Sheet sheet, int rowIndex, int columnIndex) { Map> rowMap = sheetMap.get(sheet); if (rowMap == null) { synchronized (sheet) { rowMap = createRowMap(sheet); sheetMap.put(sheet, rowMap); } } Map columnMap = rowMap.get(rowIndex); if (columnMap == null) { return null; } return columnMap.get(columnIndex); } protected Map> createRowMap(Sheet sheet) { Map> rowMap = new TreeMap<>(); for (int i = sheet.getNumMergedRegions() - 1; i >= 0; i--) { CellRangeAddress region = sheet.getMergedRegion(i); for (int r = region.getFirstRow(); r <= region.getLastRow(); r++) { Map columnMap = rowMap.get(r); if (columnMap == null) { columnMap = new TreeMap<>(); rowMap.put(r, columnMap); } for (int c = region.getFirstColumn(); c <= region.getLastColumn(); c++) { columnMap.put(c, region); } } } return rowMap; } }