Java POI: как найти ячейку Excel со строковым значением и получить ее позицию (строку), чтобы использовать эту позицию для поиска другой ячейки

Я ищу ячейку в электронной таблице со строкой «Всего», а затем использую строку, в которой эта ячейка, чтобы найти общее значение в другой ячейке, которая всегда является одной и той же ячейкой/столбцом (10-я ячейка в 0 основанный индекс).

У меня есть следующий код, в котором нет ошибок (синтаксис), но метод findCell не возвращает значение rowNum:

    public static void main(String[] args) throws IOException{

        String fileName = "C:\\file-path\\report.xls";
        String cellContent = "Total";
        int rownr=0, colnr = 10;

        InputStream input = new FileInputStream(fileName);

        HSSFWorkbook wb = new HSSFWorkbook(input);
        HSSFSheet sheet = wb.getSheetAt(0);

        rownr = findRow(sheet, cellContent);

        output(sheet, rownr, colnr);

        finish();
    }

    private static void output(HSSFSheet sheet, int rownr, int colnr) {
        /*
         * This method displays the total value of the month
         */

        HSSFRow row = sheet.getRow(rownr);
        HSSFCell cell = row.getCell(colnr);

                System.out.println("Your total is: " + cell);           
    }

    private static int findRow(HSSFSheet sheet, String cellContent){
        /*
         *  This is the method to find the row number
         */

        int rowNum = 0; 

        for(Row row : sheet) {
            for(Cell cell : row) {

                while(cell.getCellType() == Cell.CELL_TYPE_STRING){

                    if(cell.getRichStringCellValue().getString () == cellContent);{

                            rowNum = row.getRowNum();
                            return rowNum;  
                    }
                }
            }
        }               
        return rowNum;
    }

    private static void finish() {

        System.exit(0);
    }
}   

person lv10    schedule 29.01.2012    source источник


Ответы (2)


Это исправление метода является решением вашей проблемы:

private static int findRow(HSSFSheet sheet, String cellContent) {
    for (Row row : sheet) {
        for (Cell cell : row) {
            if (cell.getCellType() == Cell.CELL_TYPE_STRING) {
                if (cell.getRichStringCellValue().getString().trim().equals(cellContent)) {
                    return row.getRowNum();  
                }
            }
        }
    }               
    return 0;
}

Имейте в виду, что ваше colnr по-прежнему является фиксированным значением.

person msi    schedule 29.01.2012
comment
Большое спасибо @msi. Предложенный код устранил проблему, он работал отлично. Я относительно новичок в программировании, могу спросить вас: 1. почему вы изменили оператор while и 2. почему возврат цикла for = 0. еще раз спасибо! - person lv10; 29.01.2012
comment
Когда вы используете цикл while, вы предполагаете, что все ячейки слева от «общей ячейки» заполнены строкой. Например, такие ячейки: | | 1| Итого| FAIL будет найден с помощью while, потому что while сломается при значении 1. Возвращает 0 на тот случай, если не будет найдена «общая ячейка». - person msi; 29.01.2012
comment
Для сравнения двух строк вы должны использовать метод equals. == используется для сравнения примитивных типов, а не объектов. И getString() возвращает объект. Если вы хотите узнать больше о строках, прочитайте о пуле строк и методе стажера. Здесь вы можете найти случаи, когда сравнение с использованием == корректно. Я также использовал метод обрезки только потому, что пользовательский ввод любит содержать дополнительные пробелы в конце строки. - person msi; 29.01.2012
comment
спасибо, что нашли время, чтобы объяснить мне. Я очень ценю это. Буду следовать твоему совету с этого момента. - person lv10; 29.01.2012
comment
используйте производную ячейку, чтобы найти ваши индексы: cell.getColumnIndex, cell.getRowIndex - person theRiley; 05.01.2021

У вас есть точка с запятой после оператора if, что означает, что ваш if не будет работать:

if(cell.getRichStringCellValue().getString () == cellContent);{

Даже если это не решит вашу проблему, я думаю, что ваше утверждение while может быть здесь неуместным;

while(cell.getCellType() == Cell.CELL_TYPE_STRING)

Насколько я помню, в POI есть и другие типы ячеек. Попробуйте поставить точки останова на эти строки и проверьте их, если они имеют правильный CellType.

person Yasin Okumuş    schedule 29.01.2012
comment
Большое тебе спасибо. Ваше предложение было правильным, но в инструкции while было что-то не так. Я удалил его и изменил на оператор if, как предложено ниже @msi. - person lv10; 29.01.2012