天天看点

java处理excel遇到的问题(easyPOI)

1. 表格有公式,但是导入的时候获取不到,都获取到0?

解决: 自己写一个处理类,不要用他自己的util,借助FormulaEvaluator 获取公式计算的值

package com.changcheng.excel.utils;

import com.changcheng.excel.pojo.ExcelMessage;
import com.changcheng.excel.pojo.ExcelMessage2;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.CellValue;
import org.apache.poi.ss.usermodel.FormulaEvaluator;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.util.ArrayList;
import java.util.List;

import static org.apache.poi.ss.usermodel.CellType.*;

/**
 * Created on 2021/8/23
 *
 * @Author ZFH
 */
public class ExcelReadUtil {

    private static FormulaEvaluator evaluator;

    public static List<ExcelMessage> getList(XSSFWorkbook workbook, Integer sheetNumber,Integer beginNumber) {
        evaluator = workbook.getCreationHelper().createFormulaEvaluator();
        XSSFSheet sheet = workbook.getSheetAt(sheetNumber);
        int lastRowNum = sheet.getLastRowNum();
        List<ExcelMessage> list = new ArrayList<>();
        for (int i = beginNumber; i < lastRowNum + 1; i++) {
            ExcelMessage excelMessage = new ExcelMessage();
            XSSFRow row = sheet.getRow(i);
            XSSFCell cell0 = row.getCell(0);
            excelMessage.setAddress(cell0.getStringCellValue());
            XSSFCell cell1 = row.getCell(1);
            excelMessage.setType(cell1.getStringCellValue());
            XSSFCell cell2 = row.getCell(2);
            excelMessage.setNumber(cell2.getStringCellValue());
            XSSFCell cell3 = row.getCell(3);
            evaluator.evaluateFormulaCell(cell3);
            CellValue cellValue = evaluator.evaluate(cell3);
            Integer celldata = new Double(cellValue.getNumberValue()).intValue();
            excelMessage.setIntType(String.valueOf(celldata));

            XSSFCell cell4 = row.getCell(4);
            evaluator.evaluateFormulaCell(cell4);
            CellValue cellValue2 = evaluator.evaluate(cell4);

            excelMessage.setSmallType(String.valueOf(cellValue2.getStringValue()));

            XSSFCell cell5 = row.getCell(5);
            evaluator.evaluateFormulaCell(cell5);
            CellValue cellValue3 = evaluator.evaluate(cell5);
            Double celldata3 = cellValue3.getNumberValue();
            excelMessage.setStart(String.valueOf(celldata3));
            XSSFCell cell6 = row.getCell(6);
            excelMessage.setBefore(cell6.getStringCellValue());
            XSSFCell cell7 = row.getCell(7);
            excelMessage.setMiddle1(cell7.getStringCellValue());
            XSSFCell cell8 = row.getCell(8);
            excelMessage.setMiddle2(cell8.getStringCellValue());
            XSSFCell cell9 = row.getCell(9);
            excelMessage.setLast(cell9.getStringCellValue());
            XSSFCell cell10 = row.getCell(10);
            evaluator.evaluateFormulaCell(cell10);
            CellValue cellValue10 = evaluator.evaluate(cell10);
            String celldata10= cellValue10.getStringValue();
            excelMessage.setAssemble(celldata10);
            XSSFCell cell11 = row.getCell(11);
            evaluator.evaluateFormulaCell(cell11);
            CellValue cellValue11 = evaluator.evaluate(cell11);
            String celldata11= cellValue11.getStringValue();
            excelMessage.setResult(celldata11);
            list.add(excelMessage);
        }
        return list;
    }

    public static List<ExcelMessage2> getList2(XSSFWorkbook workbook, Integer sheetNumber, Integer beginNumber) {
        evaluator = workbook.getCreationHelper().createFormulaEvaluator();
        XSSFSheet sheet = workbook.getSheetAt(sheetNumber);
        int lastRowNum = sheet.getLastRowNum();
        List<ExcelMessage2> list = new ArrayList<>();
        for (int i = beginNumber; i < lastRowNum + 1; i++) {
            ExcelMessage2 excelMessage = new ExcelMessage2();
            XSSFRow row = sheet.getRow(i);
            XSSFCell cell2 = row.getCell(2);
            excelMessage.setAddress(cell2.getStringCellValue());
            XSSFCell cell3 = row.getCell(3);
            excelMessage.setType(cell3.getStringCellValue());
            list.add(excelMessage);
        }
        return list;
    }
}