首页 > 解决方案 > 如何在 apache-poi 中对 sheet.getMergedRegions() 的结果进行排序

问题描述

我使用了 apache poi 的 getMergedRegions() 函数,它返回一个 cellRangeAddresses 列表。然而,结果似乎杂乱无章。

        List<CellRangeAddress> cellRangeAddressList = sheet.getMergedRegions();

这给出了以下结果:

[org.apache.poi.ss.util.CellRangeAddress [C2:C5],org.apache.poi.ss.util.CellRangeAddress [B2:B5],org.apache.poi.ss.util.CellRangeAddress [A2:A5 ], [org.apache.poi.ss.util.CellRangeAddress [C6:C9], org.apache.poi.ss.util.CellRangeAddress [B6:B9], org.apache.poi.ss.util.CellRangeAddress [A6 :A9], ]org.apache.poi.ss.util.CellRangeAddress [C10:C13], org.apache.poi.ss.util.CellRangeAddress [B10:B13], org.apache.poi.ss.util.CellRangeAddress [A10:A13]]

结果的顺序对我的代码没有帮助。我希望订单是

[org.apache.poi.ss.util.CellRangeAddress [A2:A5],org.apache.poi.ss.util.CellRangeAddress [B2:B5],org.apache.poi.ss.util.CellRangeAddress [C2:C5 ], [org.apache.poi.ss.util.CellRangeAddress [A6:A9], org.apache.poi.ss.util.CellRangeAddress [B6:B9], org.apache.poi.ss.util.CellRangeAddress [C6 :C9], ]org.apache.poi.ss.util.CellRangeAddress [A10:A13], org.apache.poi.ss.util.CellRangeAddress [B10:B13], org.apache.poi.ss.util.CellRangeAddress [C10:C13]]

有什么办法可以得到这个吗?

标签: javasortingapache-poi

解决方案


Sheet.getMergedRegions按添加的顺序获取合并的区域。但是当然有Collections.sort可以List使用给定的给定排序Comparator

所以主要任务是定义那个Comparator

工作草案:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.ss.util.*;

import java.util.List;
import java.util.Collections;

class ExcelMergedRegions {

 public static void main(String[] args) throws Exception {

  Workbook workbook  = new XSSFWorkbook();
  Sheet sheet = workbook.createSheet();

  sheet.addMergedRegion(new CellRangeAddress(1,4,2,2)); //C2:C5
  sheet.addMergedRegion(new CellRangeAddress(1,4,1,1)); //B2:B5
  sheet.addMergedRegion(new CellRangeAddress(1,4,0,0)); //A2:A5
  sheet.addMergedRegion(new CellRangeAddress(5,8,2,2)); //C6:C9
  sheet.addMergedRegion(new CellRangeAddress(5,8,1,1)); //B6:B9
  sheet.addMergedRegion(new CellRangeAddress(5,8,0,0)); //A6:A9
  sheet.addMergedRegion(new CellRangeAddress(9,12,2,2)); //C10:C13
  sheet.addMergedRegion(new CellRangeAddress(9,12,0,0)); //A10:A13

  sheet.addMergedRegion(new CellRangeAddress(1,5,3,4)); //D2:E6
  sheet.addMergedRegion(new CellRangeAddress(2,2,5,7)); //F3:H3

  List<CellRangeAddress> cellRangeAddressList = sheet.getMergedRegions();
  System.out.println(cellRangeAddressList);

  System.out.println("Sorted list:");

  Collections.sort(cellRangeAddressList, new CellRangeAddressComperator());
  System.out.println(cellRangeAddressList);

 }

 static class CellRangeAddressComperator implements java.util.Comparator<CellRangeAddress> {
  public int compare(CellRangeAddress o1, CellRangeAddress o2) {
   int r = 0;
   // first compare first rows
   r = o1.getFirstRow() - o2.getFirstRow();
   if (r != 0 ) return r;
   // if first rows are equal, compare first columns
   r = o1.getFirstColumn() - o2.getFirstColumn();
   if (r != 0 ) return r;
   // if first rows and first columns are equal, compare last rows
   r = o1.getLastRow() - o2.getLastRow();
   if (r != 0 ) return r;
   // if even last rows are equal, compare last columns
   r = o1.getLastColumn() - o2.getLastColumn();
   if (r != 0 ) return r;
   // if all is equal, return 0
   return r;
  }
 }
}

我希望我的Comparator定义对所有可能的情况都有意义。但是,如果没有,您应该能够对其进行改进。使用 a 的方法Comparator绝对是正确的。


推荐阅读