webentwicklung-frage-antwort-db.com.de

Apache POI XSSF liest in Excel-Dateien

Ich habe nur eine kurze Frage zum Einlesen einer Xlsx-Datei im XSSF-Format von Apache. 

Im Moment sieht mein Code so aus:

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

... mit allen relevanten Dingen importiert. Mein Problem ist, dass ich, wenn ich auf run gehe, in Linie (2) stecken bleibt, in einer fast unendlichen Schleife. filename ist nur eine Zeichenfolge.

Wenn mir jemand Beispielcode geben könnte, wie ich das beheben könnte, würde ich das wirklich schätzen. Alles, was ich jetzt möchte, ist, eine einzelne Zelle aus einer XLSX-Datei einzulesen. Ich habe HSSF für XLS-Dateien verwendet und hatte keine Probleme.

Vielen Dank für Ihre Hilfe. 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

Ich bin der Meinung, dass dies Ihre Fragen beantwortet: http://poi.Apache.org/spreadsheet/quick-guide.html#ReadWriteWorkbook

Kurz gesagt, Ihr Code sollte so aussehen:

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

Warum zerlegen Sie die Datei in einen InputStream? XSSFWorkbook hat einen Konstruktor, der den Pfad einfach als String verwendet. Geben Sie einfach den Pfad der Zeichenfolge fest ein. Sobald Sie die Arbeitsmappe erstellt haben, können Sie daraus XSSFSheets erstellen. Dann XSSFC-Zellen, mit denen Sie schließlich den Inhalt einer einzelnen Zelle lesen können (Zellen basieren im Wesentlichen auf x-, y-Positionen).

3
crstamps2

Sie können folgendes versuchen. 

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.

Ich habe den gleichen Fehler, ich habe gerade die POM-Abhängigkeiten mit der gleichen Version aktualisiert. Es funktionierte.

        <!-- https://mvnrepository.com/artifact/org.Apache.poi/poi -->
        <dependency>
            <groupId>org.Apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.Apache.poi/poi-ooxml -->
        <dependency>
            <groupId>org.Apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.0</version>
        </dependency>
0
Shakti Pravesh

das funktioniert gut: probieren Sie es aus

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