Алгоритм поиска для документов Excel в Java - PullRequest
0 голосов
/ 24 апреля 2020

Я пишу программу для чтения файла xslx, используя Apache POI в java, и создаю алгоритм поиска для поиска строки s в записях. Я написал код для печати всех записей, но я не могу найти, как создать алгоритм поиска. Он предназначен для показа записей только с "zgheib". Я был бы очень признателен за руку. Это мой код:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
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 test {
    public static void main(String[] args) throws IOException {
        try
        {
            FileInputStream file = new FileInputStream(new File("C:\\Users\\Junaid\\Documents\\IntelliJ Projects\\ReadExcel_Bashar\\src\\assignment.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);

        //Iterate through each rows one by one
        Iterator<Row> rowIterator = sheet.iterator();
        while (rowIterator.hasNext())
        {
            Row row = rowIterator.next();
            //For each row, iterate through all the columns
            Iterator<Cell> cellIterator = row.cellIterator();

            while (cellIterator.hasNext())
            {
                Cell cell = cellIterator.next();
                //Check the cell type and format accordingly
                switch (cell.getCellType())
                {
                    case Cell.CELL_TYPE_NUMERIC:
                        System.out.print(cell.getNumericCellValue() + "\t");
                        break;
                    case Cell.CELL_TYPE_STRING:
                        System.out.print(cell.getStringCellValue() + "\t");
                        break;
                }
            }
            System.out.println("");
        }
        file.close();
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

}

Ответы [ 2 ]

1 голос
/ 25 апреля 2020

Если необходимо получить только те строки, в которых значения ячеек содержат строку поиска, этого можно достичь, пройдя по всем строкам и ячейкам на листе и получив значения ячеек. Если значение ячейки содержит строку поиска, добавьте строку в список строк List<Row>. Поскольку все значения ячеек должны быть преобразованы в строку, поскольку искомое значение является строкой, можно использовать DataFormatter . Методы formatCellValue для DataFormatter получают все значения ячеек в виде форматированных строк. Для поддержки ячеек формулы также необходимо использовать DataFormatter вместе с FormulaEvaluator .

В следующем примере представлен метод

 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;
 }

Этот метод пересекает заданную sheet и получает все значения ячеек, используя DataFormatter и FormulaEvaluator. Если найденное значение ячейки содержит искомое значение, строка добавляется в список, иначе нет. Таким образом, результатом является List<Row>, который содержит только строки, в которых ячейки содержат строку поиска.

Полный пример:

import org.apache.poi.ss.usermodel.*;

import java.io.FileInputStream;
import java.util.List;
import java.util.ArrayList;

class ReadExcelRows {

 //get only rows where cell values contain search string
 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 Exception {

  Workbook workbook = WorkbookFactory.create(new FileInputStream("./inputFile.xlsx"));
  //Workbook workbook = WorkbookFactory.create(new FileInputStream("./inputFile.xls"));
  DataFormatter formatter = new DataFormatter();
  FormulaEvaluator evaluator =  workbook.getCreationHelper().createFormulaEvaluator();
  Sheet sheet = workbook.getSheetAt(0);

  List<Row> filteredRows = getRows(sheet, formatter, evaluator, "zgheib");

  for (Row row : filteredRows) {
   for (Cell cell : row) {
    System.out.print(cell.getAddress()+ ":" + formatter.formatCellValue(cell, evaluator));
    System.out.print(" ");
   }
   System.out.println();
  }

  workbook.close();
 }
}
0 голосов
/ 24 апреля 2020

Я рекомендую вам передать файл в .csv, а затем через InputStreamReader прочитать данные и интерпретировать их

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...