| | |
| | | } else { |
| | | merge = false; |
| | | if (x1 > 0) { |
| | | sheet.addMergedRegion(new CellRangeAddress((x1 - 1), x2, y, y)); |
| | | // 检查是否与现有合并区域重叠,如果有则删除旧区域,再合并新区域 |
| | | CellRangeAddress newRegion = new CellRangeAddress((x1 - 1), x2, y, y); |
| | | handleOverlappingRegions(sheet, newRegion); |
| | | } |
| | | x1 = 0; |
| | | x2 = 0; |
| | | } |
| | | } |
| | | if (x1 > 0) { |
| | | sheet.addMergedRegion(new CellRangeAddress((x1 - 1), x2, y, y)); |
| | | // 检查是否与现有合并区域重叠,如果有则删除旧区域,再合并新区域 |
| | | CellRangeAddress newRegion = new CellRangeAddress((x1 - 1), x2, y, y); |
| | | handleOverlappingRegions(sheet, newRegion); |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 检查是否与现有合并区域重叠,如果有则删除旧区域,再合并新区域 |
| | | * @param sheet Excel工作表 |
| | | * @param newRegion 新的合并区域 |
| | | */ |
| | | private static void handleOverlappingRegions(Sheet sheet, CellRangeAddress newRegion) { |
| | | // 移除重叠的现有区域 |
| | | List<CellRangeAddress> overlappingRegions = new ArrayList<>(); |
| | | for (int i = sheet.getNumMergedRegions() - 1; i >= 0; i--) { |
| | | CellRangeAddress existingRegion = sheet.getMergedRegion(i); |
| | | if (newRegion.intersects(existingRegion)) { |
| | | overlappingRegions.add(existingRegion); |
| | | sheet.removeMergedRegion(i); |
| | | } |
| | | } |
| | | // 合并到新区域(这里简单地将它们添加到新的合并区域列表中,实际应用中可能需要更复杂的逻辑来真正“合并”区域) |
| | | // 注意:POI的CellRangeAddress没有提供直接合并两个区域的方法,所以这里只是示例 |
| | | // 如果需要真正的合并,可能需要自定义逻辑来计算新的边界 |
| | | for (CellRangeAddress overlappingRegion : overlappingRegions) { |
| | | sheet.addMergedRegion(overlappingRegion); |
| | | } |
| | | sheet.addMergedRegion(newRegion); |
| | | } |
| | | |
| | | |
| | | private static void write(HttpServletResponse response, SXSSFWorkbook book, String fileName) throws IOException { |
| | | response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); |
| | | response.setCharacterEncoding("utf-8"); |