0

私はプログラミングの世界に不慣れです。さて、apache-poi ライブラリを使用して Excel ファイル (5 行、5 列) を読み込もうとしています。私は実際に同じ問題の2つの実装を持っています。最初のコード スニペットでは、Excel ファイルを読み取ってコンソールに出力するだけです。

ただし、現在、読み取ったExcelデータを配列に保存しようとしています。だから、Excelの行と列のサイズを動的に取得した後、配列のサイズを設定したい。しかし驚いたことに、2 番目のコード スニペットを実行すると、入力 Excel ファイルに 5 行、5 列しかないにもかかわらず、"while(cellIterator.hasNext()" が継続的に繰り返されるようです。 .

ありがとうフセイン コード スニペット 1 (期待どおりに動作)

public static void main(String args[]) {
    readFile(ConfigReader.readConfigValues("XLS-path"),
            ConfigReader.readConfigValues("SheetName"));
}

public static void readFile(String filePath, String sheetName) {

    try {

        FileInputStream file = new FileInputStream(new File(filePath));

        // Get the workbook instance for XLS file
        HSSFWorkbook workbook = new HSSFWorkbook(file);

        // Get first sheet from the workbook
        HSSFSheet sheet = workbook.getSheet(sheetName);

        // Iterate through each rows from first sheet
        Iterator<Row> rowIterator = sheet.iterator();
        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_BOOLEAN:
                    System.out.print(cell.getBooleanCellValue() + "\t\t");
                    break;
                case Cell.CELL_TYPE_NUMERIC:
                    System.out.print(cell.getNumericCellValue() + "\t\t");
                    break;
                case Cell.CELL_TYPE_STRING:
                    System.out.print(cell.getStringCellValue() + "\t\t");
                    break;
                }
            }
            System.out.println("");
        }
        file.close();
        FileOutputStream out = new FileOutputStream(new java.io.File(
                "G:\\test1.xls"));
        workbook.write(out);
        out.close();

    } catch (FileNotFoundException e1) {
        e1.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

コード スニペット 2 (期待どおりに動作しない)

public static void main(String args[]) {
    readFile(ConfigReader.readConfigValues("XLS-path"),
            ConfigReader.readConfigValues("SheetName"));
}

public static void readFile(String filePath, String sheetName) {

    try {

        FileInputStream file = new FileInputStream(new File(filePath));

        // Get the workbook instance for XLS file
        HSSFWorkbook workbook = new HSSFWorkbook(file);

        // Get first sheet from the workbook
        HSSFSheet sheet = workbook.getSheet(sheetName);

        // Iterate through each rows from first sheet
        Iterator<Row> rowIterator = sheet.iterator();
        String[][] excelArray = null;
        excelArray = new String[getRowCount(rowIterator, excelArray)][];

        file.close();
        FileOutputStream out = new FileOutputStream(new java.io.File(
                "G:\\test1.xls"));
        workbook.write(out);
        out.close();

    } catch (FileNotFoundException e1) {
        e1.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public static int getRowCount(Iterator<Row> rowIterator,
        String[][] excelArray) {
    int sizeArrayRow = 0;
    while (rowIterator.hasNext()) {
        Row row = rowIterator.next();
        excelArray[sizeArrayRow] = new String[getColCount(row)];
        sizeArrayRow++;

    }

    return sizeArrayRow;
}

public static int getColCount(Row row) {

    int sizeArrayCol = 0;
    // For each row, iterate through each columns
    Iterator<Cell> cellIterator = row.cellIterator();
    while (cellIterator.hasNext()) {
        sizeArrayCol++;
    }
    return sizeArrayCol;
}
4

2 に答える 2

2

Java イテレータがどのように機能するかを確認するには、次を参照してください: http://www.tutorialspoint.com/java/java_using_iterator.htm 特に、hasNext() と next() の違いに注意してください。

あなたはチェックしています:

while (cellIterator.hasNext())

しかし、そのイテレータから何かを「読み取る」ことはないため、現在の位置にとどまり、hasNext に対して true を返し続けます。次の方法で前方にプッシュできます。

cellIterator.next();

また、コードがごちゃごちゃしていて分かりにくいと思います。String 配列の代わりに、List の使用を検討してください。そうすれば、事前にサイズを知らなくてもデータを取り込むことができます。

于 2013-02-18T18:28:49.387 に答える