Salut,
Déjà, on ne peut pas faire de switch autrement qu'avec des expressions constantes (int, String ou enum), donc tu ne peux pas faire de switch sur des instances de classe. Mais de toute manière ce n'est pas comme ça qu'il faut faire : il faut tester le type de la cellule et en fonction lire la valeur.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
|
public Object getCellValue(Sheet sheet, int rowNum, int colNum) {
Row row = sheet.getRow(rowNum);
if ( row==null ) {
return null;
}
else {
Cell cell = row.getCell(colNum);
if ( cell==null ) {
return null;
}
else {
return getCellValue(cell);
}
}
}
public Object getCellValue(Cell cell) {
switch (cell.getCellTypeEnum()) {
case CellType.STRING:
return cell.getRichStringCellValue().getString();
case CellType.NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
return cell.getDateCellValue();
} else {
return cell.getNumericCellValue();
}
case CellType.BOOLEAN:
return cell.getBooleanCellValue();
case CellType.FORMULA:
return evalCell(cell);
case CellType.BLANK:
return null;
default:
throw new IllegalStateException("Unknown cell type");
}
private Object evalCell(Cell cell) {
FormulaEvaluator evaluator = cell.getSheet().getWorkbook().getCreationHelper().createFormulaEvaluator();
CellValue cellValue = evaluator.evaluate(cell);
switch (cellValue.getCellType()) {
case Cell.CELL_TYPE_BOOLEAN:
return cellValue.getBooleanValue();
case Cell.CELL_TYPE_NUMERIC:
return cellValue.getNumberValue();
case Cell.CELL_TYPE_STRING:
return cellValue.getStringValue();
case Cell.CELL_TYPE_BLANK:
return null;
case Cell.CELL_TYPE_ERROR:
throw new RuntimeException("Excel formula error");
default:
throw new IllegalStateException("Unknown cell type");
}
} |
Ensuite, ne travaille pas avec HSSFWorkbook et consort, travaille avec les Workbook, ce qui te permettra de lire les XLS et XLSX avec le même code :
1 2 3 4 5 6 7 8 9
|
try(InputStream inputStream = Files.newInputStream(Paths.get(filename)){
Workbook wb = WorkbookFactory.create(inputStream);
Sheet sheet = wb.getSheetAt(0);
Object value = getCellvalue(sheet, 2, 3);
}
catch(IOException e) {
e.printStackTrace();
} |
Ensuite, pour les envoyer dans une JTable, tu peux faire :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
public TableModel readExcel(String filename, int sheetNum, boolean headerRow) throws IOException {
List<List<Object>> data=new ArrayList<>();
try(InputStream inputStream = Files.newInputStream(Paths.get(filename)){
Workbook wb = WorkbookFactory.create(inputStream);
Sheet sheet = wb.getSheetAt(sheetNum);
for(Row row : sheet) {
List<Object> line = new ArrayList<>();
for(Cell cell : row) {
try {
line.add( getCellValue(cell) );
}
catch(RuntimeException e) {
if ( "Excel formula error".equals(e.getMessage()) {
line.add("<ERROR>"); // par exemple
}
else {
throw e;
}
}
}
data.add(line);
}
if ( data.isEmpty() ) {
return new DefaultTableModel();
}
else if ( headerRow ) {
Object[][] dataArray = data.stream().skip(1).map(List::toArray).toArray(Object[][]::new);
String[] colnames = data.get(0).stream().map(String::valueOf).toArray(String[]::new);
if ( dataArray.length==0 ) {
return new DefaultTableModel(colnames, 0);
}
else {
return new DefaultTableModel(dataArray, colnames);
}
}
else {
Object[][] dataArray = data.stream().map(List::toArray).toArray(Object[][]::new);
String[] colnames = new String[dataArray[0].length];
for(int i=0; i<colnames.length; i++) {
colnames[i]="Column "+i;
}
return new DefaultTableModel(dataArray, colnames);
}
}
} |
Et pour créer la JTable, tu n'as plus qu'à faire :
new JTable( readExcel(filename, 0, true/* true si la première ligne contient les titres de colonnes, ou false sinon*/) );
Partager