[JAVA] apache POI mémo personnel crossfish21

opération de base

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 qui enregistre les valeurs de paramètre liées au client pour chaque utilisateur dans la base de données
*/
public class Class01 {

  /*
     *Renvoie une cellule.
     *
     * @param args
     *ligne
     */
  public static void main(String[] args) {

//        aaa();   //Créer un nouveau livre
//        bbb();   //Importer un classeur existant
//        blankCheck();   //Chèque en blanc
        rowAndColumn();   //Manipulation des lignes et des colonnes
//        book();   //Opération de livre
//        cell();  //Fonctionnement de la cellule



    }

  public static void aaa() {

        try(XSSFWorkbook book1 = new XSSFWorkbook()) {

            XSSFSheet sheet1 = book1.createSheet("Feuille 01");
            //Créez une feuille. La feuille n'existe pas à l'état initial

            XSSFRow row01 = sheet1.createRow(0);
            //Instanciation de ligne. La première ligne devient 0

            XSSFCell cell01 = row01.createCell(0);
            //Instanciation de cellule. La première colonne devient 0

            cell01.setCellValue("AAA");  //Définir la valeur de la cellule


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

            XSSFCell cell03 = row01.createCell(2);
            cell03.setCellFormula("A1&B1");  //Définissez la formule de la cellule. Il semble que "=" ne soit pas nécessaire


            try(FileOutputStream out = new FileOutputStream("C:/work/aaa.xlsx")) {
                book1.write(out);
                //Sortie sous forme de nouveau livre. Si vous spécifiez un chemin de fichier existant, il sera écrasé
            } catch (Exception e) {
                e.printStackTrace();
            }

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



    public static void bbb(){  //Importer un classeur existant

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

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

                //* Il semble qu'il n'y ait pas de problème de lecture même si la feuille est protégée.

                XSSFSheet sheet1 = book1.getSheet("Sheet1");  //Feuille"Sheet1"Avoir
                Row row02 = sheet1.getRow(1);  //Obtenez la deuxième ligne
                Cell cell01 = row02.getCell(0);  //Obtenez la cellule A1 dans la deuxième ligne
                Cell cell02 = row02.getCell(1);  //Obtenez la cellule B1 dans la deuxième ligne
                Cell cell03 = row02.getCell(2);

                String str1 = cell01.getStringCellValue();
                //Obtenez la chaîne de cellule. Notez que si la valeur de la cellule est une valeur numérique, une erreur de lecture se produira.
                System.out.println(str1);

                Double double01 = cell02.getNumericCellValue();
                //Obtenez le numéro
                System.out.println(double01);

                try {
                    String str3 = cell03.getCellFormula();
                    //Obtenez la formule. Une erreur se produira si autre chose que la formule est incluse.
                    System.out.println(str3);
                } catch (IllegalStateException e) {
                    //IllegalStateException se produit lorsqu'une formule est extraite d'une cellule qui contient autre chose que la formule
                    e.printStackTrace();
                }


                //Obtenir les paramètres de cellule
                System.out.println(cell01.getColumnIndex());  //Obtenez le numéro de colonne. Notez que les nombres commencent à 0
                System.out.println(cell01.getRowIndex());  //Obtenez le numéro de ligne. Notez que les nombres commencent à 0
                System.out.println(cell01.getAddress());  //Obtenez l'adresse de la cellule. Cela obtiendra l'adresse Excel telle qu'elle est

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

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



    public static void blankCheck(){  //Vérifiez si la cellule est vide

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

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

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

                //Et si une cellule vide
                Row row03 = sheet1.getRow(2);  //Obtenez la 3ème ligne
                Cell cell01 = row03.getCell(0);
                Cell cell02 = row03.getCell(1);
                Cell cell03 = row03.getCell(2);

                if (cell01 == null || cell01.getCellType() == Cell.CELL_TYPE_BLANK) {
                //Cela déterminera s'il est vide. Une vérification nulle est-elle nécessaire??
                    System.out.println("cellule" + cell01.getAddress() + "Est vide");
                }else{
                    String str1 = cell01.getStringCellValue();
                    System.out.println(str1);
                }


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

                if (cell03 == null || cell03.getCellType() == Cell.CELL_TYPE_BLANK) {
                    System.out.println("cellule" + cell03.getAddress() + "Est vide");
                }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/Lignes et colonnes.xlsx")){

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

                XSSFSheet sheet1 = book1.getSheet("Sheet1");  //Feuille"Sheet1"Avoir
//                Row row05 = sheet1.getRow(4);  //Obtenez la 5ème ligne
//                row05.setZeroHeight(true);
//                //Tu veux te cacher. Les lignes déjà masquées ne génèrent pas d'erreur
//
//                Row row08 = sheet1.getRow(7);
//                row08.setZeroHeight(false);
//                //Réaffichez les colonnes masquées. Les lignes qui ne sont pas masquées n'entraînent pas d'erreur
//
//                Row row11 = sheet1.getRow(10);
//                sheet1.removeRow(row11);
//                //Suppression de la valeur de la 11e ligne entière(Semble être).. La ligne elle-même n'est pas supprimée
//                //La ligne elle-même n'est pas supprimée, mais il semble que tous les formats de cellule et les bordures ont été effacés.
//
//                Row row12 = sheet1.getRow(11);
//                row12.setHeightInPoints(50.25F);
//                //Définissez la hauteur de la ligne. Il doit être flottant. 0.Ensemble de 25 unités. Même si vous effectuez des réglages plus fins, il peut être arrondi
//
//                sheet1.shiftRows(9,14,-5);
//                //Déplacer les 10e à 15e lignes de 5 lignes. Possible même s'il y a une cellule fusionnée
//                //Le format de la cellule et les bordures sont également reflétés tels quels
//
//                book1.setForceFormulaRecalculation(true);
//                //Si le résultat du calcul de la formule devient étrange en raison du mouvement de la ligne ou de la suppression du contenu de la ligne, il est recommandé de recalculer comme ci-dessus.




                // ※  Row row05 = sheet1.getRow(4);Il semble qu'il soit possible d'opérer sur une base de lignes, mais pas sur une base de colonnes.

                sheet1.setColumnHidden(4, true);  //Masquer la 5e colonne
                sheet1.setColumnHidden(7, false);  //Réafficher la troisième colonne




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

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

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




    public static void book(){  //Relatif au livre

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

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

                XSSFSheet sheet1 = book1.getSheet("Sheet1");  //Feuille"Sheet1"Avoir
                Row row01 = sheet1.getRow(0);  //Obtenez la première ligne

                book1.setForceFormulaRecalculation(true);  //Effectuer un recalcul


                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(){  //Lié à la cellule

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

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

                XSSFSheet sheet1 = book1.getSheet("Sheet1");  //Feuille"Sheet1"Avoir


                Row row11 = sheet1.getRow(10);  //Obtenez la ligne 11
                Cell cell01 = row11.getCell(0);
                Cell cell02 = row11.createCell(1);  //Si vous souhaitez définir la valeur, utilisez createCell
//                cell02.setCellFormula(cell01.getCellFormula());
                //Une copie de la formule. Cependant, puisque vous pouvez obtenir une chaîne de caractères, vous ne pouvez pas copier la formule de référence relative.
                copyCell2Cell(cell01,cell02,book1);


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

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

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

Copiez la formule par référence relative

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/cellule.xlsx")){

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

				XSSFSheet sheet1 = book1.getSheet("Sheet1");  //Feuille"Sheet1"Avoir

				Row row11 = sheet1.getRow(10);  //Obtenez la ligne 11
				Cell cell01 = row11.getCell(0);
				Cell cell02 = row11.createCell(1);  //Si vous souhaitez définir la valeur, utilisez createCell

				cell02.setCellFormula(cell01.getCellFormula());
				//Une copie de la formule. Cependant, puisque vous pouvez obtenir une chaîne de caractères, vous ne pouvez pas copier la formule de référence relative.

				copyFormula(cell01,cell02,book1);
				//Copiez la formule par référence relative. Copiez la formule de copyFormula dans la cellule02

				try(FileOutputStream out = new FileOutputStream("C:/work/cellule.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) {
	//Copiez la formule par référence relative
	//srcCell copie source destination de la copie destCell

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

		ew = XSSFEvaluationWorkbook.create((XSSFWorkbook) book);
		ptgs = FormulaParser.parse(formula, (XSSFEvaluationWorkbook) ew, FormulaType.CELL, 0);
		//Je ne connais pas les détails, mais le dernier paramètre spécifie le numéro de feuille à partir de 0
		rw = (XSSFEvaluationWorkbook) ew;

		for (Ptg ptg : ptgs) {
		//Calcul des coordonnées
			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 mémo personnel crossfish21
Notes personnelles DDD
jouer des notes personnelles de cadre
[Apache POI] Version Excel correspondante
Liste de points addictifs Apache POI
Notes personnelles de First Play Framework
Comment utiliser Apache POI
Manipuler Excel avec Apache POI
Apache POI Excel avec Kotlin
Sortie vers Excel en utilisant Apache POI!
[Apache POI] Jugement des cellules inutiles
Trier dans la liste, pour mémo personnel
Notes pour lire et générer des fichiers xlsx à partir de Java à l'aide d'Apache POI