赞
踩
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.*;
import java.io.IOException;
import java.io.InputStream;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
@Override public List<GreenMaintenanceSeedlingPlanList> exportExcel(MultipartFile file) throws IOException { //excel 日期格式 YYYY-MM-DD LocalDate epochStart = LocalDate.of(1899, 12, 30); //可处理.xls 或 .xlsx后缀的excel文件 Workbook workbook; try (InputStream inputStream = file.getInputStream()) { workbook = WorkbookFactory.create(inputStream); } catch (InvalidFormatException e) { throw new RuntimeException(e); } //运算单元格处理 FormulaEvaluator formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator(); //创建List存储数据 List<GreenMaintenanceSeedlingPlanList> greenMaintenanceSeedlingPlanList = new ArrayList<>(); Sheet sheetAt = workbook.getSheetAt(0); //获取最后一行 int lastRowNum = sheetAt.getLastRowNum(); //从第三行 for (int i = 2; i <= lastRowNum; i++) { GreenMaintenanceSeedlingPlanList maintenanceSeedlingPlanList = new GreenMaintenanceSeedlingPlanList(); Row row = sheetAt.getRow(i); if (row != null && !isRowEmpty(row)) { // 判断row是否为null && 判断某行是否为空行 maintenanceSeedlingPlanList.setSeedlingName(getCellValueAsString(row.getCell(0))); maintenanceSeedlingPlanList.setSpecification(getCellValueAsString(row.getCell(1))); maintenanceSeedlingPlanList.setContractArea(getNumericCellValue(row.getCell(2))); maintenanceSeedlingPlanList.setDensity(getNumericCellValue(row.getCell(3))); maintenanceSeedlingPlanList.setDensityUnit(getCellValueAsString(row.getCell(4))); maintenanceSeedlingPlanList.setPredictReplanting(getNumericCellValue(row.getCell(5))); maintenanceSeedlingPlanList.setPredictSingle(getNumericCellValue(row.getCell(6))); //运算单元格,不处理有值也会返回null maintenanceSeedlingPlanList.setPlanPayOut(getNumericCellValueCalculate(row.getCell(7),formulaEvaluator)); maintenanceSeedlingPlanList.setRealityReplanting(getNumericCellValue(row.getCell(8))); maintenanceSeedlingPlanList.setRealitySingle(getNumericCellValue(row.getCell(9))); //运算单元格,不处理有值也会返回null maintenanceSeedlingPlanList.setRealityPayOut(getNumericCellValueCalculate(row.getCell(10),formulaEvaluator)); //日期格式处理,excel中输入的是YYYY/MM/DD格式,而后端实际接收到的是数值,需要转换成YYYY-MM-DD格式 maintenanceSeedlingPlanList.setRepairDate(getRepairDate(row.getCell(11), epochStart)); greenMaintenanceSeedlingPlanList.add(maintenanceSeedlingPlanList); } } return greenMaintenanceSeedlingPlanList; } /** * 判断某一行是否全部为空 * @param row * @return */ private boolean isRowEmpty(Row row) { if (row == null) { return true; } for (int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++) { Cell cell = row.getCell(i, Row.MissingCellPolicy.RETURN_BLANK_AS_NULL); if (cell != null && cell.getCellTypeEnum() != CellType.BLANK) { return false; } } return true; } /** * 处理String类型格式 * @param cell * @return */ private String getCellValueAsString(Cell cell) { if (cell == null) { return null; } switch (cell.getCellTypeEnum()) { case STRING: return cell.getStringCellValue(); case NUMERIC: return String.valueOf(cell.getNumericCellValue()); default: return null; } } /** * 处理Double(Number)类型格式 * @param cell * @return */ private Double getNumericCellValue(Cell cell) { if (cell == null) { return null; } if (cell.getCellTypeEnum() == CellType.STRING) { return Double.valueOf(cell.getStringCellValue()); } if (cell.getCellTypeEnum() == CellType.NUMERIC) { return cell.getNumericCellValue(); } return null; } /** * 处理LocalDate日期格式 转换成 YYYY-MM-DD * @param cell * @param epochStart * @return */ private LocalDate getRepairDate(Cell cell, LocalDate epochStart) { if (cell == null) { return null; } if (cell.getCellTypeEnum() == CellType.NUMERIC) { double repairDateValue = cell.getNumericCellValue(); return epochStart.plus((long) repairDateValue, ChronoUnit.DAYS); } return null; } /** * 单元格运算得到的结果 * @param cell * @param formulaEvaluator * @return */ private Double getNumericCellValueCalculate(Cell cell, FormulaEvaluator formulaEvaluator) { return this.getCellValueAsNumericCalculateFunc(cell, formulaEvaluator); } /** * 处理单元格运算结果 * @param cell * @param formulaEvaluator * @return */ public Double getCellValueAsNumericCalculateFunc(Cell cell, FormulaEvaluator formulaEvaluator) { if (cell == null) { return null; } if (cell.getCellTypeEnum() == CellType.NUMERIC) { return cell.getNumericCellValue(); } else if (cell.getCellTypeEnum() == CellType.FORMULA) { if (formulaEvaluator != null) { CellValue cellValue = formulaEvaluator.evaluate(cell); return cellValue.getNumberValue(); } else { throw new IllegalArgumentException("Formula cell found but formula evaluator is not provided."); } } return null; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。