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.
Empêche la lecture des données de ligne / colonne masquées (ou dont la largeur est égale à 0).
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;
}
...
}
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;
}
...
}
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.
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;
}
...
}
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.
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.)
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.
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.
Recommended Posts