Считайте значение смежной ячейки в листе Excel, используя Java - PullRequest
0 голосов
/ 28 мая 2020

У меня есть лист Excel, и я хочу дать ему строковый ввод, а код java ищет входные данные в листе Excel. И когда он его находит, он распечатывает соседнюю ячейку (ту, что справа).

Этот код просто дает мне все значения таблицы Excel. Но я хочу, чтобы он дал мне конкретное значение c.

Это мой код:

package readfiles;

import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class LeerArchivosDeExcel {

    public LeerArchivosDeExcel(File fileName){
        List cellData = new ArrayList();
        try {
            FileInputStream fileInputStream = new FileInputStream(fileName);
            XSSFWorkbook workBook = new XSSFWorkbook(fileInputStream);
            XSSFSheet hssfSheet = workBook.getSheetAt(0);
            Iterator rowIterator = hssfSheet.rowIterator();
            while(rowIterator.hasNext()){
                XSSFRow hssfRow = (XSSFRow) rowIterator.next();
                Iterator iterator = hssfRow.cellIterator();
                List cellTemp = new ArrayList();
                    while (iterator.hasNext()){
                    XSSFCell hssfCell = (XSSFCell) iterator.next();
                    cellTemp.add(hssfCell);

                    }
                cellData.add(cellTemp);    
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        obtener(cellData);
    }
    private void obtener(List cellDataList){
        for (int i = 0; i < cellDataList.size(); i++) {
            List cellTempList = (List) cellDataList.get(i);
            for (int j = 0; j < cellTempList.size(); j++) {
                XSSFCell hssfCell = (XSSFCell) cellTempList.get(j);
                String stringCellValue = hssfCell.toString();
                System.out.print(stringCellValue+" ");
            }
            System.out.println();
        }
    }
    public static void main(String[] args) {
        File f = new File ("/Users/sushi/Documentos/BD2/Libro.xlsx");
                Scanner input = new Scanner(System.in);

        if (f.exists()){
            LeerArchivosDeExcel obj = new LeerArchivosDeExcel(f);

        }
    }

}

1 Ответ

2 голосов
/ 28 мая 2020

Вы можете написать такой метод:

public String getAdjacentCellValue(Sheet sheet, String searchText) {
    DataFormatter formatter = new DataFormatter();
    for (Row row : sheet) {
        for (Cell cell : row) {
            if (searchText.equals(formatter.formatCellValue(cell))) {
                // text matches the string cell value,
                // so find the adjacent cell
                Cell adjacentCell = row.getCell(cell.getColumnIndex() + 1);

                if (adjacentCell == null) {
                    // cell does not exist in excel model yet,
                    // so it is considered a blank cell by default
                    return "";
                } else {
                    // cell exists in excel model
                    // return the value
                    return formatter.formatCellValue(adjacentCell);
                }
            }
        }
    }

    // search text not found
    return null;
}

Здесь уместны некоторые примечания:

  1. Вы можете так кратко перебирать рабочий лист, потому что Sheet интерфейс расширяет Iterable<Row>, а интерфейс Row расширяет Iterable<Cell>.

  2. Используйте DataFormatter для чтения строкового значения ячейки, потому что cell.getStringCellValue() не будет работать, например, если тип ячейки NUMERIC. Дополнительная настройка будет необходима, если ячейка является ячейкой формулы.

  3. Вызов метода row.getCell(cell.getColumnIndex() + 1) может возвращать значение null. Внутренне Excel предполагает, что все ячейки на листе являются пустыми, если не указано иное. В нем хранятся только ячейки, которые были явно отредактированы. Если ячейка никогда не создавалась, POI возвращает null. Это обычное дело для типичного рабочего листа.

...