私は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();
UPDATE
コメントで述べたように、これは機能しますが、Excelのセルからデータを取得する正しい方法ではありません。
マニュアルによると here :
数値セルの文字列値を取得する場合は、やめてください!これはそれを行う方法ではありません。代わりに、数値、ブール、または日付セルの文字列値を取得するには、代わりにDataFormatterを使用します。
DataFormatterには、Cellに格納されている値をフォーマットするためのメソッドが含まれています。 これは、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
}
}
フォーマッタは文字列セルをそのまま返します。数値セルの場合、スタイルの書式ルールをセルの番号に適用します
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;
}
コードを使用するcell.setCellType(Cell.CELL_TYPE_STRING);
文字列値を読み取る前に、これが役立ちます。
POIバージョン3.17 Beta1バージョンを使用しています。バージョンの互換性も確認してください。
これは、エラーを解決する他の方法の1つです:「数値セル「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;
}
.....
.....
}
確実に機能するコードを使用し、修正しました。
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) {
}
}
}
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();
}