Как сделать так, чтобы объединенные ячейки группировали соответствующие ячейки из другого столбца? - PullRequest
0 голосов
/ 09 мая 2020

Имеется 2 столбца: столбец Key и столбец предложения. Теперь в ключевом столбце объединены некоторые ячейки. А в столбце «Предложение» все они находятся в отдельных ячейках.

В приведенном ниже примере k1 и k5 являются объединенными ячейками.

    | Key  | Sentence |
    | ---- | -------- |
    |  k1  |    s1    |
    |      |    s2    |
    |      |    s3    |
    |  k2  |    s4    |
    |  k3  |    s5    |
    |  k4  |    s6    |
    |  k5  |    s7    |
    |      |    s8    |
    |  k6  |    s9    |

Мне нужно, чтобы ключ и предложение стали значениями пары ключей для моего файла xml, который у меня уже есть идея по части xml.

Я знаю, что мы можем использовать HashMap или LinkedHashMap для пар ключ-значение. Однако мне сложно объединить ячейки столбца «Предложение» как 1 ячейку (значение) по отношению к ключу.

Как мы можем сгруппировать ячейки в столбце «Предложение», чтобы они соответствовали их соответствующей ячейке в столбце «Ключ»?

Я могу прочитать файл Excel через POI. Я просто застрял в этой части. Я также искал ответы, похожие на мою проблему, но я мог найти только ответы, которые не связаны между собой, но каким-то образом дали мне идеи.

образец изображения проблемы Excel

1 Ответ

1 голос
/ 09 мая 2020

Для объединенных ячеек содержимое ячейки помещается в первую (верхнюю левую) ячейку объединенной области. Все остальные объединенные ячейки пусты. Итак, основной лог c здесь:

Если ключ, полученный из ключевого столбца, не пуст, значит, возник новый ключ. В противном случае предложения, полученные из столбца предложений, принадлежат последнему полученному ключу.

Если известны ключевой столбец и столбец предложения, а также первая и последняя строка, то будет работать следующее:

Указанный лист :

enter image description here

Код:

import org.apache.poi.ss.usermodel.*;

import java.io.FileInputStream;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.LinkedHashMap;

class ReadExcelKeySentence {

 static Map<String, List<String>> getKeysAndSentences(Sheet sheet, DataFormatter formatter, FormulaEvaluator evaluator, 
                                   int keyColumn, int sentenceColumn, int firstRow, int lastRow) {

  Map<String, List<String>> keysAndSentences = new LinkedHashMap<String, List<String>>();
  List<String> sentences = new ArrayList<String>();

  Row row; 
  Cell cell;
  String key;
  String sentence;
  for (int r = firstRow; r <= lastRow; r++) {
   row = sheet.getRow(r); if (row == null) row = sheet.createRow(r);
   cell = row.getCell(keyColumn); if (cell == null) cell = row.createCell(keyColumn);
   key = formatter.formatCellValue(cell, evaluator);
   cell = row.getCell(sentenceColumn); if (cell == null) cell = row.createCell(sentenceColumn);
   sentence = formatter.formatCellValue(cell, evaluator);
   if (!"".equals(key)) {
    sentences = new ArrayList<String>();
    sentences.add(sentence);
    keysAndSentences.put(key, sentences);
   } else {
    sentences.add(sentence);
   }
  }

  return keysAndSentences;
 }

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

  Workbook workbook = WorkbookFactory.create(new FileInputStream("./Excel.xlsx"));
  //Workbook workbook = WorkbookFactory.create(new FileInputStream("./Excel.xls"));
  DataFormatter formatter = new DataFormatter();
  FormulaEvaluator evaluator =  workbook.getCreationHelper().createFormulaEvaluator();
  Sheet sheet = workbook.getSheetAt(0);

  Map<String, List<String>> keysAndSentences = getKeysAndSentences(sheet, formatter, evaluator, 1, 2, 1, 9);

  System.out.println(keysAndSentences);

  workbook.close();
 }
}

Производит:

{k1=[s1, s2, s3], k2=[s4], k3=[s5], k4=[s6], k5=[s7, s8], k6=[s9]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...