1

I am trying to read an excel file and execute my test case accordingly, now the error I am getting is java.lang.IllegalStateException: Cannot get a STRING value from a NUMERIC cell Here is my implementation of the code: You might notice that I have user String.valueOf(); but to no avail.


    public static List<Map<String, String>> getTestDetails()
    {
        List<Map<String, String>> list = null;
        FileInputStream fileInputStream = null;
        try 
        {
           fileInputStream = new FileInputStream(FrameworkConstants.getExcelsheetspath()+"TestCasesToBeExecuted.xlsx");
           XSSFWorkbook workbook = new XSSFWorkbook(fileInputStream);
           XSSFSheet sheet = workbook.getSheet("RunManager");
                        
           int lastRowNum = sheet.getLastRowNum();
           int lastColNum = sheet.getRow(0).getLastCellNum();
                        
           Map<String, String> map = null;
           list = new ArrayList<Map<String,String>>();
                        
           for(int i=1; i<lastRowNum; i++)
           {
                map = new HashMap<String, String>();
                for(int j=0; j<lastColNum; j++)
                {
                    String key = sheet.getRow(0).getCell(j).getStringCellValue();
                    System.out.println("Value of key:: "+key);
                    String value = String.valueOf(sheet.getRow(i).getCell(j).getStringCellValue());
                    System.out.println("Value of value:: "+value);
                    map.put(key, value);
                }
                list.add(map);
            }
        } 
        catch (FileNotFoundException e) 
        {
            e.printStackTrace();
        }
        catch (IOException e) 
        {
            e.printStackTrace();
        }
                    
        if(Objects.nonNull(fileInputStream))
        {
            try 
            {
                fileInputStream.close();
            } 
            catch (IOException e) 
            {
                e.printStackTrace();
            }
       }
       return list; 
    }

And here is my code for method call:


public List<IMethodInstance> intercept(List<IMethodInstance> methods, ITestContext context) 
{
   List<Map<String, String>> list = ExcelUtils.getTestDetails();
   List<IMethodInstance> result = new ArrayList<IMethodInstance>();
    
   for(int i=0; i<methods.size(); i++)
   {
        for(int j=0; j<list.size(); j++)
        {
            if(methods.get(i).getMethod().equals(list.get(j).get("Test Name")))
            {
                if(list.get(j).get("Execute").equalsIgnoreCase("yes"))
                {
                    methods.get(i).getMethod().setDescription(list.get(j).get("Test Description")); 

methods.get(i).getMethod().setInvocationCount(Integer.parseInt(list.get(j).get("Count")));                          methods.get(i).getMethod().setPriority(Integer.parseInt(list.get(j).get("Priority")));
                result.add(methods.get(i));
                }
            }
        }
    }
 
  return result;
}

My imports are as follows

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.util.NumberToTextConverter;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
1

3 Answers 3

2

You can have check of Cell_Type before getting the cell value.

String value = null;
if (Sheet.getRow(i).getCell(0).getCellType() == Cell.CELL_TYPE_NUMERIC) {
  value = NumberToTextConverter.toText(Sheet.getRow(i).getCell(0).getNumericCellValue());
   } else
      value = Sheet.getRow(i).getCell(0).getStringCellValue();
  }

Imports:

import org.apache.poi.ss.util.NumberToTextConverter;
import org.apache.poi.ss.usermodel.Cell;

Maven dependencies:

    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.9</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.9</version>
    </dependency>

Remove the below import

import org.apache.poi.ss.usermodel.CellType;
Sign up to request clarification or add additional context in comments.

8 Comments

I did import the library you mentioned, but the Cell.CELL_TYPE ... is throwing error, Cell to be specific.
Guess I'm having a bad day sir! Now "CELL_TYPE_NUMERIC cannot be resolved or is not a field"
Can you post your imports in question or here?
added in code above
POI 3.9 is ancient - this code will not work in newer versions of POI - the other answer by Andreea Frincu is up to date
|
1

According to the doc https://poi.apache.org/apidocs/dev/org/apache/poi/xssf/usermodel/XSSFCell.html#getCellType--

You should be able to do:

String value = null;

    if (sheet.getRow(i).getCell(j).getCellType() == CellType.NUMERIC) {
        value=String.valueOf(sheet.getRow(i).getCell(j).getNumericCellValue());
    } else{
        value = sheet.getRow(i).getCell(j).getStringCellValue();
    }

Comments

0

In case of cell might have boolean, string, number which we don't know. i usually set the type and then get the value.

tempCell.setCellType(CellType.STRING);
tempCell.getStringCellValue();

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.