0
votes

Existe-t-il un moyen de définir des variables à l'intérieur si des déclarations visibles et utilisables en dehors de la déclaration elle-même?

J'ai besoin de créer un HSSFWorkbook ou un objet XSSFWorkBook, en fonction de ce que j'ai lu comme extension de fichier, puis de pouvoir continuer les opérations et que l'objet créé. Comment puis-je rendre l'objet Visibile à l'extérieur de la déclaration IF, afin que je puisse l'utiliser "globalement"?

J'ai essayé avec une méthode, mais nous savons qu'une méthode ne peut renvoyer qu'un type d'objet et je traite avec 2 Types d'objet possibles Sortie (classeur HSSF / XSSF) P>

String excelFilePath = "D://"; //path
String fileName = "BetsTable"; //filename
String extension = "xls"; //extension
String completePath = excelFilePath + fileName + "." + extension; //fullpath

FileInputStream inputStream = new FileInputStream(new 
File(completePath));

if(extension == "xls") { 
    HSSFWorkbook workbook = new HSSFWorkbook(inputStream);                      
}
if(extension == "xlsx") {
    XSSFWorkbook workbook = new XSSFWorkbook(inputStream);                      
}

Sheet firstSheet = workbook.getSheetAt(0); // !!! WORKBOOK IS NOW NOT 
"USABLE"


1 commentaires

Dupliqué possible de Variables de la portée de bloc


3 Réponses :


3
votes

En bref, non.

Mais, vous pouvez garder une feuille code> en dehors de la portée intérieure, il vous suffit de le définir dans la portée dont vous en avez besoin: P>

Sheet sheet = null;
if(extension == "xls") { 
    HSSFWorkbook workbook = new HSSFWorkbook(inputStream);     
    sheet = workbook.getSheetAt(0);                 
}
if(extension == "xlsx") {
    XSSFWorkbook workbook = new XSSFWorkbook(inputStream);       
    sheet = workbook.getSheetAt(0);               
}

// sheet is accessible from here
doSomething(sheet);


4 commentaires

C'est une option très intelligente, car je ne devrais traiter que la feuille. Je vais essayer ça! Merci beaucoup!!


C'est une bonne solution. Fondamentalement, vous n'avez plus besoin de l'objet du classeur en dehors des déclarations de si. Si vous en avez besoin, vous devez trouver la "classe des parents" des deux classes de classeur. Disons que c'est une classe appelée classeur . Ensuite, avant d'entrer les déclarations Si vous définissez la variable workbook workbook = null et à l'intérieur de votre IFS, vous les instanciez workbook = nouveau hssfworkbook .. . Ensuite, votre variable de classeur est connue en dehors de l'IFS, mais porte des implémentations différentes, en fonction de l'IFS.


J'ai cherché un classeur superclasse pour hssfworkbook et xssfworkbook mais il semble qu'il n'y en a pas comme celui-ci: /. Cependant, cela fonctionnerait également dans d'autres contextes


@ Cameron1024: Avez-vous regardé dans le Javadoc? interface de classeur



1
votes

Il est possible que les deux variables partageent un type commun, et si vous ne vous attendez pas à utiliser une méthode uniquement dans l'une de ces classes.

Dans votre cas, les deux classes implémentent l'interface workbook et c'est là que la méthode getSheettat ( int) code> est défini. p>

Workbook workbook = null;
if(extension == "xls") { // that's bad, use equals
    workbook = new HSSFWorkbook(inputStream);                      
}
if(extension == "xlsx") { // that's bad, use equals
    workbook = new XSSFWorkbook(inputStream);                      
}
Sheet firstSheet = workbook.getSheetAt(0);


0 commentaires