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.
Verhindert das Lesen von ausgeblendeten Zeilen- / Spaltendaten (oder die Breite ist 0).
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;
}
...
}
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.
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;
}
...
}
Wenn in einem Teil der Zelle ein Durchstreichen auftritt, muss die Schreibmethode je nach Art der zu lesenden Excel-Erweiterung ordnungsgemäß verwendet werden.
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.)
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.
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.
Recommended Posts