Как найти и распечатать определенную ячейку c с листа Excel, используя Apache POI? - PullRequest
1 голос
/ 28 мая 2020

Я пишу код java для проекта сортировки библиотеки, я хочу, чтобы он выполнял поиск строки по всем ячейкам в заданном столбце c, а затем распечатывал те, которые содержат данную подстроку, i хотите сделать это через столбцы, потому что у меня есть столбец для каждой части информации о книге (автор, название, ISBN), так есть ли способ сделать это? Я написал для этого следующий код (хотя без операторов импорта), и все, что он делает, это печатает всю строку для книги, которая содержит подстроку, мне нужно только напечатать определенную ячейку c из этой строки после он выбирает его

public class testf {
 static List<Row> getRows(Sheet sheet, DataFormatter formatter, FormulaEvaluator evaluator, String searchValue) {
      List<Row> result = new ArrayList<Row>();
      String cellValue = "";
      for (Row row : sheet) {
       for (Cell cell : row) {
        cellValue = formatter.formatCellValue(cell, evaluator);
        if (cellValue.contains(searchValue)) {
         result.add(row);
         break;
        }
       }
      }
      return result;
     }
public static void main(String[] args) throws IOException, InvalidFormatException {
       try
        {
            FileInputStream file = new FileInputStream(new File("C:\\\\Users\\\\abdul\\\\Desktop\\\\University Files\\\\Object-Oriented Programming\\\\Project files\\\\Book class\\\\Books & DDC.xlsx"));

        //Create Workbook instance holding reference to .xlsx file
        XSSFWorkbook workbook = new XSSFWorkbook(file);

        //Get first/desired sheet from the workbook
        XSSFSheet sheet = workbook.getSheetAt(0);


        DataFormatter formatter = new DataFormatter();
        FormulaEvaluator evaluator =  workbook.getCreationHelper().createFormulaEvaluator();
        Scanner a = new Scanner(System.in);
        List<Row> filteredRows = getRows(sheet, formatter, evaluator, "y");

        for (Row row : filteredRows) {
         for (Cell cell : row) {
          System.out.print(formatter.formatCellValue(cell, evaluator));
          System.out.print("\t \t");
         }
         System.out.println();
        }
        file.close();
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }

}}

1 Ответ

1 голос
/ 03 июня 2020

Это потому, что метод getRows возвращает все строки, в которых есть ячейка с требуемыми критериями, но он не сообщает вам, какая именно ячейка, поэтому вам нужно вернуть ячейки.

getRows -> getCells

, и код для этого метода будет:

static List<Cell> getCells(Sheet sheet, DataFormatter formatter, FormulaEvaluator evaluator, String searchValue) {
    List<Cell> result = new ArrayList<>();
    String cellValue = "";
    for (Row row : sheet) {
        for (Cell cell : row) {
            cellValue = formatter.formatCellValue(cell, evaluator);
            if (cellValue.contains(searchValue)) {
                result.add(cell);
                break;
            }
        }
    }
    return result;
}

, а что касается печати, вы просто l oop через список ячеек, и вы их обычно притягиваете, и если вам по какой-либо причине нужна строка для определенной ячейки, вы просто вызываете cell.getRow ()

List<Cell> filteredCells = getCells(sheet, formatter, evaluator, "whatever");

for (Cell cell : filteredCells) {
    System.out.print(formatter.formatCellValue(cell, evaluator));
    System.out.print("\t \t");
    Row cellsRow = cell.getRow();// if you need the full row
}

кстати , I не знаю о спецификациях, которые у вас есть, но разрыв, который у вас есть в вашем методе фильтрации, означает, что если в строке есть несколько ячеек с желаемым значением, вы получите только первую ячейку , поэтому будьте осторожны, я бы рекомендовал удалить этот разрыв, если это не именно то, что вам нужно

...