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