Ziel ist es, dass Benutzer, die Apache POI verwenden möchten, Excel-Dateien während des Kopierens bearbeiten können. Das hier gezeigte Implementierungsbeispiel ist nur die Mindestimplementierung zum Ausführen von Apache POI, und die Fehlerbehandlung ist separat erforderlich. Die Version, die für die Arbeit mit dem Code bestätigt wurde, ist 4.1.0.
Sie können es von hier aus vorbereiten. https://poi.apache.org/download.html
org.apache.poi.ss.usermodel.Workbook
repräsentiert die gesamte Arbeitsmappe der xlsx-Datei.
Damit die xlsx-Datei gelesen oder geschrieben werden kann, geben Sie zuerst das Zielblatt an, nachdem Sie das Objekt "Arbeitsmappe" erstellt haben. Dies ist "org.apache.poi.ss.usermodel.Sheet".
Geben Sie die Zeile zum Lesen / Schreiben an, nachdem Sie das Objekt "Sheet" aus dem Objekt "Workbook" abgerufen haben. Dies ist org.apache.poi.ss.usermodel.Row
.
Geben Sie nach dem Abrufen des "Row" -Objekts aus dem "Sheet" -Objekt die Zelle an, die gelesen oder geschrieben werden soll. Geben Sie die Spalte und die Zelle an. Dies ist "org.apache.poi.ss.usermodel.Cell".
Nachdem Sie das Objekt "Zelle" aus dem Objekt "Zeile" abgerufen haben, können Sie wie in Excel Werte in die Zelle lesen und schreiben.
Holen Sie sich zuerst das Objekt "Arbeitsmappe" aus dem Dateipfad.
Workbook workbook = WorkbookFactory.create(new FileInputStream(filePath));
Das "Blatt" -Objekt kann aus dem Blattnamen und dem Index abgerufen werden (beginnend mit 0 vom Blatt ganz links).
//Erhalten aus dem Blattnamen
Sheet sheet = workbook.getSheet(name);
//Vom Index abrufen
Sheet sheet = workbook.getSheetAt(index);
Holen Sie sich aus dem Objekt "Sheet" das Objekt "Row" und dann das Objekt "Cell".
Row row = sheet.getRow(rowIndex);
Cell cell = row.getCell(columIndex);
Grundsätzlich ist es zum Abrufen des "Row" -Objekts und des "Cell" -Objekts erforderlich, den Index 0 start wie die Zeile und die Spalte anzugeben. Bei Verwendung von "CellReference" ist dies jedoch in Excel bekannt. Es ist auch möglich, im A1-Format anzugeben.
CellReference reference = new CellReference(a1Position);
Row row = sheet.getRow(reference.getRow());
Cell cell = row.getCell(reference.getCol());
Wenn Sie nach dem Abrufen des Objekts "Cell" den Inhalt der Zelle als Zeichenfolge abrufen möchten, führen Sie die Methode "Cell.getCellType ()" aus, um den in der Zelle enthaltenen Wertetyp und die Anzahl der jeweiligen Werte abzurufen Oder Sie müssen die entsprechende Methode individuell gestalten.
Wenn der Zelleninhalt eine Zeichenfolge ("STRING") ist, kann er mit dem Standard "Cell.getStringCellValue ()" gelesen werden.
Bei einer Zahl (NUMERIC
) wird das Datum ebenfalls als Zahl behandelt. Es ist daher besser, darauf zu achten und Ihre eigene Methode vorzubereiten.
Bei Datumsangaben möchten Sie in den meisten Fällen einen Wert mit einem gestalteten Anzeigeformat, sodass Sie dies mit Ihrer eigenen Methode behandeln können.
Im Fall des Wahrheitswertes (BOOLEAN
) können Sie den Wert von boolean
mit dem StandardwertCell.getBooleanCellValue ()
abrufen, also konvertieren Sie ihn in eine Zeichenfolge.
Wenn Sie für einen Funktionswert (FORMULA
) nur den Funktionsausdruck als Zeichenfolge möchten, können Sie ihn mit Cell.getCellFormula ()
abrufen.
Im Allgemeinen denke ich jedoch, dass Sie in den meisten Fällen das Berechnungsergebnis der Funktion wünschen. Bereiten Sie in diesem Fall Ihre eigene Methode vor.
Wenn es keinen Wert gibt (BLANK
), handelt es sich häufig um eine zusammengeführte Zelle. Die zusammengeführte Zelle soll einen Wert in der oberen linken Zelle des zusammengeführten Bereichs haben, sodass das Lesen einer anderen Zelle im zusammengeführten Bereich als leer behandelt wird.
Da die zusammengeführten Zellen bei Verwendung von Excel auf besondere Weise gespeichert werden, bereiten wir eine separate Methode vor, um dies zu handhaben.
Hier ist eine einfache Implementierung einer Methode, die ein "Cell" -Objekt verwendet und einen "String" zurückgibt: Wir werden unten über unsere eigenen Methoden sprechen.
String readCell(Cell cell) {
switch (cell.getCellType()) {
//String(Standard)
case STRING:
return cell.getStringCellValue();
//Numerischer Wert(Besitzen)
case NUMERIC:
return getStringNmericValue(cell);
//Wahrheitswert(Standard)
case BOOLEAN:
return Boolean.toString(cell.getBooleanCellValue());
//Funktionswert(Besitzen)
case FORMULA:
return getStringFormulaValue(cell);
//Leer(Besitzen)
case BLANK:
return getStringRangeValue(cell);
default:
System.out.println("Unexpected Type: "+cell.getCellType());
return null;
}
}
NUMERIC
)Wenn der Wert in der Zelle nur eine Zahl ist, können Sie ihn in eine Zeichenfolge konvertieren und zurückgeben. Wenn es sich jedoch um ein Datum handelt, passen Sie den Stil an und rufen Sie ihn dann als Zeichenfolge ab.
Für Standard-Datumsformate können Sie es als Zeichenfolge mit "java.time" abrufen. Für benutzerdefinierte Typen verwenden Sie jedoch "org.apache.poi.ss.format.CellFormat", um es zu formatieren. Ruft den Wert dieses Textes nach dem Anpassen ab.
Das Folgende ist ein einfaches Implementierungsbeispiel.
//Holen Sie sich die Nummer unter Berücksichtigung des Datums
String getStringNmericValue(Cell cell) {
//Für Standarddaten
if(DateUtil.isCellDateFormatted(cell)) {
Date date = cell.getDateCellValue();
//java.time.Stringify mit DateTimeFormatter
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss.SSS");
LocalDateTime localDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
return dateTimeFormatter.format(localDateTime);
}
//Wenn Sie das Datum in einem benutzerdefinierten Typ festgelegt haben
if(BuiltinFormats.FIRST_USER_DEFINED_FORMAT_INDEX <= cell.getCellStyle().getDataFormat()) {
CellFormat cellFormat = CellFormat.getInstance(cell.getCellStyle().getDataFormatString());
return cellFormat.apply(cell).text;
}
//Wenn es kein Datum ist, wird eine Nummer zurückgegeben.
return Double.toString(cell.getNumericCellValue());
}
FORMEL
)Um das Berechnungsergebnis der Funktion zu erhalten, übergeben Sie das Zielobjekt "Zelle" an das Objekt "FormulaEvaluator" und erhalten Sie das Berechnungsergebnis.
Da das Berechnungsergebnis jedoch als "CellValue" -Objekt anstelle einer Zeichenfolge zurückgegeben wird, wird es erneut durch "CellValue.getCellType ()" beurteilt, ob das Berechnungsergebnis eine Zeichenfolge, ein numerischer Wert oder ein Wahrheitswert ist, und jedes wird bestimmt. , Lesen Sie den Wert mit der Standard-POI-Methode.
Beachten Sie auch, dass es einige Funktionen gibt, die das FormulaEvaluator-Objekt nicht unterstützt. Bitte beachten Sie die Liste der aktuell unterstützten Funktionen am Ende. Wenn Sie eine nicht unterstützte Funktion ausführen, wird eine "EvaluationException" ausgelöst.
Wenn Sie eine benutzerdefinierte Funktion ausführen möchten, lesen Sie bitte hier. https://poi.apache.org/components/spreadsheet/user-defined-functions.html
Das Folgende ist ein einfaches Implementierungsbeispiel für die eigene Methode der eigenen FORMULA-Methode.
//Funktion ausführen und lesen
String getStringFormulaValue(Cell cell) {
try {
//Funktionsausführung
CreationHelper helper = workbook.getCreationHelper();
FormulaEvaluator evaluator = helper.createFormulaEvaluator();
CellValue value = evaluator.evaluate(cell);
//Ändern Sie das Aufrufziel der Methode entsprechend dem Inhalt des Berechnungsergebnisses.
switch (value.getCellType()) {
case STRING:
return value.getStringValue();
case NUMERIC:
return Double.toString(value.getNumberValue());
case BOOLEAN:
return Boolean.toString(value.getBooleanValue());
default:
System.out.println("Unexpected Type: "+value.getCellType());
return null;
}
}catch(Exception e) {
return cell.getCellFormula();
}
}
BLANK
) eigene MethodeIm Fall von "BLANK" spielt es keine Rolle, ob es sich nur um eine leere Zelle handelt, aber wenn es sich um eine zusammengeführte Zelle handelt, spielt es keine Rolle, ob sie nicht gelesen werden kann. Stellen Sie daher sicher, dass sie der zusammengeführten Zelle entspricht.
Die zusammengeführten Zellen werden gemeinsam in einem speziellen Bereich des Blattes gespeichert. Um festzustellen, ob es sich bei der zu lesenden Zelle um eine zusammengeführte Zelle handelt, nehmen Sie die Liste des zusammengeführten Zellenbereichs heraus und lesen Sie sie. Legt fest, ob ein zusammengeführter Bereich Zellen enthält.
Wenn es einen zusammengeführten Bereich gibt, in dem die zu lesende Zelle im Bereich enthalten ist, geben Sie oben links den Bereich an, in dem der Wert gelesen werden soll.
Zu diesem Zeitpunkt kann der Typ des Zelleninhalts nicht ohne Verwendung von "Cell.getCellType ()" bestimmt werden, sodass die obere linke Zelle an die Methode übergeben wird, die "String" erneut von "Cell" zurückgibt. (ReadCell-Methode im obigen Implementierungsbeispiel)
Das Folgende ist ein einfaches Implementierungsbeispiel.
//Zusammengeführte Zellen lesen
String getStringRangeValue(Cell cell) {
//Ruft den Index der zu lesenden Zelle ab
int rowIndex = cell.getRowIndex();
int columnIndex = cell.getColumnIndex();
//Suchen Sie sorgfältig, um festzustellen, ob es im kombinierten Bereich enthalten ist.
int size = sheet.getNumMergedRegions();
for (int i = 0; i < size; i++) {
CellRangeAddress range = sheet.getMergedRegion(i);
//Wenn ein Bereich enthalten ist
if (range.isInRange(rowIndex, columnIndex)) {
//Holen Sie sich die obere linke Zelle
Cell firstCell = sheet.getRow(range.getFirstRow()).getCell(range.getFirstColumn());
//Cell->Zur String-Methode wechseln.
return readCell(firstCell);
}
}
return null;
}
Wenn Sie eine neue Arbeitsmappe im xlsx-Format erstellen, erstellen Sie eine Instanz von "org.apache.poi.xssf.usermodel.XSSFWorkbook" und empfangen Sie sie als Variable vom Typ "Arbeitsmappe".
Wenn Sie ein "Blatt" -Objekt erstellen möchten, ist es besser, es in einen Namen zu konvertieren, der für ein Blatt mit "WorkbookUtil.createSafeSheetName ()" verwendet werden kann, und es dann zu erstellen.
In Bezug auf das "Row" -Objekt und das "Cell" -Objekt sind im "Sheet" -Objekt im Ausgangszustand alle Zeilen und Zellen "Null", sodass jedes Objekt einmal erstellt wird, bevor in die Zelle geschrieben wird. wird gebraucht. Wenn Sie die Zeile / Spalte im A1-Format angeben möchten, verwenden Sie "CellReference" wie oben beschrieben.
//Erstellen eines Arbeitsmappenobjekts
Workbook workbook = new XSSFWorkbook();
//Blattobjekt generieren
String safeName = WorkbookUtil.createSafeSheetName(name);
Sheet sheet = workbook.createSheet(safeName);
//Konvertierung vom A1-Format in den Index
CellReference reference = new CellReference(a1Position);
int rowIndex = reference.getRow();
int columIndex = reference.getCol();
//Generieren eines Zeilenobjekts
Row row = sheet.createRow(rowIndex);
//Erstellen eines Zellenobjekts
Cell cell = row.createCell(columIndex);
Nachdem Sie die verschiedenen unten gezeigten Änderungen am Objekt "Arbeitsmappe" vorgenommen haben, verwenden Sie "FileOutputStream", um die xlsx-Datei endgültig zu exportieren. (Obwohl der Kürze halber weggelassen, schreiben Sie bitte try-catch entsprechend in den tatsächlichen Code.)
FileOutputStream fileOut = new FileOutputStream(filePath);
workbook.write(fileOut);
fileOut.close();
Das Schreiben einer Zeichenfolge ist sehr einfach. Rufen Sie einfach "Cell.setvalue ()" auf. Wenn Sie jedoch eine Methode erstellen, die Zellen durch Angabe des Index schreibt, ist es besser, das Objekt "Row" oder "Cell" an dieser Position auf Null zu überprüfen.
Hier ist ein einfaches Implementierungsbeispiel.
void writeCellAt(int rowIndex, int columIndex, String value) {
//Row,Zell-Null-Prüfung
Row row = sheet.getRow(rowIndex);
if(row == null) {
row = sheet.createRow(rowIndex);
}
Cell cell = row.getCell(columIndex);
if(cell == null) {
cell = row.createCell(columIndex);
}
//Eine Zeichenfolge schreiben
cell.setCellValue(value);
}
Grundsätzlich denke ich, dass eine komplizierte Verarbeitung mit Java-Funktionen und -Bibliotheken implementiert werden kann, solange Sie eine Zeichenfolge schreiben können.
Wenn es sich um ein einfaches Tabellenformat handelt, ist es mit einer CSV-Datei möglich, aber ich denke, es gibt einige Zelldekorationen als Grund für die Verwendung von xlsx. Ich denke, dass es viele Menschen in der Umgebung gibt, in denen xlsx als erstes Dokument anstelle von PDF und dox verwendet wird. Daher wird die grundlegende Dekorationsmethode unten gezeigt. Es ist immer noch besser, die Null von "Row" und "Cell" für die unten gezeigten Dekorationen zu überprüfen.
Verwenden Sie diesmal "Sheet.addMergedRegion ()", um sich beim "Sheet" -Objekt zu registrieren, so wie es beim Lesen der zusammengeführten Zellen vom "Sheet" -Objekt erhalten wurde.
//topRow: Zeilenindex der oberen linken Zelle
//topColum: Spaltenindex der oberen linken Zelle
//bottomRow: Zeilenindex der unteren rechten Zelle
//bottomColum: Spaltenindex der unteren rechten Zelle
CellRangeAddress cellRangeAddress = new CellRangeAddress(topRow, bottomRow, topColum, bottomColum);
sheet.addMergedRegion(cellRangeAddress);
Sie können die Zeilenhöhe mit "Row.setHeightInPoints ()" ändern. Wenn es schwierig ist, eine bestimmte Höhe anzugeben, können Sie diese in Vielfachen des Standardwerts angeben.
//mehrere
float mult = 2.0f;
//Auf den doppelten Standardwert einstellen
row.setHeightInPoints(mult*sheet.getDefaultRowHeightInPoints());
Verwenden Sie zum Umschließen und Anzeigen des Ganzen "CellStyle" für das Zielobjekt "Cell" wie folgt:
CellStyle style = workbook.createCellStyle();
style.setWrapText(true);
cell.setCellStyle(style);
Wenn Sie dadurch keine gute dynamische Passform erhalten, lesen Sie bitte hier. https://stackoverflow.com/questions/19145628/auto-size-height-for-rows-in-apache-poi
Wenn die Höheneinstellung nicht funktioniert, scheint es auch eine Möglichkeit zu geben, Zeilenumbrüche zu zählen und als Vielfaches festzulegen. https://stackoverflow.com/questions/45387206/how-to-increase-the-height-of-the-excel-row-using-apache-poi-having-merged-cell/45388037
Um einen Rahmen zu zeichnen, verwenden Sie "CellStyle", um das Zielobjekt "Cell" einzeln anzugeben, nach oben, unten, links und rechts, wie unten gezeigt. Die Dicke wird durch "BorderStyle" angegeben. Es ist ein verwirrender Name, aber "BorderStyle.THIN" steht im Allgemeinen für einen dicken Rand und "BorderStyle.MEDIUM" für einen dicken Rand.
CellStyle style = workbook.createCellStyle();
style.setBorderTop(BorderStyle.THIN);
style.setBorderBottom(BorderStyle.THIN);
style.setBorderLeft(BorderStyle.THIN);
style.setBorderRight(BorderStyle.THIN);
cell.setCellStyle(style);
Die Schriftfarbe kann auch mit "CellStyle" für das Ziel "Cell" -Objekt geändert werden.
Für Farben wird im Voraus eine Standardfarbpalette als Variable erstellt. Farbmuster finden Sie hier. https://lincolnminto.wordpress.com/2014/04/07/apache-poi-referencia-para-estilos-de-celulas-apache-poi-cellstyles-reference/
CellStyle style = workbook.createCellStyle();
Font font = workbook.createFont();
font.setColor(IndexedColors.WHITE.getIndex());
style.setFont(font);
cell.setCellStyle(style);
Die Zellenfüllung kann auch mit CellStyle
für das Objekt Cell
geändert werden.
Verwenden Sie verwirrenderweise "CellStyle.setFillForegroundColor ()" anstelle von "CellStyle.setFillBackgroundColor ()".
CellStyle style = workbook.createCellStyle();
style.setFillForegroundColor(IndexedColors.CORAL.getIndex());
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
cell.setCellStyle(style);
Ich habe nicht bestätigt, dass es ordnungsgemäß funktioniert, aber es scheint eine Möglichkeit zu geben, RGB für die Schriftfarbe und die Zellenfüllfarbe wie folgt anzugeben.
IndexedColorMap colorMap = workbook.getStylesSource().getIndexedColors();
XSSFColor grey = new XSSFColor(new java.awt.Color(192,192,192), colorMap);
cellStyle.setFillForegroundColor(grey);
Referenz: https://stackoverflow.com/questions/10912578/apache-poi-xssfcolor-from-hex-code
Fügen Sie das Bild in das Objekt "Arbeitsmappe" ein.
Nachdem Sie mit "IOUtils.toByteArray ()" in eine Byte-Zeichenfolge konvertiert und diese mit "Workbook.addPicture ()" im Buch registriert haben, erhalten Sie den Index des Bildes als Rückgabewert. Einige der Dateiformate, die zu diesem Zeitpunkt angegeben werden können, sind unten aufgeführt.
Konstante | Format |
---|---|
PICTURE_TYPE_DIB | bmp |
PICTURE_TYPE_JPEG | jpeg |
PICTURE_TYPE_PNG | png |
Die Position und Größe des Bildes werden mit "ClientAnchor" festgelegt. Geben Sie die obere linke Zelle und die untere rechte Zelle an, um Position und Größe anzupassen. "ClientAnchor.setCol2 ()" und "ClientAnchor.setRow2 ()", die die untere rechte Zelle angeben, werden jedoch tatsächlich gestreckt, da sie auf die angegebene Index-1-Position (eine obere linke Zelle) gestreckt werden. Geben Sie den Wert von Index + 1 in der unteren rechten Zelle des gewünschten Bereichs an.
Der Ankertyp ist das, was Excel als Eigenschaftsformatierungsfeld für Formen bezeichnet. Hier können Sie angeben, ob Änderungen am Bild vorgenommen werden sollen, wenn Zellen verschoben oder in der Größe geändert werden. Das Folgende ist eine Liste von Konstanten und Einstellungen.
Konstante | Erläuterung |
---|---|
DONT_MOVE_AND_RESIZE | Selbst wenn die Größe der Zeile / Spalte geändert wird, wird das Bild nicht verschoben / in der Größe geändert. |
DONT_MOVE_DO_RESIZE | Das Bild wird nicht verschoben, aber an die Ankerzelle angepasst. |
MOVE_AND_RESIZE | Verschieben und Größe ändern. |
MOVE_DONT_RESIZE | Es bewegt sich entsprechend der Zelle des Ankers |
Verwenden Sie abschließend das Objekt "Zeichnen", um das Bild mit dem angegebenen Index an der angegebenen Ankerposition einzufügen. Das Folgende ist ein einfaches Implementierungsbeispiel. (Obwohl der Kürze halber weggelassen, schreiben Sie bitte try-catch entsprechend in den tatsächlichen Code.)
//In Byte-String konvertieren
InputStream in = new FileInputStream(filePath);
byte[] bytes = IOUtils.toByteArray(in);
in.close();
//Bildregistrierung, Indexerfassung
int pictureIndex = workbook.addPicture(byteWorkbook.PICTURE_TYPE_PNG);
//Geben Sie die Position und Größe mit dem Anker an
ClientAnchor anchor = workbook.getCreationHelper().createClientAnchor();
anchor.setCol1(topColum);
anchor.setRow1(topRow);
anchor.setCol2(bottomColum+1);
anchor.setRow2(bottomRow+1);
anchor.setAnchorType(AnchorType.MOVE_AND_RESIZE);
//Fügen Sie das Bild des angegebenen Index an der Position des angegebenen Ankers ein
Drawing patriarch = sheet.createDrawingPatriarch();
patriarch.createPicture(anchor, pictureIndex);
Referenz: https://poi.apache.org/components/spreadsheet/eval-devguide.html
ABS | ACOS | ACOSH | ADDRESS | AND |
ASIN | ASINH | ATAN | ATAN2 | ATANH |
AVEDEV | AVERAGE | BIN2DEC | CEILING | CHAR |
CHOOSE | CLEAN | CODE | COLUMN | COLUMNS |
COMBIN | COMPLEX | CONCATENATE | COS | COSH |
COUNT | COUNTA | COUNTBLANK | COUNTIF | COUNTIFS |
DATE | DAY | DAYS360 | DEC2BIN | DEC2HEX |
DEGREES | DELTA | DEVSQ | DGET | DMIN |
DOLLAR | EDATE | EOMONTH | ERROR.TYPE | EVEN |
EXACT | EXP | FACT | FACTDOUBLE | FALSE |
FIND | FIXED | FLOOR | FV | HEX2DEC |
HLOOKUP | HOUR | HYPERLINK | IF | IFERROR |
IMAGINARY | IMREAL | INDEX | INDIRECT | INT |
INTERCEPT | IPMT | IRR | ISBLANK | ISERR |
ISERROR | ISEVEN | ISLOGICAL | ISNA | ISNONTEXT |
ISNUMBER | ISODD | ISREF | ISTEXT | LARGE |
LEFT | LEN | LN | LOG | LOG10 |
LOOKUP | LOWER | MATCH | MAX | MAXA |
MDETERM | MEDIAN | MID | MIN | MINA |
MINUTE | MINVERSE | MIRR | MMULT | MOD |
MODE | MONTH | MROUND | NA | NETWORKDAYS |
NOT | NOW | NPER | NPV | OCT2DEC |
ODD | OFFSET | OR | PERCENTILE | PI |
PMT | POISSON | POWER | PPMT | PRODUCT |
PROPER | PV | QUOTIENT | RADIANS | RAND |
RANDBETWEEN | RANK | RATE | REPLACE | REPT |
RIGHT | ROMAN | ROUND | ROUNDDOWN | ROUNDUP |
ROW | ROWS | SEARCH | SECOND | SIGN |
SIN | SINH | SLOPE | SMALL | SQRT |
STDEV | SUBSTITUTE | SUBTOTAL | SUM | SUMIF |
SUMIFS | SUMPRODUCT | SUMSQ | SUMX2MY2 | SUMX2PY2 |
SUMXMY2 | T | TAN | TANH | TEXT |
TIME | TODAY | TRANSPOSE | TRIM | TRUE |
TRUNC | UPPER | VALUE | VAR | VARP |
VLOOKUP | WEEKDAY | WEEKNUM | WORKDAY | YEAR |
YEARFRAC |
--Hishidamas Homepage Apache POI http://www.ne.jp/asahi/hishidama/home/tech/apache/poi/
--Lass die Programmierung Excel mit Apache POI betreiben https://www.javadrive.jp/poi/
--Sukeros Geschichte Fügen Sie mit POI ein Bild in EXCEL ein https://www.sukerou.com/2019/03/poiexcel.html
Qiita Apache POI Memorandum Excel lesen https://qiita.com/panage/items/4476ff91d1fcec67f525
stackoverflow Auto size height for rows in Apache POI https://stackoverflow.com/questions/19145628/auto-size-height-for-rows-in-apache-poi
stackoverflow How to increase the height of the excel row using Apache-POI having merged cell value greater than the cell width? https://stackoverflow.com/questions/45387206/how-to-increase-the-height-of-the-excel-row-using-apache-poi-having-merged-cell/45388037
stackoverflow Apache POI background color style seems not working https://stackoverflow.com/questions/43212386/apache-poi-background-color-style-seems-not-working/43213843
stackoverflow Apache POI XSSFColor from hex code https://stackoverflow.com/questions/10912578/apache-poi-xssfcolor-from-hex-code
Recommended Posts