Считать данные с эксель файла в списки
У меня есть такой файл экселя:
Тип данных зачения столбца 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 шт):
Можно создать класс-обработчик входящих значений. И оттуда наполнять какой-то публичный/привязанный к кому-либо список, выполнять разбор присваивая дату и т.д. Создавая экземпляры класса, где их полями будут непосредственно ячейки из одного 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;
}
}
Я не стал давать вам готовое решение, постарайтесь решить этот пример сами, если вам это конечно, нужно...