java एक संख्यात्मक सेल "पोई" से एक पाठ मूल्य नहीं मिल सकता




apache-poi (10)

मैं एक्सेल में एक स्प्रेडशीट से डेटा का उपभोग करने की कोशिश कर रहा हूं, लेकिन इस त्रुटि के कारण, पहले से ही वर्कशीट को पाठ और संख्या में प्रारूपित करने की कोशिश की गई है और अभी भी त्रुटि बनी हुई है।

मैंने एक व्यक्ति को इसका उपयोग करते हुए देखा, जो cell.setCellType ( Cell.CELL_TYPE_STRING ) ; हल 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();

यदि आप एक्सेल से एक्सेल डेटा कॉन्फिगरेशन का उपयोग कर रहे हैं या एक्सेल से डेटा ला रहे हैं तो कोड के नीचे पेस्ट कॉपी करें।

यह एक्सेल से दोनों स्ट्रिंग के साथ-साथ संख्यात्मक मान लेने के लिए उपयोगी होगा। यह एक्सेल से मोबाइल नंबर प्राप्त करने के लिए भी उपयोगी होगा और यदि आप दशमलव प्रारूप नहीं चाहते हैं।

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;

    }
}

यदि आप सेलिएटर के साथ पंक्तियों में प्रसंस्करण कर रहे हैं .... तो यह मेरे लिए काम करता है ...।

  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;
        }
    .....
    .....
  }

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

DataFormatter का उपयोग करके इस समस्या को हल किया जाता है। आरंभिक पोस्ट के लिए "Gagravarr" का धन्यवाद।

DataFormatter formatter = new DataFormatter();

String empno = formatter.formatCellValue(cell0);

जैसा कि here में बताया गया है, आपको किसी संख्यात्मक कक्ष के स्ट्रिंग मान को प्राप्त करने के लिए cell.setCellType(Cell.CELL_TYPE_STRING) का उपयोग नहीं करना चाहिए , क्योंकि आप सभी स्वरूपण को ढीला कर देंगे

इसके बजाय, जैसा कि here , आपको DataFormatter उपयोग करना चाहिए

DataFormatter क्या करता है, यह फ़्लोटिंग मान को प्रदर्शित करता है, जो सेल में मौजूद फ़ाइल में संग्रहीत होता है, साथ ही इस पर लागू होने वाले फ़ॉर्मेटिंग नियम और आपको एक स्ट्रिंग देता है जो दिखता है कि सेल 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
        }
 }

सूत्रकार स्ट्रिंग कोशिकाओं को जैसे-जैसे लौटाएगा, और न्यूमेरिक कोशिकाओं के लिए स्वरूपण नियम को सेल की संख्या पर लागू करेगा


यह काम करेगा:

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

    Cell cell = sheet.getRow(i).getCell(0);
    cell.setCellType ( Cell.CELL_TYPE_STRING );
    String j_username = cell.getStringCellValue();

अद्यतन करें

ठीक है, जैसा कि टिप्पणियों में कहा गया है, इस काम के बावजूद यह एक्सेल की सेल से डेटा प्राप्त करने का सही तरीका नहीं है।

here मैनुअल के अनुसार:

यदि आप क्या करना चाहते हैं तो अपने संख्यात्मक सेल के लिए एक स्ट्रिंग मान प्राप्त करें, बंद करो! यह ऐसा करने का तरीका नहीं है। इसके बजाय, संख्यात्मक या बूलियन या दिनांक सेल के स्ट्रिंग मान प्राप्त करने के लिए, इसके बजाय DataFormatter का उपयोग करें।

और DataFormatter API के अनुसार

DataFormatter में सेल में संग्रहीत मान को प्रारूपित करने के तरीके होते हैं। यह रिपोर्ट और जीयूआई प्रस्तुतियों के लिए उपयोगी हो सकता है जब आपको एक्सेल में दिखाई देने वाले डेटा को ठीक से प्रदर्शित करने की आवश्यकता होती है। समर्थित स्वरूपों में मुद्रा, 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.

फॉर्मेट इस मामले में ठीक काम करेगा।

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.setCellType(Cell.CELL_TYPE_STRING);
स्ट्रिंग मान को पढ़ने से पहले, जो आपकी मदद कर सकता है।
मैं POI संस्करण 3.17 Beta1 संस्करण का उपयोग कर रहा हूं, निश्चित रूप से संस्करण संगतता भी ..


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


    }

}




apache-poi