[JAVA] [Apache POI] Jugement des cellules inutiles

introduction

Lors du chargement d'Excel à l'aide d'Apache POI, je voulais ignorer les cellules barrées et masquées, j'ai donc essayé de savoir comment le faire. Je vais l'écrire comme mon propre mémo, mais veuillez vous y référer si vous le souhaitez.

Mokuji

  1. Matrice cachée (https://qiita.com/milestone/items/8fef7ec91bab31354fdb#1-%E9%9D%9E%E8%A1%A8%E7%A4%BA%E8%A1%8C%E5 % 88% 97)
  2. [Jugement des lignes cachées](https://qiita.com/milestone/items/8fef7ec91bab31354fdb#1-%E9%9D%9E%E8%A1%A8%E7%A4%BA%E8%A1%8C % E3% 81% AE% E5% 88% A4% E5% AE% 9A)
  3. [Jugement des colonnes cachées](https://qiita.com/milestone/items/8fef7ec91bab31354fdb#2-%E9%9D%9E%E8%A1%A8%E7%A4%BA%E5%88%97 % E3% 81% AE% E5% 88% A4% E5% AE% 9A )
  4. Annulation
  5. [Il y a un barré dans toute la cellule](https://qiita.com/milestone/items/8fef7ec91bab31354fdb#1-%E3%82%BB%E3%83%AB%E5%85%A8%E4%BD % 93% E3% 81% AB% E5% 8F% 96% E6% B6% 88% E7% B7% 9A% E3% 81% 8C% E3% 81% 82% E3% 82% 8B)
  6. [Une partie de la cellule est barrée](https://qiita.com/milestone/items/8fef7ec91bab31354fdb#2-%E3%82%BB%E3%83%AB%E5%86%85% E3% 81% AE% E4% B8% 80% E9% 83% A8% E3% 81% AB% E5% 8F% 96% E6% B6% 88% E7% B7% 9A% E3% 81% 8C% E3% 81% 82% E3% 82% 8B)

1. Matrice cachée

Empêche la lecture des données de ligne / colonne masquées (ou dont la largeur est égale à 0).

1. Jugement des lignes cachées

Détermine si la ligne est masquée.

sample.java


for(Row row : sheet){
   //Déterminer si une ligne est masquée
   if(row.getZeroHeight()){
      //S'il est masqué, lisez la ligne suivante
      continue;
   }
   ...
}

2. Jugement des colonnes cachées

Détermine si la colonne est masquée. Apache POI lit des livres, des feuilles, des lignes, des colonnes, Dans le cas des colonnes, il est nécessaire de juger cellule par cellule. De plus, comme il n'y a pas de jugement caché dans la classe Cell pour les colonnes, il est nécessaire de décrire le processus de jugement dans la classe Sheet.

sample.java


for(Cell cell : row){
   //Déterminez si la colonne est masquée
   if(sheet.isColumnHidden(cell.getColumnIndex())){
      //S'il est masqué, lisez la cellule suivante
      continue;
   }
   ...
}

2. Ligne d'annulation

Empêche la lecture des cellules barrées. Puisque la méthode de correspondance est différente selon que la cellule est barrée ou qu'une partie de la cellule (une partie du caractère) est barrée, nous allons les introduire séparément. image.png

1. Il y a un barré dans toute la cellule

Il s'agit d'une méthode permettant de déterminer s'il existe ou non un barré dans la cellule entière.

sample.java


for(Cell cell : row){
   //Obtenir la police de la cellule
   CellStyle style = c.getCellStyle();
   Font font = c.getSheet().getWorkbook().getFontAt(style.getFontIndex());
   //Déterminer si une cellule est barrée
   if(font.getStrikeout()){
      //S'il y a un barré, lisez la cellule suivante
      continue;
   }
   ...
}

2. Une partie de la cellule est barrée

S'il y a un barré dans une partie de la cellule, il est nécessaire d'utiliser correctement la méthode d'écriture en fonction du type d'extension Excel à lire.

Lorsque l'extension est xlsx

Obtient la chaîne avec le barré. Exemple) Ai ~~ Ue ~~ O → Ue

sample.java


//Obtenir la valeur de la cellule au format XSSFRichTextString
XSSFRichTextString richStr = (XSSFRichTextString) cell.getRichStringCellValue();
//Obtenez le nombre de blocs de police qui atteignent une chaîne dans une cellule
int cnt = richStr.numFormattingRuns();
//0 lorsque la police n'est pas correcte
if (cnt == 0 ) {
   continue;
}
for (int i = 0; i < cnt; i++;) {
   //Obtenez le i-ème index des blocs de police
   XSSFFont xssfFont = richStr.getFontOfFormattingRun(i);
   //Si le morceau n'est pas touché par la police
   if (xssfFont == null) {
       continue;
   }
   //Si le morceau est frappé par une police, déterminez s'il y a un barré
   if (xssfFont.getStrikeout()) {
   //S'il y a un barré, récupère la chaîne du i-ème morceau d'index
       System.out.println(richStr.getCTRst().getRArray(i).getT());
   }
}

Comme mentionné ci-dessus, dans le cas de xlsx, il peut être obtenu de manière relativement simple. J'ai moi-même eu un peu de mal à comprendre la signification du traitement de Formatting Run, mais pour autant que je puisse voir le traitement, s'il s'agit de "Ai ~~ Ue ~~ O", essayez de le diviser en morceaux "Ai", "Ue" et "O". Cela semblait être là. (Cependant, "Ai" a été acquis sans police, et "Ue" et "O" ont été acquis par taille de caractère, police de caractère (Meirio, etc.), présence / absence de barré, etc.)

Lorsque l'extension est xls (Excel 97-2003 ver.)

HSSFFont ne peut pas obtenir la police elle-même comme XSSF, probablement à cause de l'ancienne version, et il semble n'obtenir que l'index barré.

sample.java


String cellStr = cell.getStringCellValue();
HSSFRichTextString richStr = (HSSFRichTextString)cell.getRichStringCellValue();
//Obtenez le nombre de morceaux les hits de police
int cnt = richStr.numFormattingRuns();
if (cnt == 0){
   continue;
} else {
   int startStrikeoutIndex = -1;
   boolean isStrikeoutStartIndex = false;
   for (int i = 0; i < cnt; i++;) {
      //Obtenez le i-ème index des blocs de police
      Font hssfFont = wb.getFontAt(richStr.getFontOfFormattingRun(i));
      int index = richStr.getIndexOfFormattingRun(i);
      //Si le morceau n'est pas touché par la police
      if (hssfFont == null) {
          if (isStrikeoutStartIndex) {
             System.out.println(cellStr.substring(startStrikeoutIndex, index));
             isStrikeoutStartIndex = false;
          }
          continue;
      }
      //Si vous avez des paramètres de police mais pas de barré
      if (!hssfFont.getStrikeout()) {
          if (isStrikeoutStartIndex) {
             System.out.println(cellStr.substring(startStrikeoutIndex, index));
             isStrikeoutStartIndex = false; 
          }
      } 
      //S'il y a une ligne d'annulation en partie
      else if (hssfFont.getStrikeout()) {
          startStrikeoutIndex = index;
          isStrikeoutStartIndex = true;
          if (i + 1 == cnt) {
             //Dans le cas du dernier bloc, il est affiché ici.
             System.out.println(cellStr.substring(startStrikeoutIndex, cellStr.length()));
          }
      }
   }
}

Dans mes recherches, je l'ai implémenté en utilisant un traitement utilisable, c'est donc devenu une compétence. Pour expliquer brièvement le mécanisme, dans le cas de "Ah ~~ i ~~ u ~~ e ~~ o", l'Index du premier caractère de la pièce avec la ligne d'annulation est acquis comme startStrikeoutIndex (dans le cas de "I" 1), isStrikeoutStartIndex. Est défini sur true. Après cela, si isStrikeoutStartIndex est vrai, le caractère entre startStrikeoutIndex et l'Index du premier caractère du bloc suivant (2 parce que c'est la partie "U") est le caractère barré, alors récupérez cette partie. Je suis.

en conclusion

C'était une partie très difficile, alors je l'ai résumée pour pouvoir regarder en arrière en cas de besoin. J'espère que cela aide ceux qui veulent faire de même.

référence

Recommended Posts

[Apache POI] Jugement des cellules inutiles
Jugement du calendrier
[Apache POI] Version Excel correspondante
Liste de points addictifs Apache POI
Jugement d'inclusion des éléments de la collection
Opération Excel avec Apache POI
Jugement de JSONArray et JSONObject
apache POI mémo personnel crossfish21
Comment utiliser Apache POI
Manipuler Excel avec Apache POI
Apache POI Excel avec Kotlin
Sortie vers Excel en utilisant Apache POI!