[JAVA] [Apache POI] Beurteilung unnötiger Zellen

Einführung

Beim Laden von Excel mit Apache POI wollte ich Zellen mit durchgestrichenen und versteckten Zellen überspringen, also versuchte ich herauszufinden, wie das geht. Ich werde es als mein eigenes Memo schreiben, aber bitte beziehen Sie sich darauf, wenn Sie möchten.

Mokuji

  1. [Versteckte Matrix](https://qiita.com/milestone/items/8fef7ec91bab31354fdb#1-%E9%9D%9E%E8%A1%A8%E7%A4%BA%E8%A1%8C%E5 % 88% 97)
  2. [Beurteilung versteckter Linien](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. [Beurteilung versteckter Spalten](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. Stornierung
  5. [In der gesamten Zelle wird durchgestrichen](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. [In einem Teil der Zelle ist ein Durchstreichen vorhanden](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. Versteckte Matrix

Verhindert das Lesen von ausgeblendeten Zeilen- / Spaltendaten (oder die Breite ist 0).

1. Beurteilung von versteckten Linien

Legt fest, ob die Zeile ausgeblendet ist.

sample.java


for(Row row : sheet){
   //Stellen Sie fest, ob eine Zeile ausgeblendet ist
   if(row.getZeroHeight()){
      //
      continue;
   }
   ...
}

sample.java


for(Cell cell : row){
   //2. Beurteilung der versteckten Spalte Beurteilen Sie, ob die Spalte verborgen ist. In Apache POI werden Bücher, Blätter, Zeilen und Spalten gelesen. Bei Spalten ist es daher erforderlich, eine zellenweise Beurteilung vorzunehmen. Da es in der Cell-Klasse keine versteckte Beurteilung für Spalten gibt, ist es außerdem erforderlich, den Beurteilungsprozess in der Sheet-Klasse zu beschreiben. Stellen Sie fest, ob die Spalte ausgeblendet ist
   if(sheet.isColumnHidden(cell.getColumnIndex())){
      //Wenn versteckt, lesen Sie die nächste Zelle
      continue;
   }
   ...
}

2. Stornierungslinie

Verhindert das Lesen von Zellen mit Durchgestrichen. Da die Korrespondenzmethode unterschiedlich ist, je nachdem, ob die Zelle durchgestrichen ist oder ein Teil der Zelle (ein Teil des Zeichens) durchgestrichen ist, werden wir sie separat einführen. image.png

1. In der gesamten Zelle wird durchgestrichen

Dies ist eine Methode, um festzustellen, ob in der gesamten Zelle ein Durchstreichen vorliegt oder nicht.

sample.java


for(Cell cell : row){
   //Holen Sie sich die Schriftart der Zelle
   CellStyle style = c.getCellStyle();
   Font font = c.getSheet().getWorkbook().getFontAt(style.getFontIndex());
   //Bestimmen Sie, ob eine Zelle durchgestrichen ist
   if(font.getStrikeout()){
      //Wenn es einen Durchschlag gibt, lesen Sie die nächste Zelle
      continue;
   }
   ...
}

2. In einem Teil der Zelle wird durchgestrichen

Wenn in einem Teil der Zelle ein Durchstreichen auftritt, muss die Schreibmethode je nach Art der zu lesenden Excel-Erweiterung ordnungsgemäß verwendet werden.

Wenn die Erweiterung xlsx ist

Ruft die Zeichenfolge mit dem Durchstreichen ab. Beispiel) Ai ~~ Ue ~~ O → Ue

sample.java


//Ruft den Zellenwert im XSSFRichTextString-Format ab
XSSFRichTextString richStr = (XSSFRichTextString) cell.getRichStringCellValue();
//Ermitteln Sie die Anzahl der Schriftarten, die eine Zeichenfolge in einer Zelle treffen
int cnt = richStr.numFormattingRuns();
//0, wenn die Schriftart nicht korrekt ist
if (cnt == 0 ) {
   continue;
}
for (int i = 0; i < cnt; i++;) {
   //Holen Sie sich den i-ten Font-Chunk-Index
   XSSFFont xssfFont = richStr.getFontOfFormattingRun(i);
   //Wenn der Knoten nicht von der Schriftart getroffen wird
   if (xssfFont == null) {
       continue;
   }
   //Wenn der Knoten von einer Schriftart getroffen wird, stellen Sie fest, ob ein Durchstreichen vorliegt
   if (xssfFont.getStrikeout()) {
   //Wenn ein Durchstreichen vorliegt, holen Sie sich die Zeichenfolge des i-ten Indexblocks
       System.out.println(richStr.getCTRst().getRArray(i).getT());
   }
}

Wie oben erwähnt, kann es im Fall von xlsx relativ einfach erhalten werden. Ich selbst hatte ein wenig Probleme, die Bedeutung der Formatierungslaufverarbeitung zu verstehen, aber soweit ich die Verarbeitung sehen kann, versuchen Sie, sie in "Ai" -, "Ue" - und "O" -Teile zu unterteilen, wenn es sich um "Ai ~~ Ue ~~ O" handelt. Es schien da zu sein. ("Ai" wurde jedoch ohne Schriftart erworben, und "Ue" und "O" wurden nach Zeichengröße, Zeichenschriftart (Meirio usw.), Vorhandensein / Nichtvorhandensein von Durchgestrichen usw. erfasst.)

Wenn die Erweiterung xls ist (Excel 97-2003 ver.)

HSSFFont kann die Schriftart selbst nicht wie XSSF abrufen, wahrscheinlich aufgrund der alten Version, und scheint nur den Index mit Durchgestrichen zu erhalten.

sample.java


String cellStr = cell.getStringCellValue();
HSSFRichTextString richStr = (HSSFRichTextString)cell.getRichStringCellValue();
//Ermitteln Sie die Anzahl der Chunks, auf die die Schrift trifft
int cnt = richStr.numFormattingRuns();
if (cnt == 0){
   continue;
} else {
   int startStrikeoutIndex = -1;
   boolean isStrikeoutStartIndex = false;
   for (int i = 0; i < cnt; i++;) {
      //Holen Sie sich den i-ten Font-Chunk-Index
      Font hssfFont = wb.getFontAt(richStr.getFontOfFormattingRun(i));
      int index = richStr.getIndexOfFormattingRun(i);
      //Wenn der Knoten nicht von der Schriftart getroffen wird
      if (hssfFont == null) {
          if (isStrikeoutStartIndex) {
             System.out.println(cellStr.substring(startStrikeoutIndex, index));
             isStrikeoutStartIndex = false;
          }
          continue;
      }
      //Wenn Sie Schriftarteinstellungen haben, aber nicht durchgestrichen sind
      if (!hssfFont.getStrikeout()) {
          if (isStrikeoutStartIndex) {
             System.out.println(cellStr.substring(startStrikeoutIndex, index));
             isStrikeoutStartIndex = false; 
          }
      } 
      //Wenn es teilweise eine Stornierungslinie gibt
      else if (hssfFont.getStrikeout()) {
          startStrikeoutIndex = index;
          isStrikeoutStartIndex = true;
          if (i + 1 == cnt) {
             //Im Fall des letzten Blocks wird er hier ausgegeben.
             System.out.println(cellStr.substring(startStrikeoutIndex, cellStr.length()));
          }
      }
   }
}

In meiner Forschung habe ich es mit nutzbarer Verarbeitung implementiert, so dass es eine ziemliche Fähigkeit wurde. Um den Mechanismus kurz zu erläutern, wird im Fall von "Ah ~~ i ~~ u ~~ e ~~ o" der Index des ersten Zeichens des Teils mit der Abbruchzeile als startStrikeoutIndex (im Fall von "I" 1) isStrikeoutStartIndex erfasst. Ist auf true gesetzt. Wenn danach isStrikeoutStartIndex true ist, ist das Zeichen zwischen dem startStrikeoutIndex und dem Index des ersten Zeichens des nächsten Blocks (2, da es sich um den "U" -Teil handelt) das Zeichen, das durchgestrichen ist. Ich bin.

abschließend

Es war ein sehr schwieriger Teil, deshalb habe ich ihn zusammengefasst, damit ich bei Bedarf zurückblicken kann. Ich hoffe, es hilft denen, die das Gleiche tun wollen.

Referenz

Recommended Posts

[Apache POI] Beurteilung unnötiger Zellen
Beurteilung des Kalenders
[Apache POI] Entsprechende Excel-Version
Apache POI Addictive Point List
Einschlussbeurteilung von Sammlungselementen
Excel-Operation mit Apache POI
Urteil von JSONArray und JSONObject
Apache POI persönliches Memo Crossfish21
Verwendung von Apache POI
Bearbeiten Sie Excel mit Apache POI
Apache POI Excel mit Kotlin
Ausgabe nach Excel mit Apache POI!