Ich habe versucht, mit Apache POI von CSV nach Excel auszugeben. Ich gebe auch ein Balkendiagramm aus. Es ist so
template.xlsx | output.xlsx |
---|---|
Da ich ein Anfänger bin, denke ich, dass es viele Punkte gibt, die ich nicht erreichen kann, aber ich würde mich über Ihre Meinung freuen.
github https://github.com/y012/POI_Sample.git
Was ist Apache POI überhaupt? Es begann von.
Als ich es nachgeschlagen habe, scheint es, dass ich Dateien im Microsoft Office-Format bearbeiten kann. (Zusätzlich zu Excel, Word, PowerPoint usw.)
wiki https://ja.wikipedia.org/wiki/Apache_POI API Document https://poi.apache.org/apidocs/dev/overview-summary.html
Dieses Mal werden wir, wie der Titel schon sagt, Excel betreiben!
Windows 7
Java 8
Apache POI 4.1.1
Microsoft Excel 2010
Apache POI https://poi.apache.org/index.html
Download über den Link → poi-bin- ~ .zip → Download über den Link, den Sie im roten Rahmen erhalten Diesmal habe ich die zweite von oben heruntergeladen.
・ Entpacken, Pfad erstellen Klicken Sie mit der rechten Maustaste auf das Projekt, das Sie hinzufügen möchten → Neu → Ordner Erstellen Sie dann einen lib-Ordner und entpacken Sie die heruntergeladene Zip-Datei in den lib-Ordner. Dieses Mal habe ich den Erstellungspfad durch alle JAR-Dateien im entpackten Ordner gelegt!
・ Eingabedaten (.csv) Diesmal wurden die Eingabedaten von der unten stehenden Seite vorbereitet!
Was für eine persönliche Information http://kazina.com/dummy/
Es scheint interessant zu sein, wie man Curry isst, aber diesmal lehnte ich ab.
・ Vorlage erstellen (.xlsx) Das Festlegen von Schriftarten und Stilen mit POI von 1 ist schwierig ~~ mühsam ~~, erstellen Sie also zuerst eine Vorlage!
Die Vorbereitungen sind beendet und es wird endlich umgesetzt. Verwenden Sie XSSF oder HSSF, wenn Sie mit Excel mit Apache POI arbeiten. Es gibt ungefähr die folgenden Unterschiede, und dieses Mal werden wir XSSF verwenden.
HSSF | ~Excel2003(.xls) |
---|---|
XSSF | Excel2007(.xlsx)~ |
FileInputStream fis = null;
FileOutputStream fos = null;
Workbook wb = null;
try{
//Vorlagendatei abrufen
fis = new FileInputStream("Vorlagendateipfad");
wb = (XSSFWorkbook)WorkbookFactory.create(fis);
//Standardschriftarteneinstellungen
wb.createFont().setFontName("Schriftartenname");
// (1)start
//Duplizieren Sie das Blatt aus der Vorlage und legen Sie den Blattnamen fest
//Das Duplikat wird dem letzten Blatt in der Arbeitsmappe hinzugefügt
Sheet sheet = wb.cloneSheet(wb.getSheetIndex("Name des Vorlagenblatts"));
wb.setSheetName(wb.getSheetIndex(sheet), "Name des Ausgabeblatts");
//Holen Sie sich Zeilen, Zellen(Kann nicht spaltenweise abgerufen werden)
//Erstellen, da die Zeile oder Zelle im Standardzustand null ist
int rowIndex = 0;
Row row = sheet.getRow(rowIndex);
if(row == null){
row = sheet.createRow(rowIndex);
}
int columnIndex = 0;
Cell cell = row.getCell(columnIndex);
if(cell == null){
cell = row.createCell(columnIndex);
}
//Auf A1 einstellen
cell.setCellValue("Hello World!!");
// (1)end
//Ausgabe in Ausgabedatei
fos = new FileOutputStream("Pfad der Ausgabedatei");
wb.write(fos);
}catch(Exception e) {
e.printStackTrace();
}finally {
if(fis != null) {
try {
fis.close();
}catch(IOException e) {
}
}
if(fos != null) {
try {
fos.close();
}catch(IOException e) {
}
}
if(wb != null) {
try {
wb.close();
}catch(IOException e) {
}
}
}
Damit können Sie ausgeben, ohne die Vorlagendatei zu ändern. Da der Wert jedoch für jede Zelle festgelegt ist, muss der Bereich von (1) viele Male wiederholt werden. Aus diesem Grund habe ich eine Manager-Klasse erstellt, die die Verschiebungsverarbeitung und die Eingabeverarbeitung zusammenfasst.
ExcelManager.java
package poi.common.util;
import static poi.common.constant.ExcelConstants.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.Comment;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.PrintSetup;
import org.apache.poi.ss.usermodel.RichTextString;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xddf.usermodel.chart.XDDFChart;
import org.apache.poi.xssf.usermodel.XSSFChart;
import org.apache.poi.xssf.usermodel.XSSFDrawing;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBarChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBarSer;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBoolean;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTCatAx;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLegend;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumRef;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPlotArea;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTScaling;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTSerTx;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrRef;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTValAx;
import org.openxmlformats.schemas.drawingml.x2006.chart.STAxPos;
import org.openxmlformats.schemas.drawingml.x2006.chart.STBarDir;
import org.openxmlformats.schemas.drawingml.x2006.chart.STLegendPos;
import org.openxmlformats.schemas.drawingml.x2006.chart.STOrientation;
import org.openxmlformats.schemas.drawingml.x2006.chart.STTickLblPos;
public class ExcelManager {
private Sheet sheet = null;
private Row row = null;
private Cell cell = null;
private int offset;
private int rowIndex;
private int columnIndex;
private Map<Integer,CellStyle> styleMap;
//Einstellvorgang
/**
*Stellen Sie das Blatt ein und stellen Sie die Position der Referenzzelle auf "A1".
* @param sheet
*/
public void setSheet(Sheet sheet) {
this.sheet = sheet;
setPosition();
this.styleMap = new HashMap<>();
this.offset = 1;
this.rowIndex = 0;
this.columnIndex = 0;
}
/**
*Kopieren Sie die Druckeinstellungen der Vorlage
* @param printSetup
*/
public void setPrintSetup(PrintSetup printSetup) {
PrintSetup newSetup = this.sheet.getPrintSetup();
//Anzahl der Kopien
newSetup.setCopies(printSetup.getCopies());
//Entwurfsmodus
//newSetup.setDraft(printSetup.getDraft());
//Anzahl der Seiten, die hoch genug sind, um auf das Blatt zu passen
newSetup.setFitHeight(printSetup.getFitHeight());
//Anzahl der Seiten, die breit genug sind, um auf das Blatt zu passen
newSetup.setFitWidth(printSetup.getFitWidth());
//Fußzeilenrand
//newSetup.setFooterMargin(printSetup.getFooterMargin());
//Header-Rand
//newSetup.setHeaderMargin(printSetup.getHeaderMargin());
//Horizontale Auflösung
//newSetup.setHResolution(printSetup.getHResolution());
//Querformat
newSetup.setLandscape(printSetup.getLandscape());
//Druckauftrag von links nach rechts
//newSetup.setLeftToRight(printSetup.getLeftToRight());
//Schwarz und weiß
newSetup.setNoColor(printSetup.getNoColor());
//Richtung
newSetup.setNoOrientation(printSetup.getNoOrientation());
//Memo drucken
//newSetup.setNotes(printSetup.getNotes());
//Startseite
//newSetup.setPageStart(printSetup.getPageStart());
//Papiergröße
newSetup.setPaperSize(printSetup.getPaperSize());
//Rahmen
newSetup.setScale(printSetup.getScale());
//Seitenzahl verwendet
//newSetup.setUsePage(printSetup.getUsePage());
//Gültige Einstellungen
//newSetup.setValidSettings(printSetup.getValidSettings());
//Vertikale Auflösung
//newSetup.setVResolution(printSetup.getVResolution());
}
/**
*Druckbereich abrufen
* @return
*/
public String getPrintArea() {
int firstRow = this.sheet.getFirstRowNum();
int lastRow = this.rowIndex;
int firstColumn = this.sheet.getRow(firstRow).getFirstCellNum();
int lastColumn = this.sheet.getRow(lastRow).getLastCellNum()-1;
String printArea = "$" + getColumnAlphabet(firstColumn)
+ "$" + String.valueOf(firstRow+1)
+ ":$" + getColumnAlphabet(lastColumn)
+ "$" + String.valueOf(lastRow);
return printArea;
}
//Dies ist das Ende des Einstellungsprozesses
//Verarbeitung verschieben
/**
*Stellen Sie die Linienposition ein, auf die Bezug genommen werden soll
*/
private void setRow() {
if((this.row = sheet.getRow(this.rowIndex)) == null) {
this.row = sheet.createRow(this.rowIndex);
}
}
/**
*Stellen Sie die Zellenposition ein, auf die Bezug genommen werden soll
*/
private void setCell() {
if((this.cell = row.getCell(this.columnIndex)) == null) {
this.cell = row.createCell(this.columnIndex);
}
}
/**
*Stellen Sie den Versatz (Bewegungsbetrag) ein.
** Der Standardwert ist "1"
* @param offset
*/
public void setOffset(int offset) {
this.offset = offset;
}
/**
*Stellen Sie die Zeilenposition und die Zellenposition ein, auf die Bezug genommen werden soll
*/
private void setPosition() {
setRow();
setCell();
}
/**
*Legen Sie die Zellenposition fest, auf die verwiesen werden soll, indem Sie die Zeile und Spalte angeben
* @param rowIndex
*Linienposition(0 Basis)
* @param columnIndex
*Spaltenposition(0 Basis)
*/
public void setPosition(int rowIndex, int columnIndex) {
this.rowIndex = rowIndex;
this.columnIndex = columnIndex;
setPosition();
}
/**
*Verschieben Sie die referenzierte Zellenposition entsprechend dem eingestellten Versatz
*Aktuelle Spaltenposition+Versatz
*/
public void nextCell() {
moveCell(this.offset);
}
/**
*Verschiebt die referenzierte Zellenposition entsprechend dem angegebenen Versatz
*Aktuelle Spaltenposition+Versatz
* @param columnOffset
*/
public void moveCell(int columnOffset) {
move(0, columnOffset);
}
/**
*Verschieben Sie die Position der referenzierten Linie entsprechend dem eingestellten Versatz
*Aktuelle Leitungsposition+Versatz
** Die Spaltenposition ist 0 (A) Spalte
*/
public void nextRow() {
nextRow(0);
}
/**
*Verschiebt die referenzierte Zeilenposition entsprechend dem eingestellten Versatz und bewegt sich an die angegebene Spaltenposition
*Aktuelle Leitungsposition+Versatz
* @param columnIndex
*/
public void nextRow(int columnIndex) {
this.columnIndex = columnIndex;
moveRow(this.offset);
}
/**
*Verschiebt die referenzierte Zeilenposition entsprechend dem angegebenen Versatz
*Aktuelle Leitungsposition+Versatz
** Die Zeilenposition ändert sich nicht
* @param rowOffset
*/
public void moveRow(int rowOffset) {
move(rowOffset, 0);
}
/**
*Verschiebt die referenzierte Zeilenposition und Spaltenposition entsprechend dem angegebenen Zeilenversatz und Spaltenversatz.
*Aktuelle Leitungsposition+Zeilenversatz
*Aktuelle Spaltenposition+Spaltenversatz
* @param rowOffset
* @param columnOffset
*/
public void move(int rowOffset, int columnOffset) {
this.rowIndex += rowOffset;
this.columnIndex += columnOffset;
setPosition();
}
/**
*Verschiebt nachfolgende Zeilen um eine Zeile von der aktuellen Zeilenposition nach unten (Zeile einfügen)
** Erben Sie den Stil und die Höhe der oberen Reihe
*/
public void shiftRows() {
int lastRowNum = this.sheet.getLastRowNum();
int lastCellNum = this.sheet.getRow(this.rowIndex-1).getLastCellNum();
this.sheet.shiftRows(this.rowIndex, lastRowNum+1, 1);
Row newRow = this.sheet.getRow(this.rowIndex);
if(newRow == null) {
newRow = this.sheet.createRow(this.rowIndex);
}
Row oldRow = this.sheet.getRow(this.rowIndex-1);
for(int i = 0; i < lastCellNum-1; i++) {
Cell newCell = newRow.createCell(i);
Cell oldCell = oldRow.getCell(i);
//Stileinstellung, wenn oldCell nicht null ist
//Es gibt eine Obergrenze für den Zellenstil, der im Wrokbook erstellt werden kann. Packen Sie ihn also in die Karte
if(oldCell != null) {
if(!styleMap.containsKey(i)) {
CellStyle newStyle = this.sheet.getWorkbook().createCellStyle();
newStyle.cloneStyleFrom(oldCell.getCellStyle());
newStyle.setBorderTop(BorderStyle.DOTTED);
styleMap.put(i, newStyle);
}
newCell.setCellStyle(styleMap.get(i));
}
}
newRow.setHeightInPoints(oldRow.getHeightInPoints());
setPosition();
}
//Dies ist das Ende des Verschiebungsprozesses
//Eingabeverarbeitung
/**
*Legen Sie einen Wert für den Zeichentyp in der Zelle fest und verschieben Sie die Position der referenzierten Spalte entsprechend dem angegebenen Versatz
*Setzen Sie BLANK, wenn kein Wert vorhanden ist
* @param value
* @param columnOffset
*/
public void setCellValue(char value, int columnOffset) {
setCellValue(String.valueOf(value), columnOffset);
}
/**
*Legen Sie einen Wert für den Zeichentyp in der Zelle fest und verschieben Sie die Position der referenzierten Spalte entsprechend dem festgelegten Versatz
*Setzen Sie BLANK, wenn kein Wert vorhanden ist
* @param value
*/
public void setCellValue(char value) {
setCellValue(value, this.offset);
}
/**
*Legen Sie einen Wert vom Typ String in der Zelle fest und verschieben Sie die Position der referenzierten Spalte entsprechend dem angegebenen Versatz
*Setzen Sie BLANK, wenn kein Wert vorhanden ist
* @param value
* @param columnOffset
*/
public void setCellValue(String value, int columnOffset) {
if(value.trim().length() == 0) {
this.cell.setBlank();
}else {
this.cell.setCellValue(value);
}
moveCell(columnOffset);
}
/**
*Legen Sie einen Wert vom Typ String in der Zelle fest und verschieben Sie die Position der referenzierten Spalte entsprechend dem festgelegten Versatz
*Setzen Sie BLANK, wenn kein Wert vorhanden ist
* @param value
*/
public void setCellValue(String value) {
setCellValue(value, this.offset);
}
/**
*Legen Sie einen Wert vom Typ RichTextString für die Zelle fest und verschieben Sie die referenzierte Spaltenposition entsprechend dem angegebenen Versatz
*Setzen Sie BLANK, wenn kein Wert vorhanden ist
* @param value
* @param columnOffset
*/
public void setCellValue(RichTextString value, int columnOffset) {
if(value.getString().trim().length() == 0) {
this.cell.setBlank();
}else {
this.cell.setCellValue(value);
}
moveCell(columnOffset);
}
/**
*Legen Sie einen RichTextString-Typwert in der Zelle fest und verschieben Sie die referenzierte Spaltenposition entsprechend dem festgelegten Versatz
*Setzen Sie BLANK, wenn kein Wert vorhanden ist
* @param value
*/
public void setCellValue(RichTextString value) {
setCellValue(value, this.offset);
}
/**
*Legen Sie einen Bytetypwert in der Zelle fest und verschieben Sie die referenzierte Spaltenposition entsprechend dem angegebenen Versatz
* @param value
* @param columnOffset
*/
public void setCellValue(byte value, int columnOffset) {
this.cell.setCellValue(value);
moveCell(columnOffset);
}
/**
*Legen Sie einen Bytetypwert in der Zelle fest und verschieben Sie die referenzierte Spaltenposition entsprechend dem eingestellten Versatz
* @param value
*/
public void setCellValue(byte value) {
setCellValue(value, this.offset);
}
/**
*Legen Sie einen kurzen Typwert in der Zelle fest und verschieben Sie die Position der referenzierten Spalte entsprechend dem angegebenen Versatz
* @param value
* @param columnOffset
*/
public void setCellValue(short value, int columnOffset) {
this.cell.setCellValue(value);
moveCell(columnOffset);
}
/**
*Legen Sie einen kurzen Typwert in der Zelle fest und verschieben Sie die referenzierte Spaltenposition entsprechend dem eingestellten Versatz
* @param value
*/
public void setCellValue(short value) {
setCellValue(value, this.offset);
}
/**
*Legen Sie einen Int-Typ-Wert in der Zelle fest und verschieben Sie die referenzierte Spaltenposition entsprechend dem angegebenen Versatz
* @param value
* @param columnOffset
*/
public void setCellValue(int value, int columnOffset) {
this.cell.setCellValue(value);
moveCell(columnOffset);
}
/**
*Legen Sie einen Int-Typ-Wert in der Zelle fest und verschieben Sie die referenzierte Spaltenposition entsprechend dem festgelegten Versatz
* @param value
*/
public void setCellValue(int value) {
setCellValue(value, this.offset);
}
/**
*Legen Sie einen langen Wert in der Zelle fest und verschieben Sie die Position der referenzierten Spalte entsprechend dem angegebenen Versatz
* @param value
* @param columnOffset
*/
public void setCellValue(long value, int columnOffset) {
this.cell.setCellValue(value);
moveCell(columnOffset);
}
/**
*Legen Sie einen langen Typwert in der Zelle fest und verschieben Sie die referenzierte Spaltenposition entsprechend dem eingestellten Versatz
* @param value
*/
public void setCellValue(long value) {
setCellValue(value, this.offset);
}
/**
*Legen Sie einen doppelten Typwert in der Zelle fest und verschieben Sie die referenzierte Spaltenposition entsprechend dem angegebenen Versatz
* @param value
* @param columnOffset
*/
public void setCellValue(double value, int columnOffset) {
this.cell.setCellValue(value);
moveCell(columnOffset);
}
/**
*Legen Sie einen doppelten Typwert in der Zelle fest und verschieben Sie die referenzierte Spaltenposition entsprechend dem festgelegten Versatz
* @param value
*/
public void setCellValue(double value) {
setCellValue(value, this.offset);
}
/**
*Legen Sie einen Gleitkommawert in der Zelle fest und verschieben Sie die referenzierte Spaltenposition entsprechend dem angegebenen Versatz
* @param value
* @param columnOffset
*/
public void setCellValue(float value, int columnOffset) {
this.cell.setCellValue(value);
moveCell(columnOffset);
}
/**
*Legen Sie einen Gleitkommawert in der Zelle fest und verschieben Sie die referenzierte Spaltenposition entsprechend dem eingestellten Versatz
* @param value
*/
public void setCellValue(float value) {
setCellValue(value, this.offset);
}
/**
*Legen Sie einen booleschen Wert in der Zelle fest und verschieben Sie die Position der referenzierten Spalte entsprechend dem angegebenen Versatz
* @param value
* @param columnOffset
*/
public void setCellValue(boolean value, int columnOffset) {
this.cell.setCellValue(value);
moveCell(columnOffset);
}
/**
*Legen Sie einen booleschen Typwert in der Zelle fest und verschieben Sie die referenzierte Spaltenposition entsprechend dem festgelegten Versatz.
* @param value
*/
public void setCellValue(boolean value) {
setCellValue(value, this.offset);
}
/**
*Legen Sie einen Kalendertypwert in der Zelle fest und verschieben Sie die Position der referenzierten Spalte entsprechend dem angegebenen Versatz
* @param value
* @param columnOffset
*/
public void setCellValue(Calendar value, int columnOffset) {
this.cell.setCellValue(value);
moveCell(columnOffset);
}
/**
*Legen Sie einen Kalendertypwert in der Zelle fest und verschieben Sie die referenzierte Spaltenposition entsprechend dem festgelegten Versatz
* @param value
*/
public void setCellValue(Calendar value) {
setCellValue(value, this.offset);
}
/**
*Legen Sie einen Datumswert in der Zelle fest und verschieben Sie die Position der referenzierten Spalte entsprechend dem angegebenen Versatz
* @param value
* @param columnOffset
*/
public void setCellValue(Date value, int columnOffset) {
this.cell.setCellValue(value);
moveCell(columnOffset);
}
/**
*Legen Sie in der Zelle einen Wert für den Datumstyp fest und verschieben Sie die Position der referenzierten Spalte entsprechend dem festgelegten Versatz
* @param value
*/
public void setCellValue(Date value) {
setCellValue(value, this.offset);
}
/**
*Legen Sie in der Zelle einen Wert vom Typ LocalDate fest und verschieben Sie die referenzierte Spaltenposition entsprechend dem angegebenen Versatz
* @param value
* @param columnOffset
*/
public void setCellValue(LocalDate value, int columnOffset) {
this.cell.setCellValue(value);
moveCell(columnOffset);
}
/**
*Legen Sie in der Zelle einen Wert vom Typ LocalDate fest und verschieben Sie die referenzierte Spaltenposition entsprechend dem festgelegten Versatz.
* @param value
*/
public void setCellValue(LocalDate value) {
setCellValue(value, this.offset);
}
/**
*Legen Sie in der Zelle einen Wert vom Typ LocalDateTime fest und verschieben Sie die referenzierte Spaltenposition entsprechend dem angegebenen Versatz
* @param value
* @param columnOffset
*/
public void setCellValue(LocalDateTime value, int columnOffset) {
this.cell.setCellValue(value);
moveCell(columnOffset);
}
/**
*Legen Sie in der Zelle einen Wert vom Typ LocalDateTime fest und verschieben Sie die referenzierte Spaltenposition entsprechend dem festgelegten Versatz.
* @param value
*/
public void setCellValue(LocalDateTime value) {
setCellValue(value, this.offset);
}
/**
*Zeichenfolgentypformel("="Ich brauche nicht)In die Zelle und verschieben Sie die referenzierte Spaltenposition entsprechend dem angegebenen Versatz
* @param value
* @param columnOffset
*/
public void setCellFormula(String value, int columnOffset) {
this.cell.setCellFormula(value);
moveCell(columnOffset);
}
/**
*Zeichenfolgentypformel("="Ich brauche nicht)In die Zelle und verschieben Sie die referenzierte Spaltenposition entsprechend dem eingestellten Versatz
* @param value
*/
public void setCellFormula(String value) {
setCellFormula(value, this.offset);
}
/**
*Legen Sie einen Kommentar vom Typ String in einer Zelle fest(Anzeigebereich ist fester Wert)
** Die Zeilenposition bewegt sich nicht
* @param commentStr
*/
public void setCellComment(String commentStr) {
CreationHelper helper = sheet.getWorkbook().getCreationHelper();
XSSFDrawing drawing = (XSSFDrawing)sheet.createDrawingPatriarch();
//Wert, der von der Position von Zeile1 verschoben werden soll(In Pixel)
int dx1 = 0;
//Wert, der von der Position von col1 verschoben werden soll(In Pixel)
int dy1 = 0;
//Wert, der von der Position von Zeile 2 verschoben werden soll(In Pixel)
int dx2 = 0;
//Wert, der von der Position von col2 verschoben werden soll(In Pixel)
int dy2 = 0;
//Position des Kommentarbereichs in der oberen linken Spalte(Zelleneinheit)
int col1 = this.columnIndex + 1;
//Position der oberen linken Zeile im Kommentaranzeigebereich(Zelleneinheit)
int row1 = this.rowIndex;
//Position der unteren rechten Spalte im Anzeigebereich für Kommentare(Zelleneinheit)
int col2 = this.columnIndex + 4;
//Position der unteren rechten Zeile im Kommentaranzeigebereich(Zelleneinheit)
int row2 = this.rowIndex + 3;
ClientAnchor anchor = drawing.createAnchor(dx1, dy1, dx2, dy2, col1, row1, col2, row2);
Comment comment = drawing.createCellComment(anchor);
//comment.setAuthor("master");
comment.setString(helper.createRichTextString(commentStr));
this.cell.setCellComment(comment);
}
/**
*Balkendiagramm von der aktuellen Zellenposition einfügen(Die Größe ist ein fester Wert)
*/
public void setBarChart() {
XSSFDrawing drawing = (XSSFDrawing)sheet.createDrawingPatriarch();
int dx1 = 0;
int dy1 = 0;
int dx2 = 0;
int dy2 = 0;
int col1 = this.columnIndex;
int row1 = this.rowIndex;
move(16, 10);
int col2 = this.columnIndex;
int row2 = this.rowIndex;
ClientAnchor anchor = drawing.createAnchor(dx1, dy1, dx2, dy2, col1, row1, col2, row2);
XDDFChart chart = (XDDFChart)drawing.createChart(anchor);
CTChart ctChart = ((XSSFChart)chart).getCTChart();
CTPlotArea ctPlotArea = ctChart.getPlotArea();
CTBarChart ctBarChart = ctPlotArea.addNewBarChart();
CTBoolean ctBoolean = ctBarChart.addNewVaryColors();
ctBoolean.setVal(true);
ctBarChart.addNewBarDir().setVal(STBarDir.COL);
for (int r = 4; r < 8; r++) {
CTBarSer ctBarSer = ctBarChart.addNewSer();
CTSerTx ctSerTx = ctBarSer.addNewTx();
CTStrRef ctStrRef = ctSerTx.addNewStrRef();
//Gebrauchsanweisung
ctStrRef.setF("Aggregat!$B$" + r);
ctBarSer.addNewIdx().setVal(r-4);
CTAxDataSource cttAxDataSource = ctBarSer.addNewCat();
ctStrRef = cttAxDataSource.addNewStrRef();
//Artikel
ctStrRef.setF("Aggregat!$C$3:$I$3");
CTNumDataSource ctNumDataSource = ctBarSer.addNewVal();
CTNumRef ctNumRef = ctNumDataSource.addNewNumRef();
//Datenbereich
ctNumRef.setF("Aggregat!$C$" + r + ":$I$" + r);
ctBarSer.addNewSpPr().addNewLn().addNewSolidFill()
.addNewSrgbClr().setVal(new byte[] {0,0,0});
}
int catId = 100;
int valId = 200;
ctBarChart.addNewAxId().setVal(catId);
ctBarChart.addNewAxId().setVal(valId);
CTCatAx ctCatAx = ctPlotArea.addNewCatAx();
ctCatAx.addNewAxId().setVal(catId);
CTScaling ctScaling = ctCatAx.addNewScaling();
ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
ctCatAx.addNewDelete().setVal(false);
ctCatAx.addNewAxPos().setVal(STAxPos.B);
ctCatAx.addNewCrossAx().setVal(valId);
ctCatAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);
CTValAx ctValAx = ctPlotArea.addNewValAx();
ctValAx.addNewAxId().setVal(valId);
ctScaling = ctValAx.addNewScaling();
ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
ctValAx.addNewDelete().setVal(false);
ctValAx.addNewAxPos().setVal(STAxPos.L);
ctValAx.addNewCrossAx().setVal(catId);
ctValAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);
CTLegend ctLegend = ctChart.addNewLegend();
ctLegend.addNewLegendPos().setVal(STLegendPos.B);
ctLegend.addNewOverlay().setVal(false);
}
//Die Eingabeverarbeitung endet hier
//Umwandlungsprozess
/**
*Konvertiert die angegebene Spaltennummer in die A1-Notation
* @param ascii
* @return
*/
public String getColumnAlphabet(int ascii) {
String alphabet = "";
if(ascii < 26) {
alphabet = String.valueOf((char)(ASCII+ascii));
}else {
int div = ascii / 26;
int mod = ascii % 26;
alphabet = getColumnAlphabet(div-1) + getColumnAlphabet(mod);
}
return alphabet;
}
/**
*Ändern Sie die aktuelle Spaltennummer in A1-Notation
* @return
*/
public String getColumnAlphabet() {
return getColumnAlphabet(this.columnIndex);
}
//Dies ist das Ende des Konvertierungsprozesses
}
Auf den Punkt gebracht -NextCell () wechselt zur nächsten Zelle, nextRow () wechselt zur nächsten Zeile und die Zelle wechselt zur Spalte 0 (Spalte A).
PoiSample.java
package poi.main;
import static poi.common.constant.ExcelConstants.*;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import poi.common.dao.CSVInputDao;
import poi.common.dto.CSVDto;
import poi.common.util.ExcelManager;
public class PoiSample {
public static void main(String[] args) {
System.out.println("Start");
FileInputStream fis = null;
FileOutputStream fos = null;
Workbook wb = null;
ExcelManager manager = new ExcelManager();
int rowIndex = 0;
CSVInputDao csvInDao = new CSVInputDao();
CSVDto csvDto = new CSVDto();
Map<Integer, List<CSVDto>> agesMap = new TreeMap<>();
SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd");
csvInDao.setFile(FILE_PATH_INPUT);
try {
fis = new FileInputStream(FILE_PATH_TEMPLATE);
wb = (XSSFWorkbook)WorkbookFactory.create(fis);
wb.createFont().setFontName(FONT);
//Holen Sie sich durch Angabe des Blattnamens
Sheet sheet = wb.cloneSheet(wb.getSheetIndex(SHEET_NAME_TEMPLATE));
//Einstellung des Blattnamens
wb.setSheetName(wb.getSheetIndex(sheet), SHEET_NAME_ALL_DATA);
System.out.println("createSheet:" + sheet.getSheetName());
manager.setSheet(sheet);
csvInDao.open();
//Alle Daten ausgeben
while((csvDto = csvInDao.read()) != null) {
if(rowIndex != 0){
if(rowIndex >= 2) {
manager.shiftRows();
}
int age = Integer.parseInt(csvDto.getAge());
String comment = "Telefon:" + csvDto.getTelephone() + LINE_SEPARATOR
+ "Mobiltelefon:" + csvDto.getMobile() + LINE_SEPARATOR
+ "Email:" + csvDto.getMail();
manager.setCellComment(comment);
manager.setCellValue(csvDto.getName());
manager.setCellValue(csvDto.getFurigana());
manager.setCellValue(csvDto.getSex());
manager.setCellValue(age);
manager.setCellValue(sdFormat.parse(csvDto.getBirthDay()));
manager.setCellValue(csvDto.getMarriage());
manager.setCellValue(csvDto.getBloodType());
manager.setCellValue(csvDto.getBirthPlace());
manager.setCellValue(csvDto.getCareer());
//Alterserwerb ex)23→20
age = (int)(age / 10) * 10;
if(agesMap.containsKey(age)) {
agesMap.get(age).add(csvDto);
}else {
List<CSVDto> dtoList = new ArrayList<>();
dtoList.add(csvDto);
agesMap.put(age, dtoList);
}
}
rowIndex++;
manager.nextRow();
}
//Druckeinstellungen, Druckbereich
manager.setPrintSetup(wb.getSheetAt(wb.getSheetIndex(SHEET_NAME_TEMPLATE)).getPrintSetup());
wb.setPrintArea(wb.getSheetIndex(sheet), manager.getPrintArea());
//Ausgabe durch Aufteilung in Blätter für jedes Alter
List<String> sheetNames = new ArrayList<>();
for(Map.Entry<Integer, List<CSVDto>> ageMap : agesMap.entrySet()) {
String sheetName = String.valueOf(ageMap.getKey()) + "Ersatz";
if((sheet = wb.getSheet(sheetName)) == null) {
sheet = wb.cloneSheet(wb.getSheetIndex(SHEET_NAME_TEMPLATE));
wb.setSheetName(wb.getSheetIndex(sheet), sheetName);
}
sheetNames.add(sheet.getSheetName());
System.out.println("createSheet:" + sheet.getSheetName());
manager.setSheet(sheet);
rowIndex = 1;
manager.nextRow();
for(CSVDto nextDto: ageMap.getValue()) {
if(rowIndex >= 2) {
manager.shiftRows();
}
String comment = "Telefon:" + nextDto.getTelephone() + LINE_SEPARATOR
+ "Mobiltelefon:" + nextDto.getMobile() + LINE_SEPARATOR
+ "Email:" + nextDto.getMail();
manager.setCellComment(comment);
manager.setCellValue(nextDto.getName());
manager.setCellValue(nextDto.getFurigana());
manager.setCellValue(nextDto.getSex());
manager.setCellValue(Integer.parseInt(nextDto.getAge()));
manager.setCellValue(sdFormat.parse(nextDto.getBirthDay()));
manager.setCellValue(nextDto.getMarriage());
manager.setCellValue(nextDto.getBloodType());
manager.setCellValue(nextDto.getBirthPlace());
manager.setCellValue(nextDto.getCareer());
rowIndex++;
manager.nextRow();
}
//Druckeinstellungen, Druckbereich
manager.setPrintSetup(wb.getSheetAt(wb.getSheetIndex(SHEET_NAME_TEMPLATE)).getPrintSetup());
wb.setPrintArea(wb.getSheetIndex(sheet), manager.getPrintArea());
}
//Gesamtausgabe
sheet = wb.cloneSheet(wb.getSheetIndex(SHEET_NAME_GRAPH_TEMPLATE));
wb.setSheetName(wb.getSheetIndex(sheet), SHEET_NAME_AGGREGATED);
System.out.println("createSheet:" + sheet.getSheetName());
manager.setSheet(sheet);
String formula = "";
for(rowIndex = 3; 7 >= rowIndex; rowIndex++) {
manager.setPosition(rowIndex, 2);
for(String sheetName: sheetNames) {
if(rowIndex == 7) {
formula = "SUM($" + manager.getColumnAlphabet() + "$4:$"
+ manager.getColumnAlphabet() +"$7)";
}else {
formula = "COUNTIF(\'" + sheetName + "\'!$I:$I,$B$" + String.valueOf(rowIndex+1) + ")";
}
manager.setCellFormula(formula);
}
}
//Die Formel wird nicht nur durch Einstellen berechnet, sondern neu berechnet
wb.getCreationHelper().createFormulaEvaluator().evaluateAll();
rowIndex++;
manager.setPosition(rowIndex, 1);
//Balkendiagrammeinstellungen
manager.setBarChart();
//Druckeinstellungen, Druckbereich
manager.setPrintSetup(wb.getSheetAt(wb.getSheetIndex(SHEET_NAME_GRAPH_TEMPLATE)).getPrintSetup());
wb.setPrintArea(wb.getSheetIndex(sheet), manager.getPrintArea());
//Löschen Sie unnötige Vorlagen
wb.removeSheetAt(wb.getSheetIndex(SHEET_NAME_TEMPLATE));
wb.removeSheetAt(wb.getSheetIndex(SHEET_NAME_GRAPH_TEMPLATE));
//Dateiausgabe
fos = new FileOutputStream(FILE_PATH_OUTPUT);
wb.write(fos);
System.out.println("Ende");
}catch(Exception e) {
e.printStackTrace();
}finally {
if(fis != null) {
try {
fis.close();
}catch(IOException e) {
}
}
if(fos != null) {
try {
fos.close();
}catch(IOException e) {
}
}
if(wb != null) {
try {
wb.close();
}catch(IOException e) {
}
}
}
}
}
Es gab viele Dinge, die ich nicht verstand, also machte ich einen Versuch und Irrtum. Es gelang mir jedoch, die CSV-Datei zu lesen, alle Daten auszugeben, nach Alter auszugeben und die Gesamtsumme auszugeben! Ich habe persönlich die Manager-Klasse erstellt, was die Implementierung vereinfacht hat, aber ich denke, ich hätte die Vererbung verwenden sollen, indem ich die Klasse nach dem Verarbeitungsinhalt aufgeteilt habe, weil ich zu viele Dinge gepackt habe. Ich kann nicht gut erben, also muss ich lernen.
Danke, dass du bis zum Ende zugesehen hast! Zum Schluss werde ich den Github-Link wieder veröffentlichen!
github https://github.com/y012/POI_Sample.git
Recommended Posts