Apache POI,CREATE_NULL_AS_BLANK 导致错误

Paw*_*ana 3 java apache intellij-idea data-driven-tests apache-poi

现在我正在学习用 Java 编写数据驱动测试的教程。我的 IDE 是 IntelliJ 社区版,以下是我的代码

package utility;

import config.Constants;
import executionEngine.DriverScript;
import org.apache.poi.ss.usermodel.Row;
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.io.FileInputStream;
import java.io.FileOutputStream;

public class ExcelUtils {
    private static XSSFSheet ExcelWSheet;
    private static XSSFWorkbook ExcelWBook;
    private static XSSFCell Cell;
    private static XSSFRow Row;

    //This method is to set the File path and to open the Excel File
    //Pass Excel Path and Sheet Name as Arguments to this method
    public static void setExcelFile(String Path) throws Exception {
        try {
            FileInputStream ExcelFile = new FileInputStream(Path);
            ExcelWBook = new XSSFWorkbook(ExcelFile);
        }catch(Exception e){
            Log.error("Class Utils | Method setExcelFile | Exception desc: " + e.getMessage());
            DriverScript.bResult = false;
        }
    }

    @SuppressWarnings("static-access")
    //This method is used to write value in the excel sheet
    //This method accepts four arguments (Result, Row Number, Column Number, Sheet Name)
    public static void setCellData(String Result, int RowNum, int ColNum, String SheetName) throws Exception{
        try{
            ExcelWSheet = ExcelWBook.getSheet(SheetName);
            Row = ExcelWSheet.getRow(RowNum);

            // CHECK IF ERRORS HAPPEN AFTER THIS!!!!!!!!!!!!!!!!
            Cell = Row.getCell(ColNum, Row.CREATE_NULL_AS_BLANK);


            if(Cell == null){
                Cell = Row.createCell(ColNum);
                Cell.setCellValue(Result);
            }else{
                Cell.setCellValue(Result);
            }
            //Constant variables Test Data path and Test Data file name
            FileOutputStream fileOut = new FileOutputStream(Constants.Path_TestData);
            ExcelWBook.write(fileOut);
            //fielOut.flush();
            fileOut.close();
            ExcelWBook = new XSSFWorkbook(new FileInputStream(Constants.Path_TestData));
        }catch(Exception e){
            DriverScript.bResult = false;
        }
    }

    //This method is to read the test data from the Excel cell
    //In this we are passing Arguments as Row Num, Col Num & Sheet Name
    public static String getCellData(int RowNum, int ColNum, String SheetName) throws Exception{
        try{
            ExcelWSheet = ExcelWBook.getSheet(SheetName);
            Cell = ExcelWSheet.getRow(RowNum).getCell(ColNum);
            String CellData = Cell.getStringCellValue();
            return CellData;
        }catch(Exception e){
            Log.error("Class Utils | Method getCellData | Exception desc: " + e.getMessage());
            DriverScript.bResult = false;
            return "";
        }
    }

    //This method id to get the row count used of the excel sheet
    public static int getRowCount(String SheetName){
        int iNumber = 0;
        try {
            ExcelWSheet = ExcelWBook.getSheet(SheetName);
            iNumber = ExcelWSheet.getLastRowNum()+1;
        }catch(Exception e){
            Log.error("Class Utils | Method getRowCount | Exception desc: " + e.getMessage());
            DriverScript.bResult = false;
        }
        return iNumber;
    }

    //This method is to get the Row number of the test case
    //This method takes three arguments(Test Case Name, Column Number & Sheet name)
    public static int getRowContains(String sTestCaseName, int colNum, String SheetName) throws Exception{
        int iRowNum = 0;
        try{
            //ExcelWSheet = ExcelWBook.getSheet(SheetName);
            int rowCount = ExcelUtils.getRowCount(SheetName);
            for(; iRowNum<rowCount; iRowNum++){
                if(ExcelUtils.getCellData(iRowNum, colNum, SheetName).equalsIgnoreCase(sTestCaseName)){
                    break;
                }
            }
        }catch(Exception e){
            Log.error("Class Utils | Method getRowContains | Exception desc: " + e.getMessage());
            DriverScript.bResult = false;
        }
        return iRowNum;
    }

    //This method is to get the count of the test steps of test case
    //This method takes three arguments (Sheet name, Test Case ID & Test case row number)
    public static int getTestStepsCount(String SheetName, String sTestCaseID, int iTestCaseStart) throws Exception{
        try{
            for(int i=iTestCaseStart; i<=ExcelUtils.getRowCount(SheetName); i++){
                if(!sTestCaseID.equals(ExcelUtils.getCellData(i, Constants.Col_TestCaseID, SheetName))){
                    int number = i;
                    return number;
                }
            }
            ExcelWSheet = ExcelWBook.getSheet(SheetName);
            int number = ExcelWSheet.getLastRowNum()+1;
            return number;
        }catch(Exception e){
            Log.error("Class Utils | Method getTestStepsCount | Exception desc: " + e.getMessage());
            DriverScript.bResult = false;
            return 0;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我现在的问题是以下部分:

public static void setCellData(String Result, int RowNum, int ColNum, String SheetName) throws Exception{
    try{
        ExcelWSheet = ExcelWBook.getSheet(SheetName);
        Row = ExcelWSheet.getRow(RowNum);

        // CHECK IF ERRORS HAPPEN AFTER THIS!!!!!!!!!!!!!!!!
        Cell = Row.getCell(ColNum, Row.CREATE_NULL_AS_BLANK);
Run Code Online (Sandbox Code Playgroud)

我现在不知道该怎么办... CREATE_NULL_AS_BLANK 被标记为红色并显示“无法解析符号”,并且我的数据驱动框架的每一步都失败了。

我试着用它

org.apache.poi.ss.usermodel.Row.MissingCellPolicy.CREATE_NULL_AS_BLANK;
Run Code Online (Sandbox Code Playgroud)

使用此代码,我可以执行我的代码,但我的框架只执行粉碎前的第一步

这是我的日志

2017-10-16 13:19:50,093 INFO  [Log] **************************************************************************************** 
2017-10-16 13:19:50,093 INFO  [Log] **************************************************************************************** 
2017-10-16 13:19:50,093 INFO  [Log] $$$$$$$$$$$$$$$$$$$$$                 Wikipedia_01       $$$$$$$$$$$$$$$$$$$$$$$$$ 
2017-10-16 13:19:50,093 INFO  [Log] **************************************************************************************** 
2017-10-16 13:19:50,093 INFO  [Log] **************************************************************************************** 
2017-10-16 13:19:50,094 ERROR [Log] Class Utils | Method getCellData | Exception desc: null 
2017-10-16 13:19:50,094 INFO  [Log] Opening Browser 
2017-10-16 13:19:53,388 INFO  [Log] Closing the browser 
2017-10-16 13:19:54,069 INFO  [Log] XXXXXXXXXXXXXXXXXXXXXXX             -E---N---D-             XXXXXXXXXXXXXXXXXXXXXX 
2017-10-16 13:19:54,069 INFO  [Log] X 
2017-10-16 13:19:54,069 INFO  [Log] X 
2017-10-16 13:19:54,069 INFO  [Log] X 
2017-10-16 13:19:54,069 INFO  [Log] X 
Run Code Online (Sandbox Code Playgroud)

我希望有人能帮我解决这个问题,因为它让我发疯。

编辑:在我添加“setCellData”部分之前,框架运行良好,每一步都完美无缺。在那之后直接发生了错误

Jon*_*nyD 7

替换你Row.CREATE_NULL_AS_BLANKRow.MissingCellPolicy.CREATE_NULL_AS_BLANK

并使用您的“常规”Row进口(例如:import org.apache.poi.ss.usermodel.Row;

我使用的是 v3.14,将其更新到 v3.17 并得到相同的错误。在这些版本之间的某个地方, CREATE_NULL_AS_BLANK 被打包在 MissingCellPolicy 枚举中,因此出现错误。