your programing

숫자 셀 "Poi"에서 텍스트 값을 가져올 수 없습니다.

lovepro 2020. 12. 29. 08:08
반응형

숫자 셀 "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 API 에 따르면

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.

에서 설명하고있는 바와 같이 아파치 POI Javadoc과 , 당신은 사용하는 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 버전을 사용하고 있습니다. 버전 호환성도 확인하세요.


그 코드를 사용하면 확실히 작동하고 수정했습니다.

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로 내보내기로 이동합니다. 이제 스크립트를 실행 해보십시오.

희망은 잘 작동합니다 ...!

숫자 셀 "Poi".img에서 텍스트 값을 가져올 수 없습니다.


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();
     }

참조 URL : https://stackoverflow.com/questions/30125465/cannot-get-a-text-value-from-a-numeric-cell-poi

반응형