Как мне отсортировать результат sheet.getMergedRegions () в apache-poi - PullRequest
0 голосов
/ 13 октября 2019

Я использовал функцию getMergedRegions () apache poi, которая возвращает список 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]]

Можно ли как-нибудь это получить?

1 Ответ

2 голосов
/ 13 октября 2019

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 имеет смысл для всех возможных случаев. Но если нет, то вы сможете уточнить это. Подход с использованием Comparator определенно является правильным.

...