Считать данные с эксель файла в списки

У меня есть такой файл экселя:введите сюда описание изображения

Тип данных зачения столбца TC - General, остальные это Text, не считая даты, которая, соответственно - Date. Я считываю данные в разные списки с разными типами данных. Т.е. у меня есть список для текста, есть для чисел и дат.

static ArrayList<String> a2 = new ArrayList<String>();
     static ArrayList<String> a3 = new ArrayList<String>();
    public static ArrayList<String> parse(String fileName) {
        InputStream inputStream = null;
        XSSFWorkbook workbook = null;
        try {
            inputStream = new FileInputStream(fileName);
            workbook = new XSSFWorkbook(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        } 
        XSSFSheet sheet = workbook.getSheetAt(0);
        Iterator<Row> it = sheet.iterator();
       
        while (it.hasNext()) {
            Row row = it.next();
            Iterator<Cell> cells = row.iterator();
            while (cells.hasNext()) {
                Cell cell = cells.next();
                int cellType = cell.getCellType();
                switch (cellType) {
                    case Cell.CELL_TYPE_STRING:  
                            a2.add(cell.getStringCellValue());
   
                  //  case Cell.CELL_TYPE_NUMERIC: ***НЕ РАБОТАЕТ***
                  //     if (DateUtil.isCellDateFormatted(cell)) {
                    //         SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
                  //           a3.add(dateFormat.format(cell.getDateCellValue()));
                         }
                }
            } return a2;

Помогите правильно реализовать считывание данных из этого файла в списки, или же куда-то, откуда будет удобно их потом использовать. То, что я сейчас имею - считанные текстовые значения, без дат и значений TC.


Ответы (1 шт):

Автор решения: Perfect Voyage

Можно создать класс-обработчик входящих значений. И оттуда наполнять какой-то публичный/привязанный к кому-либо список, выполнять разбор присваивая дату и т.д. Создавая экземпляры класса, где их полями будут непосредственно ячейки из одного ROW

Приводить строку к желаемому виду прямо в цикле - плохая идея, это уменьшает читабельность кода, тяжелее будет искать ошибки.

Так создадим же класс обработчик.

public class HandlerNewObject{

 public HandlerNewObject(ArrayList<StringBuilder> list){
     todo(list);
 }

 private void todo(ArrayList<StringBuilder> list){
     // Для разбора и последующего хранения
     // Например пройдёмся по отдельному ROW
     for (StringBuilder sb : list){
         System.out.print(sb.toString());
         System.out.print(" ");
     }
     System.out.println(" END READ" );

     // На основании этого можно создать объект
     // Где полями объекта будут являться "имена столбцов"
     // Экземпляры этого класса можно хранить любым способом
         // Массив, лист, множество и т.д
     }
}

Что осталось в вашем методе

 public void parse(String fileName) {
    InputStream inputStream = null;
    XSSFWorkbook workbook = null;
    try {
        inputStream = new FileInputStream(fileName);
        workbook = new XSSFWorkbook(inputStream);
    }
    catch (IOException e) {
        e.printStackTrace();
    }

    XSSFSheet sheet = workbook.getSheetAt(0);
    Iterator<Row> it = sheet.iterator();

    while (it.hasNext()) {
        Row row = it.next();
        Iterator<Cell> cells = row.iterator();
        ArrayList<StringBuilder> result = new ArrayList<>();

        while (cells.hasNext()) {
            Cell cell = cells.next();
            StringBuilder ss = new StringBuilder();
            ss.append(cell.getRichStringCellValue());
        } // end cell

        System.out.println("CREATE NEW OBJECT : ");
        new HandlerNewObject(result);

    }  //end row
    System.out.println("END OPERATION READ");
}

Ну приложу вам один пример, на всякий случай. Принцип хранения может быть таким :

public class Tezt {

    public static ArrayList<Tezt> allObject = new ArrayList<>();
    
    private String date;
    private String people;

    public Tezt(String date, String people) {
        this.date = date;
        this.people = people;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public String getPeople() {
        return people;
    }

    public void setPeople(String people) {
        this.people = people;
    }
}

Я не стал давать вам готовое решение, постарайтесь решить этот пример сами, если вам это конечно, нужно...

→ Ссылка