[JAVA] Apache POI persönliches Memo Crossfish21

Grundbetrieb

import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.poi.ss.formula.EvaluationWorkbook;
import org.apache.poi.ss.formula.FormulaParser;
import org.apache.poi.ss.formula.FormulaRenderer;
import org.apache.poi.ss.formula.FormulaRenderingWorkbook;
import org.apache.poi.ss.formula.FormulaType;
import org.apache.poi.ss.formula.ptg.AreaPtg;
import org.apache.poi.ss.formula.ptg.Ptg;
import org.apache.poi.ss.formula.ptg.RefPtgBase;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFEvaluationWorkbook;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheetProtection;

/**
*Servlet, das kundenbezogene Einstellungswerte für jeden Benutzer in der Datenbank registriert
*/
public class Class01 {

  /*
     *Gibt eine Zelle zurück.
     *
     * @param args
     *Linie
     */
  public static void main(String[] args) {

//        aaa();   //Erstellen Sie ein neues Buch
//        bbb();   //Vorhandene Arbeitsmappe importieren
//        blankCheck();   //Blankoscheck
        rowAndColumn();   //Zeilen- und Spaltenmanipulation
//        book();   //Buchbetrieb
//        cell();  //Zellenbetrieb



    }

  public static void aaa() {

        try(XSSFWorkbook book1 = new XSSFWorkbook()) {

            XSSFSheet sheet1 = book1.createSheet("Blatt 01");
            //Erstellen Sie ein Blatt. Blatt existiert im Ausgangszustand nicht

            XSSFRow row01 = sheet1.createRow(0);
            //Zeileninstanziierung. Die erste Zeile wird 0

            XSSFCell cell01 = row01.createCell(0);
            //Zellinstanziierung. Die erste Spalte wird 0

            cell01.setCellValue("AAA");  //Zellenwert einstellen


            XSSFCell cell02 = row01.createCell(1);
            cell02.setCellValue("BBB");

            XSSFCell cell03 = row01.createCell(2);
            cell03.setCellFormula("A1&B1");  //Zellformel einstellen. Es scheint, dass "=" nicht notwendig ist


            try(FileOutputStream out = new FileOutputStream("C:/work/aaa.xlsx")) {
                book1.write(out);
                //Ausgabe als neues Buch. Wenn Sie einen vorhandenen Dateipfad angeben, wird dieser überschrieben
            } catch (Exception e) {
                e.printStackTrace();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
   }



    public static void bbb(){  //Vorhandene Arbeitsmappe importieren

        try(FileInputStream input = new FileInputStream("C:/work/bbb.xlsx")){

            try(XSSFWorkbook book1 = (XSSFWorkbook) WorkbookFactory.create(input)){

                //* Es scheint, dass es kein Problem beim Lesen gibt, selbst wenn das Blatt geschützt ist.

                XSSFSheet sheet1 = book1.getSheet("Sheet1");  //Blatt"Sheet1"Erhalten
                Row row02 = sheet1.getRow(1);  //Holen Sie sich die zweite Zeile
                Cell cell01 = row02.getCell(0);  //Holen Sie sich Zelle A1 in der zweiten Zeile
                Cell cell02 = row02.getCell(1);  //Holen Sie sich Zelle B1 in der zweiten Zeile
                Cell cell03 = row02.getCell(2);

                String str1 = cell01.getStringCellValue();
                //Holen Sie sich die Zellenzeichenfolge. Beachten Sie, dass ein Lesefehler auftritt, wenn der Zellenwert ein numerischer Wert ist.
                System.out.println(str1);

                Double double01 = cell02.getNumericCellValue();
                //Holen Sie sich die Nummer
                System.out.println(double01);

                try {
                    String str3 = cell03.getCellFormula();
                    //Holen Sie sich die Formel. Ein Fehler tritt auf, wenn etwas anderes als die Formel enthalten ist.
                    System.out.println(str3);
                } catch (IllegalStateException e) {
                    //IllegalStateException tritt auf, wenn eine Formel aus einer Zelle abgerufen wird, die etwas anderes als eine Formel enthält
                    e.printStackTrace();
                }


                //Zellenparameter abrufen
                System.out.println(cell01.getColumnIndex());  //Holen Sie sich die Spaltennummer. Beachten Sie, dass die Zahlen bei 0 beginnen
                System.out.println(cell01.getRowIndex());  //Holen Sie sich die Zeilennummer. Beachten Sie, dass die Zahlen bei 0 beginnen
                System.out.println(cell01.getAddress());  //Holen Sie sich die Zellenadresse. Dadurch wird die Excel-Adresse so wie sie ist erhalten

            } catch (Exception e) {
                e.printStackTrace();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }



    public static void blankCheck(){  //Überprüfen Sie, ob die Zelle leer ist

        try(FileInputStream input = new FileInputStream("C:/work/bbb.xlsx")){

            try(XSSFWorkbook book1 = (XSSFWorkbook) WorkbookFactory.create(input)){

                XSSFSheet sheet1 = book1.getSheet("Sheet1");

                //Was ist, wenn eine leere Zelle
                Row row03 = sheet1.getRow(2);  //Holen Sie sich die 3. Zeile
                Cell cell01 = row03.getCell(0);
                Cell cell02 = row03.getCell(1);
                Cell cell03 = row03.getCell(2);

                if (cell01 == null || cell01.getCellType() == Cell.CELL_TYPE_BLANK) {
                //Dadurch wird festgestellt, ob es leer ist. Ist eine Nullprüfung erforderlich??
                    System.out.println("Zelle" + cell01.getAddress() + "Ist leer");
                }else{
                    String str1 = cell01.getStringCellValue();
                    System.out.println(str1);
                }


                if (cell02 == null || cell02.getCellType() == Cell.CELL_TYPE_BLANK) {
                    System.out.println("Zelle" + cell02.getAddress() + "Ist leer");
                }else{
                    Double double01 = cell02.getNumericCellValue();
                    System.out.println(double01);
                }

                if (cell03 == null || cell03.getCellType() == Cell.CELL_TYPE_BLANK) {
                    System.out.println("Zelle" + cell03.getAddress() + "Ist leer");
                }else{
                    String str4= cell03.getCellFormula();
                    System.out.println(str4);
                }

            } catch (Exception e) {
                e.printStackTrace();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

    }


    public static void rowAndColumn(){

        try(FileInputStream input = new FileInputStream("C:/work/Reihen und Spalten.xlsx")){

            try(XSSFWorkbook book1 = (XSSFWorkbook) WorkbookFactory.create(input)){

                XSSFSheet sheet1 = book1.getSheet("Sheet1");  //Blatt"Sheet1"Erhalten
//                Row row05 = sheet1.getRow(4);  //Holen Sie sich die 5. Zeile
//                row05.setZeroHeight(true);
//                //Du willst dich verstecken. Bereits ausgeblendete Zeilen führen nicht zu einem Fehler
//
//                Row row08 = sheet1.getRow(7);
//                row08.setZeroHeight(false);
//                //Versteckte Spalten erneut anzeigen. Nicht ausgeblendete Zeilen führen nicht zu einem Fehler
//
//                Row row11 = sheet1.getRow(10);
//                sheet1.removeRow(row11);
//                //Löschte den Wert der gesamten 11. Zeile(Scheint zu sein).. Die Zeile selbst wird nicht gelöscht
//                //Die Zeile selbst wird nicht gelöscht, aber es scheint, dass alle Zellenformate und Rahmen gelöscht wurden.
//
//                Row row12 = sheet1.getRow(11);
//                row12.setHeightInPoints(50.25F);
//                //Stellen Sie die Zeilenhöhe ein. Es muss schweben. 0.Set in 25 Einheiten. Selbst wenn Sie feinere Einstellungen vornehmen, kann diese gerundet werden
//
//                sheet1.shiftRows(9,14,-5);
//                //Verschieben Sie die 10. bis 15. Zeile um 5 Zeilen nach oben. Möglich, auch wenn eine zusammengeführte Zelle vorhanden ist
//                //Das Zellenformat und die Ränder werden ebenfalls so wie sie sind wiedergegeben
//
//                book1.setForceFormulaRecalculation(true);
//                //Wenn das Berechnungsergebnis der Formel aufgrund der Bewegung der Zeile oder des Löschens des Zeileninhalts merkwürdig wird, wird eine Neuberechnung wie oben empfohlen.




                // ※  Row row05 = sheet1.getRow(4);Es scheint möglich zu sein, auf Zeilenbasis, aber nicht auf Spaltenbasis zu arbeiten.

                sheet1.setColumnHidden(4, true);  //Verstecke die 5. Spalte
                sheet1.setColumnHidden(7, false);  //Zeigen Sie die dritte Spalte erneut an




                try(FileOutputStream out = new FileOutputStream("C:/work/Reihen und Spalten.xlsx")) {
                    book1.write(out);
                } catch (Exception e) {
                    e.printStackTrace();
                }

            } catch (Exception e) {
                e.printStackTrace();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }




    public static void book(){  //Buch bezogen

        try(FileInputStream input = new FileInputStream("C:/work/ccc.xlsx")){

            try(XSSFWorkbook book1 = (XSSFWorkbook) WorkbookFactory.create(input)){

                XSSFSheet sheet1 = book1.getSheet("Sheet1");  //Blatt"Sheet1"Erhalten
                Row row01 = sheet1.getRow(0);  //Holen Sie sich die erste Zeile

                book1.setForceFormulaRecalculation(true);  //Führen Sie eine Neuberechnung durch


                try(FileOutputStream out = new FileOutputStream("C:/work/ccc.xlsx")) {
                    book1.write(out);
                } catch (Exception e) {
                    e.printStackTrace();
                }

            } catch (Exception e) {
                e.printStackTrace();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }




    public static void cell(){  //Zellbezogen

        try(FileInputStream input = new FileInputStream("C:/work/Zelle.xlsx")){

            try(XSSFWorkbook book1 = (XSSFWorkbook) WorkbookFactory.create(input)){

                XSSFSheet sheet1 = book1.getSheet("Sheet1");  //Blatt"Sheet1"Erhalten


                Row row11 = sheet1.getRow(10);  //Holen Sie sich Linie 11
                Cell cell01 = row11.getCell(0);
                Cell cell02 = row11.createCell(1);  //Wenn Sie den Wert festlegen möchten, verwenden Sie createCell
//                cell02.setCellFormula(cell01.getCellFormula());
                //Eine Kopie der Formel. Da Sie jedoch eine Zeichenfolge erhalten können, können Sie die relative Referenzformel nicht kopieren.
                copyCell2Cell(cell01,cell02,book1);


                try(FileOutputStream out = new FileOutputStream("C:/work/Zelle.xlsx")) {
                    book1.write(out);
                } catch (Exception e) {
                    e.printStackTrace();
                }

            } catch (Exception e) {
                e.printStackTrace();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Kopieren Sie die Formel als relative Referenz

import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.poi.ss.formula.EvaluationWorkbook;
import org.apache.poi.ss.formula.FormulaParser;
import org.apache.poi.ss.formula.FormulaRenderer;
import org.apache.poi.ss.formula.FormulaRenderingWorkbook;
import org.apache.poi.ss.formula.FormulaType;
import org.apache.poi.ss.formula.ptg.AreaPtg;
import org.apache.poi.ss.formula.ptg.Ptg;
import org.apache.poi.ss.formula.ptg.RefPtgBase;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.xssf.usermodel.XSSFEvaluationWorkbook;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class CellFormulaCopy {

	public static void main(String[] args) {

		try(FileInputStream input = new FileInputStream("C:/work/Zelle.xlsx")){

			try(XSSFWorkbook book1 = (XSSFWorkbook) WorkbookFactory.create(input)){

				XSSFSheet sheet1 = book1.getSheet("Sheet1");  //Blatt"Sheet1"Erhalten

				Row row11 = sheet1.getRow(10);  //Holen Sie sich Linie 11
				Cell cell01 = row11.getCell(0);
				Cell cell02 = row11.createCell(1);  //Wenn Sie den Wert festlegen möchten, verwenden Sie createCell

				cell02.setCellFormula(cell01.getCellFormula());
				//Eine Kopie der Formel. Da Sie jedoch eine Zeichenfolge erhalten können, können Sie die relative Referenzformel nicht kopieren.

				copyFormula(cell01,cell02,book1);
				//Kopieren Sie die Formel als relative Referenz. Kopieren Sie die Formel von copyFormula nach cell02

				try(FileOutputStream out = new FileOutputStream("C:/work/Zelle.xlsx")) {
					book1.write(out);
				} catch (Exception e) {
					e.printStackTrace();
				}

			} catch (Exception e) {
				e.printStackTrace();
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}


	public static void copyFormula(Cell srcCell, Cell destCell, XSSFWorkbook book) {
	//Kopieren Sie die Formel als relative Referenz
	//srcCell-Kopierquelle destCell-Kopierziel

		String formula = srcCell.getCellFormula();
		EvaluationWorkbook ew;
		FormulaRenderingWorkbook rw;
		Ptg[] ptgs;

		ew = XSSFEvaluationWorkbook.create((XSSFWorkbook) book);
		ptgs = FormulaParser.parse(formula, (XSSFEvaluationWorkbook) ew, FormulaType.CELL, 0);
		//Ich kenne die Details nicht, aber der letzte Parameter gibt die Blattnummer ab 0 an
		rw = (XSSFEvaluationWorkbook) ew;

		for (Ptg ptg : ptgs) {
		//Koordinatenberechnung
			int shiftRows = destCell.getRowIndex() - srcCell.getRowIndex();
			int shiftCols = destCell.getColumnIndex() - srcCell.getColumnIndex();

			if (ptg instanceof RefPtgBase) {
				RefPtgBase ref = (RefPtgBase) ptg;

				if (ref.isColRelative()) {
					ref.setColumn(ref.getColumn() + shiftCols);
				}

				if (ref.isRowRelative()) {
					ref.setRow(ref.getRow() + shiftRows);
				}

			} else if (ptg instanceof AreaPtg) {
				AreaPtg ref = (AreaPtg) ptg;

				if (ref.isFirstColRelative()) {
					ref.setFirstColumn(ref.getFirstColumn() + shiftCols);
				}

				if (ref.isLastColRelative()) {
					ref.setLastColumn(ref.getLastColumn() + shiftCols);
				}

				if (ref.isFirstRowRelative()) {
					ref.setFirstRow(ref.getFirstRow() + shiftRows);
				}

				if (ref.isLastRowRelative()) {
					ref.setLastRow(ref.getLastRow() + shiftRows);
				}
			}
		}

		destCell.setCellFormula(FormulaRenderer.toFormulaString(rw, ptgs));
	}
}

Recommended Posts

Apache POI persönliches Memo Crossfish21
DDD persönliche Notizen
spielen Framework persönliche Notizen
[Apache POI] Entsprechende Excel-Version
Apache POI Addictive Point List
Persönliche Notizen des First Play Framework
Verwendung von Apache POI
Bearbeiten Sie Excel mit Apache POI
Apache POI Excel mit Kotlin
Ausgabe nach Excel mit Apache POI!
[Apache POI] Beurteilung unnötiger Zellen
In Liste sortieren, für persönliches Memo
Hinweise zum Lesen und Generieren von XLSX-Dateien aus Java mit Apache POI