[英]Cannot get a text value from a numeric cell “Poi”
我正在尝试使用 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();
在这种情况下,格式化程序可以正常工作。
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
Cell cell = sheet.getRow(i).getCell(0); cell.setCellType ( Cell.CELL_TYPE_STRING ); String j_username = cell.getStringCellValue();
更新
好的,正如评论中所说,尽管这很有效,但它不是从 Excel 单元格中检索数据的正确方法。
根据这里的手册:
如果您想要为您的数字单元格获取字符串值,请停止! 这不是这样做的方法。 相反,要获取数字或布尔值或日期单元格的字符串值,请改用 DataFormatter。
DataFormatter 包含用于格式化存储在单元格中的值的方法。 当您需要完全按照 Excel 中的数据显示数据时,这对于报告和 GUI 演示很有用。 支持的格式包括货币、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.
如Apache POI Javadocs中所述,您不应该使用cell.setCellType(Cell.CELL_TYPE_STRING)
来获取数字单元格的字符串值,因为您会丢失所有格式
相反,正如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
}
}
格式化程序将按原样返回字符串单元格,对于数字单元格,会将样式上的格式化规则应用于单元格的编号
使用代码cell.setCellType(Cell.CELL_TYPE_STRING);
在读取字符串值之前,这可以帮助您。
我使用的是 POI 3.17 Beta1 版本,确保版本兼容性也..
使用DataFormatter
解决了这个问题。 感谢“Gagravarr”的初始帖子。
DataFormatter formatter = new DataFormatter();
String empno = formatter.formatCellValue(cell0);
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;
}
不同细胞类型的辅助方法:
private static String returnStringValue(Cell cell) {
CellType cellType = cell.getCellType();
switch (cellType) {
case NUMERIC:
double doubleVal = cell.getNumericCellValue();
return String.valueOf(doubleVal);
case STRING:
return cell.getStringCellValue();
case ERROR:
return String.valueOf(cell.getErrorCellValue());
case BLANK:
return "";
case FORMULA:
return cell.getCellFormula();
case BOOLEAN:
return String.valueOf(cell.getBooleanCellValue());
}
return "error decoding string value of the cell";
}
使用它肯定有效的代码,我修改了它。
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) {
}
}
}
这是解决错误的另一种方法:“无法从数字单元格“Poi”中获取文本值”
转到 Excel 工作表。 拖动并选择要从 Excel 工作表中导入数据的数值。 转到格式>数字>然后选择“纯文本”然后导出为.xlsx。 现在尝试运行脚本
希望工作正常...!
如果您使用 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;
}
.....
.....
}
public class B3PassingExcelDataBase {
@Test()
//Import the data::row start at 3 and column at 1:
public static void imortingData () throws IOException {
FileInputStream file=new FileInputStream("/Users/Downloads/Book2.xlsx");
XSSFWorkbook book=new XSSFWorkbook(file);
XSSFSheet sheet=book.getSheet("Sheet1");
int rowNum=sheet.getLastRowNum();
System.out.println(rowNum);
//get the row and value and assigned to variable to use in application
for (int r=3;r<rowNum;r++) {
// Rows stays same but column num changes and this is for only one person. It iterate for other.
XSSFRow currentRow=sheet.getRow(r);
String fName=currentRow.getCell(1).toString();
String lName=currentRow.getCell(2).toString();
String phone=currentRow.getCell(3).toString();
String email=currentRow.getCell(4).toString()
//passing the data
yogen.findElement(By.name("firstName")).sendKeys(fName); ;
yogen.findElement(By.name("lastName")).sendKeys(lName); ;
yogen.findElement(By.name("phone")).sendKeys(phone); ;
}
yogen.close();
}
}
这将起作用:
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();
}
public static List<SupplierSubmittedDataMapperModel> convertExcelToList(String NAME){
List<SupplierSubmittedDataMapperModel> list = new ArrayList<>();
try {
FileInputStream file = new FileInputStream(new File(NAME));
DataFormatter dataFormatter = new DataFormatter();
XSSFWorkbook workbook = new XSSFWorkbook(file);
XSSFSheet sheet = workbook.getSheetAt(2);
int rowNumber = 2;
Iterator<Row> iterator = sheet.iterator();
while(iterator.hasNext()) {
Row row=iterator.next();
Iterator<Cell> cells = row.iterator();
int cid = 0;
SupplierSubmittedDataMapperModel sp = new SupplierSubmittedDataMapperModel();
while(cells.hasNext()) {
Cell cell = cells.next();
String cellValue = dataFormatter.formatCellValue(cell.getRow().getCell(cid));
switch(cid) {
case 0:
sp.setSectorType(cellValue);
break;
case 1:
sp.setPlatformFamily(cellValue);
break;
case 2:
sp.setT1Supplier(cellValue);
break;
case 3:
sp.setT2Supplier(cellValue);
break;
case 4:
sp.setDistribotor(cellValue);
break;
case 5:
sp.setT2PartCodeAtT1(cellValue);
break;
case 6:
sp.setT2PartNumber(cellValue);
break;
case 7:
sp.setLoA(cellValue);
break;
case 8:
sp.setMultiSource(cellValue);
break;
case 9:
sp.setQtyUsage(cellValue);
break;
case 10:
sp.setDataType(cellValue);
break;
case 11:
sp.setWeek22(cellValue);
break;
case 12:
sp.setWeek23(cellValue);
break;
case 13:
sp.setWeek23(cellValue);
break;
case 14:
sp.setWeek24(cellValue);
break;
case 15:
sp.setWeek25(cellValue);
break;
case 16:
sp.setWeek26(cellValue);
break;
case 17:
sp.setWeek27(cellValue);
break;
case 18:
sp.setWeek28(cellValue);
break;
case 19:
sp.setWeek29(cellValue);
break;
case 20:
sp.setWeek30(cellValue);
break;
case 21:
sp.setWeek31(cellValue);
break;
case 22:
sp.setWeek32(cellValue);
break;
case 23:
sp.setWeek33(cellValue);
break;
case 24:
sp.setWeek34(cellValue);
break;
case 25:
sp.setWeek35(cellValue);
break;
case 26:
sp.setWeek36(cellValue);
break;
case 27:
sp.setWeek37(cellValue);
break;
case 28:
sp.setWeek38(cellValue);
break;
case 29:
sp.setWeek39(cellValue);
break;
case 30:
sp.setWeek40(cellValue);
break;
case 31:
sp.setWeek41(cellValue);
break;
case 32:
sp.setWeek42(cellValue);
break;
case 33:
sp.setWeek43(cellValue);
break;
case 34:
sp.setWeek44(cellValue);
break;
case 35:
sp.setWeek45(cellValue);
break;
case 36:
sp.setWeek46(cellValue);
break;
case 37:
sp.setWeek47(cellValue);
break;
case 38:
sp.setWeek48(cellValue);
break;
case 39:
sp.setWeek49(cellValue);
break;
case 40:
sp.setWeek50(cellValue);
break;
case 41:
sp.setWeek51(cellValue);
break;
case 42:
sp.setWeek52(cellValue);
break;
case 43:
sp.setYear2023(cellValue);
break;
case 44:
sp.setYear2024(cellValue);
break;
case 45:
sp.setYear2059(cellValue);
break;
default :
break;
}
cid++;
}
list.add(sp);
System.out.println(sp);
}
workbook.close();
}catch(Exception e) {
e.printStackTrace();
}
return list;
}
您可以添加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++){
// Row will be iterated and Cell will be 0 and 1 as per the example:
row.getCell(0).setCellType(CellType.STRING); // set Cell Type as String
row.getCell(1).setCellType(CellType.STRING); // set Cell Type as String
String j_username = sheet.getRow(i).getCell(0).getStringCellValue();
String j_password = sheet.getRow(i).getCell(1).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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.