У меня есть лист Excel с колонкой даты, когда я запускаю свою программу, я получил эту ошибку:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Cannot get a STRING value from a NUMERIC cell
Мой код, который я запускаю:
String date =sheets.getRow(choosenRow).getCell(3).getStringCellValue().toString();
Как я могу преобразовать числовое значение в строку? в моем случае я использовал .toString();
, но, похоже, это не сработало.
4 ответа
Лучший ответ
Я считаю, что это потому, что вы используете .getStringCellValue()
, когда вы должны использовать getNumericCellValue()
. .getStringCellValue()
нельзя использовать с ЦИФРОВЫМИ ячейками. Я предполагаю, что вы используете Apache POI.
См. https://poi.apache.org/apidocs /org/apache/poi/ss/usermodel/Cell.html для получения дополнительной информации.
Я не уверен, почему за меня проголосовали. Можете ли вы дать мне знать в комментариях о том, как я могу переписать его, чтобы было более понятно (если это проблема), или скажите, как это неправильно?
1
MajikalExplosions
17 Июл 2018 в 07:45
Я не проверял твой код ..!
Но
Вы должны попробовать Object
класс, чтобы получить данные из этого файла Excel. если данные успешно получены. тогда вы можете конвертировать в дату или строку.
Любить :
Object objdata = sheets.getRow(choosenRow).getCell(3).getStringCellValue();
0
Bhola
17 Июл 2018 в 07:32
Ошибка говорит вам, что в ячейке типа NUMERIC
вы можете использовать соответствующий метод getNumericCellValue()
String date = "" + sheets.getRow(choosenRow).getCell(3).getNumericCellValue();
Если вы раньше не знали тип и вам нужно прочитать некоторые значения, вы можете добавить switch
к типу (getCellType()
) и из результата этого перечисления использовать правильный метод
Специально для числового типа вы можете проверить элемент даты:
public String getContent(Cell c){
switch(c.getCellType()){
case: NONE : throw new IllegalArgumentException("NONE");
case: BLANK : return "";
case: BOOLEAN : return ""+c.getBooleanCellValue();
case: ERROR : return ""+c.getErrorCellValue()
case: FORMULA : return c.getCellFormula()
case: NUMERIC : return HSSFDateUtil.isCellDateFormatted(c)) ?
c.getDateCellValue()) : ""+c.getNumericCellValue();
case: STRING : return c.getStringCellValue()
}
См. Как читать Excel ячейка с датой в Apache POI?
-1
azro
17 Июл 2018 в 08:01
Спасибо всем, теперь все работает отлично. Я изменил код, чтобы быть таким:
Date date =sheets.getRow(choosenRow).getCell(3)getDateCellValue();
dateTextField.setText(""+date);
0
mona
18 Июл 2018 в 06:41
Я пытаюсь использовать данные из электронной таблицы в Excel, но всегда из этой ошибки уже пробовал форматировать рабочий лист на текст и номер, и все еще ошибка сохраняется.
Я видел, как человек, использующий его, разрешил cell.setCellType ( Cell.CELL_TYPE_STRING ) ;
, но я не знаю, где я вписываю этот фрагмент в свой код.
WebElement searchbox = driver.findElement(By.name("j_username"));
WebElement searchbox2 = driver.findElement(By.name("j_password"));
try {
FileInputStream file = new FileInputStream(new File("C:\paulo.xls"));
HSSFWorkbook workbook = new HSSFWorkbook(file);
HSSFSheet sheet = workbook.getSheetAt(0);
for (int i=1; i <= sheet.getLastRowNum(); i++){
String j_username = sheet.getRow(i).getCell(0).getStringCellValue();
String j_password = sheet.getRow(i).getCell(0).getStringCellValue();
searchbox.sendKeys(j_username);
searchbox2.sendKeys(j_password);
searchbox.submit();
driver.manage().timeouts().implicitlyWait(10000, TimeUnit.MILLISECONDS);
}
workbook.close();
file.close();
} catch (FileNotFoundException fnfe) {
fnfe.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
Ответ 1
Форматтер будет работать нормально в этом случае.
import org.apache.poi.ss.usermodel.DataFormatter;
FileInputStream fis = new FileInputStream(workbookName);
Workbook workbook = WorkbookFactory.create(fis);
Sheet sheet = workbook.getSheet(sheetName);
DataFormatter formatter = new DataFormatter();
String val = formatter.formatCellValue(sheet.getRow(row).getCell(col));
list.add(val); //Adding value to list
Ответ 2
Cell cell = sheet.getRow(i).getCell(0);
cell.setCellType ( Cell.CELL_TYPE_STRING );
String j_username = cell.getStringCellValue();
Забастовкa >
UPDATE
Хорошо, как было сказано в комментариях, несмотря на это, это неправильный метод извлечения данных из ячейки Excel.
В соответствии с руководством здесь:
Если то, что вы хотите сделать, это получить значение String для вашей числовой ячейки, стоп!. Это не способ сделать это. Вместо этого, для извлечения строки значение числовой или логической или даты ячейки, вместо этого используйте DataFormatter.
И в соответствии с API DataFormatter
DataFormatter содержит методы форматирования значения, хранящегося в Cell. Это может быть полезно для отчетов и графических интерфейсов, когда вы необходимо отображать данные точно так, как они отображаются в Excel. Поддерживаемые форматы включают в себя валюту, SSN, проценты, десятичные знаки, даты, номера телефонов, почтовые индексы и т.д.
Итак, правильный способ показать числовое значение ячейки выглядит следующим образом:
DataFormatter formatter = new DataFormatter(); //creating formatter using the default locale
Cell cell = sheet.getRow(i).getCell(0);
String j_username = formatter.formatCellValue(cell); //Returns the formatted value of a cell as a String regardless of the cell type.
Ответ 3
Как объяснено в Apache POI Javadocs, вы не должны использовать cell.setCellType(Cell.CELL_TYPE_STRING)
для получения строкового значения числовой ячейки, ll освободить все форматирование
Вместо этого, как объясняет javadocs, вы должны использовать DataFormatter
То, что DataFormatter делает, принимает значение с плавающей запятой, представляющее ячейку, хранится в файле вместе с применяемыми к нему правилами форматирования и возвращает вам строку, которая выглядит так, как это делает ячейка в Excel.
Итак, если вы после строки ячейки, выглядящей так же, как и в Excel, просто выполните:
// Create a formatter, do this once
DataFormatter formatter = new DataFormatter(Locale.US);
.....
for (int i=1; i <= sheet.getLastRowNum(); i++) {
Row r = sheet.getRow(i);
if (r == null) {
// empty row, skip
} else {
String j_username = formatter.formatCellValue(row.getCell(0));
String j_password = formatter.formatCellValue(row.getCell(1));
// Use these
}
}
Форматирующий элемент вернет ячейки String как есть, а для числовых ячеек будут применяться правила форматирования по стилю к числу элементов
Ответ 4
С помощью DataFormatter
эта проблема разрешена. Спасибо «Гагравар» за начальную должность.
DataFormatter formatter = new DataFormatter();
String empno = formatter.formatCellValue(cell0);
Ответ 5
CellType cell = row.getCell(j).getCellTypeEnum();
switch(cell) {
case NUMERIC:
intVal = row.getCell(j).getNumericCellValue();
System.out.print(intVal);
break;
case STRING:
stringVal = row.getCell(j).getStringCellValue();
System.out.print(stringVal);
break;
}
Ответ 6
Используйте этот код, который определенно работает, и я его модифицировал.
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
//import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.*;
public class TestApp {
public static void main(String[] args) throws Exception {
try {
Class forName = Class.forName("com.mysql.jdbc.Driver");
Connection con = null;
con = DriverManager.getConnection("jdbc:mysql://localhost/tables", "root", "root");
con.setAutoCommit(false);
PreparedStatement pstm = null;
FileInputStream input = new FileInputStream("C:\Users\Desktop\a1.xls");
POIFSFileSystem fs = new POIFSFileSystem(input);
Workbook workbook;
workbook = WorkbookFactory.create(fs);
Sheet sheet = workbook.getSheetAt(0);
Row row;
for (int i = 1; i <= sheet.getLastRowNum(); i++) {
row = (Row) sheet.getRow(i);
String name = row.getCell(0).getStringCellValue();
String add = row.getCell(1).getStringCellValue();
int contact = (int) row.getCell(2).getNumericCellValue();
String email = row.getCell(3).getStringCellValue();
String sql = "INSERT INTO employee (name, address, contactNo, email) VALUES('" + name + "','" + add + "'," + contact + ",'" + email + "')";
pstm = (PreparedStatement) con.prepareStatement(sql);
pstm.execute();
System.out.println("Import rows " + i);
}
con.commit();
pstm.close();
con.close();
input.close();
System.out.println("Success import excel to mysql table");
} catch (IOException e) {
}
}
}
Ответ 7
Это будет работать:
WebElement searchbox = driver.findElement(By.name("j_username"));
WebElement searchbox2 = driver.findElement(By.name("j_password"));
try {
FileInputStream file = new FileInputStream(new File("C:\paulo.xls"));
HSSFWorkbook workbook = new HSSFWorkbook(file);
HSSFSheet sheet = workbook.getSheetAt(0);
for (int i=1; i <= sheet.getLastRowNum(); i++){
HSSFCell j_username = sheet.getRow(i).getCell(0)
HSSFCell j_password = sheet.getRow(i).getCell(0)
//Setting the Cell type as String
j_username.setCellType(j_username.CELL_TYPE_STRING)
j_password.setCellType(j_password.CELL_TYPE_STRING)
searchbox.sendKeys(j_username.toString());
searchbox2.sendKeys(j_password.toString());
searchbox.submit();
driver.manage().timeouts().implicitlyWait(10000, TimeUnit.MILLISECONDS);
}
workbook.close();
file.close();
} catch (FileNotFoundException fnfe) {
fnfe.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
}
Ответ 8
используйте код cell.setCellType(Cell.CELL_TYPE_STRING); перед прочтением строкового значения, которое может вам помочь. Я использую версию POI 3.17 Beta1, конечно, совместимость версии также..
Ответ 9
Это один из других способов решения ошибки: «Не удается получить текстовое значение из числовой ячейки» Poi «»
Перейти к листу Excel. Перетащите и выберите цифры, которые вы импортируете данные из листа Excel. Перейдите в «Формат»> «Число»> «Выберите обычный текст», затем «Экспортируйте как .xlsx». Теперь попробуйте запустить скрипт
Надежда работает отлично…!
Не удается получить текстовое значение из числовой ячейки «Poi».img
Ответ 10
Если вы обрабатываете строки с помощью cellIterator…. тогда это работает для меня….
DataFormatter formatter = new DataFormatter();
while(cellIterator.hasNext())
{
cell = cellIterator.next();
String val = "";
switch(cell.getCellType())
{
case Cell.CELL_TYPE_NUMERIC:
val = String.valueOf(formatter.formatCellValue(cell));
break;
case Cell.CELL_TYPE_STRING:
val = formatter.formatCellValue(cell);
break;
}
.....
.....
}
Ответ 11
Если вы используете конфигурацию Excel Data для какой-либо платформы или извлекаете данные из Excel, скопируйте код ниже.
Это будет полезно для извлечения как строки, так и числового значения из Excel. Он также будет полезен для получения мобильных номеров из Excel, и если вы не хотите десятичного формата.
public class ExcelDataConfig {
XSSFWorkbook wb;
XSSFSheet sheet;
public ExcelDataConfig(String excelPath)
{
try {
File src=new File(excelPath);
FileInputStream fis=new FileInputStream(src);
wb=new XSSFWorkbook(fis);
}
catch (Exception e) {
System.out.println(e.getMessage());
}
}
public String getData(int sheetNumber,int row,int column)
{
DataFormatter formatter = new DataFormatter();
sheet=wb.getSheetAt(sheetNumber);
String data1 = formatter.formatCellValue(sheet.getRow(row).getCell(column));
// String data =sheet.getRow(row).getCell(column).getStringCellValue();
// return data;
return data1;
}
}
I’m trying to import data from Excel file to automate a large amount of data but I got the error «Cannot get a STRING value from a NUMERIC cell» as some of the cells has a numeric values and others has a text value.I need to extract all data and insert it as inputs for the page fields. i got the error stating from
signin_credentials[i][2] = configuration.getData(0, i, 5);
signin_credentials[i][3] = configuration.getData(0, i, 6);
Here is my code:
import org.apache.poi.ss.usermodel.CellType;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class ExcelExample {
WebDriver driver;
@Test(dataProvider = "testdata")
public void demoClass(String NameEN, String NameAr, String ServiceCode, String min, String max)
throws InterruptedException {
//System.setProperty("webdriver.chrome.driver", "Path of Chrome Driver");
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.get("https://192.168.1.130/Account/Login");
driver.findElement(By.name("UsernameOrEmailAddress")).sendKeys("admin");
driver.findElement(By.name("Password")).sendKeys("P@ssw0rd");
driver.findElement(By.id("LoginButton")).click();
Thread.sleep(5000);
driver.findElement(By.partialLinkText("Services")).click();
Thread.sleep(500);
//click on service list
driver.findElement(By.partialLinkText("Service List")).click();
Thread.sleep(500);
//click on rotate circle
driver.findElement(By.xpath("/html/body/section[2]/div/div[1]/div/div/div[2]/div[2]/a[4]/span/span")).click();
Thread.sleep(2000);
//click on +
driver.findElement(By.xpath("/html/body/section[2]/div/div[1]/div/div/div[2]/div[2]/a[3]/span")).click();
Thread.sleep(1000);
//write on service name
driver.findElement(By.id("Name")).sendKeys(NameEN);
Thread.sleep(500);
//write on service name Arabic
driver.findElement(By.id("NameAr")).sendKeys(NameAr);
WebElement drodown = driver.findElement(
By.xpath("//*[@id="ServiceCreateForm"]/div/div/div/div[2]/div[3]/div[1]/div/div/button"));
drodown.click();
WebElement range = driver.findElement(
By.xpath("//*[@id="ServiceCreateForm"]/div/div/div/div[2]/div[3]/div[1]/div/div/div/ul/li[2]/a"));
range.click();
//select min amount
driver.findElement(By.name("MinValue")).sendKeys(min);
//select max amount
driver.findElement(By.name("MaxValue")).sendKeys(max);
//driver.findElement(By.xpath("//*[@id="ServiceCreateForm"]/div/div/div/div[2]/div[7]/div/button")).click();
}
@AfterMethod
void ProgramTermination() {
//driver.quit();
}
@DataProvider(name = "testdata")
public Object[][] testDataExample() {
ReadExcelFile configuration = new ReadExcelFile("C:\Users\Desktop\file.xlsx");
int rows = configuration.getRowCount(0);
Object[][] signin_credentials = new Object[rows][5];
for (int i = 0; i < rows; i++) {
signin_credentials[i][0] = configuration.getData(0, i, 3);
signin_credentials[i][1] = configuration.getData(0, i, 4);
signin_credentials[i][2] = configuration.getData(0, i, 5);
signin_credentials[i][3] = configuration.getData(0, i, 6);
}
return signin_credentials;
}
}
and here is my excel class:
package Login;
import java.io.File;
import java.io.FileInputStream;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ReadExcelFile {
XSSFWorkbook work_book;
XSSFSheet sheet;
public ReadExcelFile(String excelfilePath) {
try {
File s = new File(excelfilePath);
FileInputStream stream = new FileInputStream(s);
work_book = new XSSFWorkbook(stream);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
public String getData(int sheetnumber, int row, int column) {
sheet = work_book.getSheetAt(sheetnumber);
String data = sheet.getRow(row).getCell(column).getStringCellValue();
return data;
}
public int getRowCount(int sheetIndex) {
int row = work_book.getSheetAt(sheetIndex).getLastRowNum();
row = row + 1;
return row;
}
}
I’m trying to import data from Excel file to automate a large amount of data but I got the error «Cannot get a STRING value from a NUMERIC cell» as some of the cells has a numeric values and others has a text value.I need to extract all data and insert it as inputs for the page fields. i got the error stating from
signin_credentials[i][2] = configuration.getData(0, i, 5);
signin_credentials[i][3] = configuration.getData(0, i, 6);
Here is my code:
import org.apache.poi.ss.usermodel.CellType;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class ExcelExample {
WebDriver driver;
@Test(dataProvider = "testdata")
public void demoClass(String NameEN, String NameAr, String ServiceCode, String min, String max)
throws InterruptedException {
//System.setProperty("webdriver.chrome.driver", "Path of Chrome Driver");
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.get("https://192.168.1.130/Account/Login");
driver.findElement(By.name("UsernameOrEmailAddress")).sendKeys("admin");
driver.findElement(By.name("Password")).sendKeys("P@ssw0rd");
driver.findElement(By.id("LoginButton")).click();
Thread.sleep(5000);
driver.findElement(By.partialLinkText("Services")).click();
Thread.sleep(500);
//click on service list
driver.findElement(By.partialLinkText("Service List")).click();
Thread.sleep(500);
//click on rotate circle
driver.findElement(By.xpath("/html/body/section[2]/div/div[1]/div/div/div[2]/div[2]/a[4]/span/span")).click();
Thread.sleep(2000);
//click on +
driver.findElement(By.xpath("/html/body/section[2]/div/div[1]/div/div/div[2]/div[2]/a[3]/span")).click();
Thread.sleep(1000);
//write on service name
driver.findElement(By.id("Name")).sendKeys(NameEN);
Thread.sleep(500);
//write on service name Arabic
driver.findElement(By.id("NameAr")).sendKeys(NameAr);
WebElement drodown = driver.findElement(
By.xpath("//*[@id="ServiceCreateForm"]/div/div/div/div[2]/div[3]/div[1]/div/div/button"));
drodown.click();
WebElement range = driver.findElement(
By.xpath("//*[@id="ServiceCreateForm"]/div/div/div/div[2]/div[3]/div[1]/div/div/div/ul/li[2]/a"));
range.click();
//select min amount
driver.findElement(By.name("MinValue")).sendKeys(min);
//select max amount
driver.findElement(By.name("MaxValue")).sendKeys(max);
//driver.findElement(By.xpath("//*[@id="ServiceCreateForm"]/div/div/div/div[2]/div[7]/div/button")).click();
}
@AfterMethod
void ProgramTermination() {
//driver.quit();
}
@DataProvider(name = "testdata")
public Object[][] testDataExample() {
ReadExcelFile configuration = new ReadExcelFile("C:\Users\Desktop\file.xlsx");
int rows = configuration.getRowCount(0);
Object[][] signin_credentials = new Object[rows][5];
for (int i = 0; i < rows; i++) {
signin_credentials[i][0] = configuration.getData(0, i, 3);
signin_credentials[i][1] = configuration.getData(0, i, 4);
signin_credentials[i][2] = configuration.getData(0, i, 5);
signin_credentials[i][3] = configuration.getData(0, i, 6);
}
return signin_credentials;
}
}
and here is my excel class:
package Login;
import java.io.File;
import java.io.FileInputStream;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ReadExcelFile {
XSSFWorkbook work_book;
XSSFSheet sheet;
public ReadExcelFile(String excelfilePath) {
try {
File s = new File(excelfilePath);
FileInputStream stream = new FileInputStream(s);
work_book = new XSSFWorkbook(stream);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
public String getData(int sheetnumber, int row, int column) {
sheet = work_book.getSheetAt(sheetnumber);
String data = sheet.getRow(row).getCell(column).getStringCellValue();
return data;
}
public int getRowCount(int sheetIndex) {
int row = work_book.getSheetAt(sheetIndex).getLastRowNum();
row = row + 1;
return row;
}
}
I am trying to read data from an excel sheet and write on my application.But shows an error while trying to pass a numeric value using string. Please suggest me how can I resolve the issue. Please see my code and error screenshot below:
package ReadExcelData;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Locale;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ReadExcel {
public static void main(String[] args) throws Exception {
File src=new File("E:\QA_Automation\TestData_Excel\TestInputData.xlsx");
FileInputStream fis=new FileInputStream(src);
XSSFWorkbook wb=new XSSFWorkbook(fis);
XSSFSheet sheet1=wb.getSheetAt(0);
int rowcount=sheet1.getLastRowNum();
System.out.println("Total Row" + rowcount);
for(int i=0;i<rowcount;i++) {
String data0= sheet1.getRow(i).getCell(0).getStringCellValue();
System.out.println("Test Data From Excel"+data0);
}
wb.close();
}
}
Please check below image for the exception :
Sagar007
1,3103 gold badges9 silver badges24 bronze badges
asked Oct 26, 2017 at 8:44
3
This may be helpful to you..
Open the Excel sheet and select all (Ctrl+a) then right click and click Format cells then in number tab change the category to Text and click Ok…
answered Oct 26, 2017 at 11:00
SachinthaSachintha
3801 gold badge5 silver badges16 bronze badges
1
This exception is occurred when code try to read Numeric value as string.
Apache POI
will not convert from Numeric to String.
There are two solution :
1. First convert cell type to string and Read it. Please check below code :
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Locale;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ReadExcel {
public static void main(String[] args) throws Exception {
File src=new File("C:\Users\Sagar\Desktop\TestInputData.xlsx");
FileInputStream fis=new FileInputStream(src);
XSSFWorkbook wb=new XSSFWorkbook(fis);
XSSFSheet sheet1=wb.getSheetAt(0);
int rowcount=sheet1.getLastRowNum();
System.out.println("Total Row" + rowcount);
for(int i=0;i<rowcount+1;i++) {
System.out.println(i);
//GET CELL
Cell cell1 = sheet1.getRow(i).getCell(0);
//SET AS STRING TYPE
cell1.setCellType(Cell.CELL_TYPE_STRING);
String data0= cell1.getStringCellValue();
System.out.println("Test Data From Excel : "+data0);
}
wb.close();
}
}
2. Get type first and print by its option. Please see the code:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Locale;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ReadExcel {
public static void main(String[] args) throws Exception {
File src=new File("C:\Users\Sagar\Desktop\TestInputData.xlsx");
FileInputStream fis=new FileInputStream(src);
XSSFWorkbook wb=new XSSFWorkbook(fis);
XSSFSheet sheet1=wb.getSheetAt(0);
int rowcount=sheet1.getLastRowNum();
System.out.println("Total Row " + rowcount);
for(int i=0;i<rowcount+1;i++) {
Cell cell1 = sheet1.getRow(i).getCell(0);
switch (cell1.getCellType()) {
case Cell.CELL_TYPE_STRING:
System.out.println(cell1.getRichStringCellValue().getString());
break;
case Cell.CELL_TYPE_NUMERIC:
if (DateUtil.isCellDateFormatted(cell1)) {
System.out.println(cell1.getDateCellValue());
} else {
System.out.println(cell1.getNumericCellValue());
}
break;
case Cell.CELL_TYPE_BOOLEAN:
System.out.println(cell1.getBooleanCellValue());
break;
case Cell.CELL_TYPE_FORMULA:
System.out.println(cell1.getCellFormula());
break;
default:
System.out.println();
}
//String data0= cell1.getStringCellValue();
//System.out.println("Test Data From Excel : "+data0);
}
wb.close();
}
}
Note : Please check loop condition.It is also wrong. My code will not skip last row.
Prome
1,0078 silver badges24 bronze badges
answered Oct 26, 2017 at 9:26
Sagar007Sagar007
1,3103 gold badges9 silver badges24 bronze badges
2
You Can Check if cell is numeric or String through this code
if(MytempCell.getCellType() == Cell.CELL_TYPE_NUMERIC)
your code ...
else if(MytempCell.getCellType() == Cell.CELL_TYPE_STRING)
your code ..
answered Oct 9, 2019 at 7:46
Assuming there is the column holding only numeric cells you can approach with this:
for(int i=0;i<rowcount;i++) {
String data0 = String.valueOf(sheet1.getRow(i).getCell(0).getNumericCellValue());
System.out.println("Test Data From Excel" + data0);
}
The approach above is a pure java way to display data of double type. However if you need the formatting like you would have in Excel you should check this doc: https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/DataFormatter.html
answered Oct 26, 2017 at 9:13
Alexey R.Alexey R.
11.5k5 gold badges18 silver badges39 bronze badges
*CELLNAME*.setCellType(CellType.NUMERIC);
This works wonderfully and converts the data in the cell as numeric.
For operating on that value use:
*CELLNAME*.getNumericCellValue()
Bharat Mane
6,76910 gold badges38 silver badges67 bronze badges
answered Jun 10, 2018 at 17:21
Another way is adding the apostrophe before number in Excel cell —> Excel will treat it as text.
‘123456
answered May 14, 2020 at 3:42
If you don’t care what datatype the cell is, you can use DataFormatter.formatCellValue(Cell). This returns the default string format for each cell type, and it won’t execute Excel formulas (it returns the formula text).
[See \ modified
below]
package ReadExcelData;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Locale;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ReadExcel {
public static void main(String[] args) throws Exception {
File src=new File("E:\QA_Automation\TestData_Excel\TestInputData.xlsx");
FileInputStream fis=new FileInputStream(src);
XSSFWorkbook wb=new XSSFWorkbook(fis);
XSSFSheet sheet1=wb.getSheetAt(0);
int rowcount=sheet1.getLastRowNum();
System.out.println("Total Row" + rowcount);
for(int i=0;i<rowcount;i++) {
String data0= new DataFormatter().formatCellValue(sheet1.getRow(i).getCell(0)); \ modified
System.out.println("Test Data From Excel"+data0);
}
wb.close();
}
}
answered Feb 13, 2020 at 1:22
driver.findElement(By.id(«field on screen»)).sendKeys(String.valueOf(cell.getNumericCellValue()));
answered Apr 18, 2021 at 0:26
1
The easiest way to remove the error:: Cannot get a STRING value from a NUMERIC cell
—> Go to excel —> Put an apostrophe at start of numeric data cell.
When the code will run, it will consider the cell value as String and will not throw any such error.
answered Jul 7, 2021 at 14:12
I Was Executing Test Scripts Though Excel Sheet Using Keyword Driven Data Framework.
While Executing Am Geting Error as :
java.lang.RuntimeException: java.lang.IllegalStateException: Cannot
get a STRING value from a NUMERIC cell
My Selenium Code is
package DemoData;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import DataConfig.ExcelDataConfig;
public class ReadArrayData
{
WebDriver driver;
@Test(dataProvider="Tipreports")
public void Dataprovider(String username, String password) throws InterruptedException
{
System.setProperty("webdriver.chrome.driver", "F:\New folder\chromedriver.exe");
driver = new ChromeDriver();
driver.get("http://xxxxxxxxxxxxxxxx/");
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
driver.manage().window().maximize();
driver.findElement(By.id("txt_username")).sendKeys(username);
driver.findElement(By.id("txt_pin")).sendKeys(password);
driver.findElement(By.xpath("//*[@id='btn_click']")).click();
Thread.sleep(5000);
//driver.getCurrentUrl();
Assert.assertTrue(driver.getCurrentUrl().contains("http://xxxxxxxxxxxxx/Algorithm_Run.aspx"),"User Not able to Login - Invalid Credentials");
}
@AfterMethod
public void Close()
{
driver.quit();
}
@DataProvider(name="Tipreports")
public Object[][] passdata()
{
ExcelDataConfig config = new ExcelDataConfig("E:\Workspace\KeywordFramework\TestData\Dataprovider.xlsx");
int rows = config.getRowCount(0);
Object[][] data = new Object[rows][2];
for(int i=0;i<rows;i++)
{
data[i][0]=config.getData(0, i, 0);
data[i][1]=config.getData(0, i, 1);
}
return data;
}
}
Here is My Excel Data Config Code :
package DataConfig;
import java.io.File;
import java.io.FileInputStream;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ExcelDataConfig
{
XSSFWorkbook wb;
XSSFSheet Sheet1;
public ExcelDataConfig(String excelpath)
{
try
{
File src = new File(excelpath);
FileInputStream fis = new FileInputStream(src);
wb= new XSSFWorkbook(fis);
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
public String getData(int sheetnumber, int row, int column)
{
Sheet1 = wb.getSheetAt(sheetnumber);
String data =Sheet1.getRow(row).getCell(column).getStringCellValue();
return data;
}
public int getRowCount(int sheetindex)
{
int row = wb.getSheetAt(sheetindex).getLastRowNum();
row = row+1;
return row;
}
}
Can you please help me to sort out this, Why am getting this error? I have declared 2 Columns and 4 Rows
using for loop. But am getting cannot Get The error as cannot get the string value from Numeic Cell.
I have excel sheet with date column, when I run my program I got this error:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Cannot get a STRING value from a NUMERIC cell
My code that I run:
String date =sheets.getRow(choosenRow).getCell(3).getStringCellValue().toString();
How can I convert numeric value to String? in my case I used .toString();
but seems it didn’t worked.
Gale
2153 silver badges15 bronze badges
asked Jul 17, 2018 at 7:12
6
I believe that it is because you are using .getStringCellValue()
, when you should be using getNumericCellValue()
. .getStringCellValue()
can’t be used with NUMERIC cells. I’m assuming that you are using Apache POI by the way.
See https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Cell.html for more info.
I’m not sure why I was downvoted, can you let me know in the comments about how I can rewrite it to be more clear(if that is the problem) or tell me how it is wrong?
answered Jul 17, 2018 at 7:29
0
i not tested your code..!
but
you should try Object
class to get data from that exal file. if data are successfully recevied. then you can convert in to date or String.
like :
Object objdata = sheets.getRow(choosenRow).getCell(3).getStringCellValue();
answered Jul 17, 2018 at 7:32
BholaBhola
3921 silver badge15 bronze badges
Thanks all, it’s working perfectly now. I have changed the code to be like that:
Date date =sheets.getRow(choosenRow).getCell(3)getDateCellValue();
dateTextField.setText(""+date);
answered Jul 18, 2018 at 6:41
monamona
531 gold badge1 silver badge7 bronze badges
The error tells you that the cell if type NUMERIC
, you may use the approriate method getNumericCellValue()
String date = "" + sheets.getRow(choosenRow).getCell(3).getNumericCellValue();
If you don’t know the type before, and need to read some values, you may implment a switch
on the type (getCellType()
) and from the result of this enum use the right method
Specifically for the numeric type, you can check for date element :
public String getContent(Cell c){
switch(c.getCellType()){
case: NONE : throw new IllegalArgumentException("NONE");
case: BLANK : return "";
case: BOOLEAN : return ""+c.getBooleanCellValue();
case: ERROR : return ""+c.getErrorCellValue()
case: FORMULA : return c.getCellFormula()
case: NUMERIC : return HSSFDateUtil.isCellDateFormatted(c)) ?
c.getDateCellValue()) : ""+c.getNumericCellValue();
case: STRING : return c.getStringCellValue()
}
Ref to How to read Excel cell having Date with Apache POI?
answered Jul 17, 2018 at 7:33
azroazro
51.6k7 gold badges35 silver badges67 bronze badges
Я выполнял тестовые сценарии с помощью таблицы Excel, используя структуру данных, управляемую ключевыми словами.
При выполнении я получаю ошибку как:
java.lang.RuntimeException: java.lang.IllegalStateException: Cannot
get a STRING value from a NUMERIC cell
Мой код Selenium
package DemoData;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import DataConfig.ExcelDataConfig;
public class ReadArrayData
{
WebDriver driver;
@Test(dataProvider = "Tipreports")
public void Dataprovider(String username, String password) throws InterruptedException
{
System.setProperty("webdriver.chrome.driver", "F:\New folder\chromedriver.exe");
driver = new ChromeDriver();
driver.get("http://xxxxxxxxxxxxxxxx/");
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
driver.manage().window().maximize();
driver.findElement(By.id("txt_username")).sendKeys(username);
driver.findElement(By.id("txt_pin")).sendKeys(password);
driver.findElement(By.xpath("//*[@id='btn_click']")).click();
Thread.sleep(5000);
//driver.getCurrentUrl();
Assert.assertTrue(driver.getCurrentUrl().contains("http://xxxxxxxxxxxxx/Algorithm_Run.aspx"),"User Not able to Login - Invalid Credentials");
}
@AfterMethod
public void Close()
{
driver.quit();
}
@DataProvider(name = "Tipreports")
public Object[][] passdata()
{
ExcelDataConfig config = new ExcelDataConfig("E:\Workspace\KeywordFramework\TestData\Dataprovider.xlsx");
int rows = config.getRowCount(0);
Object[][] data = new Object[rows][2];
for(int i=0;i<rows;i++)
{
data[i][0]=config.getData(0, i, 0);
data[i][1]=config.getData(0, i, 1);
}
return data;
}
}
Вот мой код конфигурации данных Excel:
package DataConfig;
import java.io.File;
import java.io.FileInputStream;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ExcelDataConfig
{
XSSFWorkbook wb;
XSSFSheet Sheet1;
public ExcelDataConfig(String excelpath)
{
try
{
File src = new File(excelpath);
FileInputStream fis = new FileInputStream(src);
wb= new XSSFWorkbook(fis);
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
public String getData(int sheetnumber, int row, int column)
{
Sheet1 = wb.getSheetAt(sheetnumber);
String data =Sheet1.getRow(row).getCell(column).getStringCellValue();
return data;
}
public int getRowCount(int sheetindex)
{
int row = wb.getSheetAt(sheetindex).getLastRowNum();
row = row+1;
return row;
}
}
Не могли бы вы помочь мне разобраться с этим, почему возникает эта ошибка? Я объявил, что 2 Columns and 4 Rows использует цикл for. Но я не могу получить ошибку, так как не могу получить строковое значение из Numeic Cell.
Перейти к ответу
Данный вопрос помечен как решенный
Ответы
3
Попробуй это:
String data;
if (cell.getCellType()==CellType.STRING)
data = cell.getStringCellValue();
else if (cell.getCellType()==CellType.NUMERIC)
data = String.valueOf(cell.getNumericCellValue());
else ...
Это лучший способ получить содержимое ячейки в виде текста.
Благодаря @AxelRichter в руководстве представлен более полный пример получения содержимого ячейки: https://poi.apache.org/components/spreadsheet/quick-guide.html#CellContents
//try this:
DataFormatter objDefaultFormat = new DataFormatter();
FormulaEvaluator formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator();
String cellValueStr = objDefaultFormat.formatCellValue( cell , formulaEvaluator );
DataFormatter содержит методы форматирования значения, хранящегося в ячейке. Это может быть полезно, когда вам нужно получить данные в точности так, как они отображаются в Excel.
Поддерживаемые форматы включают валюту, SSN, проценты, десятичные дроби, даты, номера телефонов, почтовые индексы и т. д.
Спасибо @AxelRichter:
DataFormatter formatter = new DataFormatter();
String text = formatter.formatCellValue(cell);