Tant que je travaille en tant que SIer épris de Java et qui fournit des systèmes aux entreprises japonaises qui aiment Excel, Apache POI est inévitable. POI a une classe (interface) appelée «Cell» qui résume les cellules Excel, mais il est étonnamment difficile de récupérer les valeurs de cette «Cellule». En particulier, il est nécessaire d'appeler des méthodes en fonction du format d'affichage de __ cells (CellType
), et lorsqu'une méthode qui ne correspond pas à CellType
est appelée, une exception est immédiatement levée __. At-il été fait (´ ・ ω ・ `)
Par conséquent, j'ai décidé de préparer une méthode utilitaire __ qui peut obtenir de manière transparente la valeur de la cellule indépendamment de __CellType
. Les spécifications simples sont les suivantes.
. Cast ou
String # valueOf` ou ce que vous voulez. et
FORMULAnon pris en charge --Ce qui suit est un exemple, donc il lance une
RuntimeException, mais lorsque vous l'utilisez réellement, lancez une exception appropriée (?). --
nullPas sûr. Autrement dit, si l'argument est «null», il lance «NullPointerException». Une autre exception est lorsqu'une cellule de
CellType` qui n'est pas prise en charge par POI est passée en argument au cas où.package my.excel;
import java.util.Objects;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.DateUtil;
final public class CellUtils {
public static Object getCellValue(Cell cell) {
Objects.requireNonNull(cell, "cell is null");
CellType cellType = cell.getCellTypeEnum();
if (cellType == CellType.BLANK) {
return null;
} else if (cellType == CellType.BOOLEAN) {
return cell.getBooleanCellValue();
} else if (cellType == CellType.ERROR) {
throw new RuntimeException("Error cell is unsupported");
} else if (cellType == CellType.FORMULA) {
throw new RuntimeException("Formula cell is unsupported");
} else if (cellType == CellType.NUMERIC) {
if (DateUtil.isCellDateFormatted(cell)) {
return cell.getDateCellValue();
} else {
return cell.getNumericCellValue();
}
} else if (cellType == CellType.STRING) {
return cell.getStringCellValue();
} else {
throw new RuntimeException("Unknow type cell");
}
}
}
Utilisons-le réellement (´ ・ ω ・ `) Tout d'abord, préparons le sample.xlsx
suivant.
Après cela, écrivez le code suivant et vérifiez s'il peut être lu correctement.
package my.excel;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.apache.poi.EncryptedDocumentException;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
public class Main {
public static void main(String ... args) {
Path path = Paths.get("C:\\hogehoge\\sample.xlsx");
try (Workbook workbook = WorkbookFactory.create(Files.newInputStream(path))) {
Sheet sheet = workbook.getSheetAt(0);
for (int i = 0; i <= sheet.getLastRowNum(); i++) {
Row row = sheet.getRow(i);
Cell cell = row.getCell(1); //Obtenez la cellule de la colonne B.
Object value = CellUtils.getCellValue(cell);
System.out.println(value);
}
} catch (IOException
| InvalidFormatException
| EncryptedDocumentException e) {
e.printStackTrace();
}
}
}
Si vous regardez les résultats de la compilation et de l'exécution, vous verrez que cela fonctionne comme prévu. Je l'ai fait (´ ・ ω ・ `)
ABC
true
100.0
Mon Jan 02 00:00:00 JST 2017