web-dev-qa-db-fra.com

Apache POI XSSF en lecture dans des fichiers Excel

J'ai juste une petite question sur la façon de lire dans un fichier xlsx en utilisant le format XSSF d'Apache. 

En ce moment, mon code ressemble à ceci:

InputStream fs = new FileInputStream(filename);   // (1)
XSSFWorkbook wb = new XSSFWorkbook(fs);           // (2)
XSSFSheet sheet = wb.getSheetAt(0);               // (3)

... avec toutes les choses pertinentes importées. Mon problème est que lorsque je frappe run, il se coince à la ligne (2), dans une boucle presque infinie. filename est juste une chaîne.

Si quelqu'un pouvait me donner un exemple de code sur la façon de résoudre ce problème, je l'apprécierais vraiment. Tout ce que je veux maintenant, c’est lire dans une seule cellule à partir d’un fichier xlsx; J'utilisais HSSF pour les fichiers xls et je n'avais aucun problème.

Merci pour votre aide, Andrew

15
Andrew
InputStream inp = null;
        try {
            inp = new FileInputStream("E:/sample_poi.xls");

            Workbook wb = WorkbookFactory.create(inp);
            Sheet sheet = wb.getSheetAt(0);
            Header header = sheet.getHeader();

            int rowsCount = sheet.getLastRowNum();
            System.out.println("Total Number of Rows: " + (rowsCount + 1));
            for (int i = 0; i <= rowsCount; i++) {
                Row row = sheet.getRow(i);
                int colCounts = row.getLastCellNum();
                System.out.println("Total Number of Cols: " + colCounts);
                for (int j = 0; j < colCounts; j++) {
                    Cell cell = row.getCell(j);
                    System.out.println("[" + i + "," + j + "]=" + cell.getStringCellValue());
                }
            }

        } catch (Exception ex) {
            Java.util.logging.Logger.getLogger(FieldController.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                inp.close();
            } catch (IOException ex) {
                Java.util.logging.Logger.getLogger(FieldController.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
9
Naveed Kamran

Je pense que cela répondra à vos questions: http://poi.Apache.org/spreadsheet/quick-guide.html#ReadWriteWorkbook

En bref, votre code devrait ressembler à ceci:

InputStream inp = new FileInputStream("workbook.xlsx");
Workbook wb = WorkbookFactory.create(inp);
Sheet sheet = wb.getSheetAt(0);
Row row = sheet.getRow(2);
Cell cell = row.getCell(3);
8
DRAX

Pourquoi divisez-vous le fichier en un InputStream? XSSFWorkbook a un constructeur qui prend simplement le chemin comme une chaîne. Codez simplement le chemin de la chaîne. Une fois que vous avez créé le classeur, vous pouvez créer des feuilles XSSFS à partir de celui-ci. Puis XSSFCells, qui vous permettra enfin de lire le contenu d'une seule cellule (les cellules sont basées sur des emplacements x, y essentiellement)

3
crstamps2

Vous pouvez essayer ce qui suit. 

private static void readXLSX(String path) throws IOException {
    File myFile = new File(path);
    FileInputStream fis = new FileInputStream(myFile);

    // Finds the workbook instance for XLSX file
    XSSFWorkbook myWorkBook = new XSSFWorkbook (fis);

    // Return first sheet from the XLSX workbook
    XSSFSheet mySheet = myWorkBook.getSheetAt(0);

    // Get iterator to all the rows in current sheet
    Iterator<Row> rowIterator = mySheet.iterator();

    // Traversing over each row of XLSX file
    while (rowIterator.hasNext()) {
        Row row = rowIterator.next();

        // For each row, iterate through each columns
        Iterator<Cell> cellIterator = row.cellIterator();
        while (cellIterator.hasNext()) {

            Cell cell = cellIterator.next();

            switch (cell.getCellType()) {
            case Cell.CELL_TYPE_STRING:
                System.out.print(cell.getStringCellValue() + "\t");
                break;
            case Cell.CELL_TYPE_NUMERIC:
                System.out.print(cell.getNumericCellValue() + "\t");
                break;
            case Cell.CELL_TYPE_BOOLEAN:
                System.out.print(cell.getBooleanCellValue() + "\t");
                break;
            default :

            }
        }
        System.out.println("");
    }
}
1
Jürgen K.

cela fonctionne bien: essayez-le

File filename = new File("E:/Test.xlsx");
FileInputStream isr= new FileInputStream(filename);

Workbook book1 = new XSSFWorkbook(isr);
Sheet sheet = book1.getSheetAt(0);  
Iterator<Row> rowItr = sheet.rowIterator();
0
Shaurya
public class ExcelReader{
   public String path;
   public static FileInputStream fis;

   public ExcelReader(){
      System.out.println("hello");
   }

   public ExcelReader(String path){
      this.path=path;
      fis=new FileInputStream(path);
      XSSFWorkbook workbook=new XSSFWorkbook(fis);
      XSSFSheet sheet=workbook.getSheet("Sheet1");//name of the sheet
      System.out.println(sheet.getSheetName());
      System.out.println(sheet.getLastRowNum());
      System.out.println(sheet.getRow(2).getCell(3));
  }
  public static void main(String[] args) throws IOException {
      ExcelReader Excel=new ExcelReader("path of xlsx");
  }
}
0
Himanshu Kumar