Подтвердить что ты не робот

Невозможно получить текстовое значение из числовой ячейки "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();
4b9b3361

Ответ 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;

    }
}