public ResponseEntity<Object> importPcpXlsx(MultipartFile xlsx) {
try {
XSSFWorkbook xssfWorkbook = new XSSFWorkbook(xlsx.getInputStream());
XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(0);
Row row;
Cell cell;
int i = 1;
List<String> number = new ArrayList<>();
while (true) {
if (xssfSheet.getRow(i) != null) {
row = xssfSheet.getRow(i);
cell = row.getCell(0);
if (cell.getSheet()
.getRow(0)
.getCell(0)
.getRichStringCellValue()
.getString()
.equals("Number".trim())) {
number.add(cell.getStringCellValue().trim());
log.info("number: " + i + ". № " + cell.getStringCellValue());
}
} else {
i = 1;
break;
}
i++;
}
List<String> kpgz = new ArrayList<>();
while (true) {
if (xssfSheet.getRow(i) != null) {
row = xssfSheet.getRow(i);
cell = row.getCell(1);
if (cell.getSheet()
.getRow(0)
.getCell(1)
.getRichStringCellValue()
.getString()
.equals("kpgz".trim())) {
kpgz.add(cell.getStringCellValue().trim());
log.info("kpgz: " + i + ". " + cell.getStringCellValue());
}
} else {
i = 1;
break;
}
i++;
}
Я просматриваю столбцы и читаю все строки под каждым столбцом. Но что делать, если у меня некоторые столбцы не приходят в файл xlxs. То есть мне нужен вариант, где не надо строго указывать столбцы. Пожалуйста, предскажите. В коде я читаю по столбцам, так как столбцы имеют разные типы и должны обрабатываться по-разному. Мне нужно сделать это, чтобы я не указывал количество столбцов в коде номера столбца, как я это сделал cell = row.getCell(0); или row.getCell(1) или row.getCell(2)
Почему бы не читать по порядку, как это? Вы все еще можете switch
в getCellType()
.
Игорь Ходыко, сейчас я привязываюсь к конкретным колонкам. Например, getCell(0) и get.cell(1). Я не понимаю, как это сделать, чтобы не привязываться так
трэшбог, я не могу этого сделать, я должен сделать это во многих местах(
@trashgod, мой вариант подходит, когда столбцы в файле не меняются, но если какие-то столбцы не входят в xlxs, то код будет работать некорректно
@Игорь Ходыко подходит мой вариант, когда столбцы в файле не меняются, но если некоторые столбцы не входят в xlxs, то код будет работать некорректно
Попробуйте установить poi.apache.org/apidocs/dev/org/apache/poi/ss/usermodel/… при извлечении ячейки, чтобы контролировать, что делать, если в этом столбце нет ячейки?
@Gagravarr Я проверяю xssfSheet.getRow(i).getCell(i, Row.MissingCellPolicy.RETURN_BLANK_AS_NULL) == null. Но но моя главная цель не быть привязанным к сотовым номерам
Объясните пожалуйста, как формируется xlxs? И что ты здесь делаешь. Мне нужно немного больше контекста. Может быть, вы можете сделать небольшой пример.
@Игорь Ходыко, xlxs приходит ко мне с уже известными именами столбцов. Но может быть и такой случай, что каких-то динамиков не хватает, и тогда у меня не та флешка. Обычно я всегда импортирую и анализирую xlx с одинаковым количеством столбцов, но здесь количество отличается
Итак, но вы можете проверить столбцы во время выполнения и привязать его имя к своим данным?
@ИгорьХодыко Мне нужно сделать что-то подобное - не указывать количество столбцов в коде номера столбца, как я сделал cell = row.getCell(0); или row.getCell(1) или row.getCell(2). Но я не делаю это в коде.
Знаете ли вы максимальный размер столбцов и количество строк, в которых находится заголовок столбцов?
@ИгорьХодыко да (мне нужно просто количество столбцов) int noOfColumns = xssfSheet.getRow(0).getPhysicalNumberOfCells(); , я пробовал это с помощью
И в чем проблема?
@ИгорьХодыко Я думаю, что подход немного запутанный и немного неправильный..
Посмотрим, как я вижу у вас есть динамически меняющиеся столбцы, но узнать об их существовании можно только по ячейкам. Или вам нужно открыть больше информации, или это только так.
Может быть, вы можете изменить поведение формирования файла? Почему он динамичен?
@ИгорьХодыко потому что другой сервис может отправить 20 колонок, а может и 10. Я просто сделал привязку к размеру и инкременту с проверками, но не думаю, что это хороший вариант
Прочитайте первую строку, запишите, какой столбец индексирует все интересующие вас заголовки столбцов для этого файла, а затем, когда вы обрабатываете остальные строки, сопоставьте на основе индекса столбца с заголовком столбца?
Вы получили файл или данные?
@Gagravarr Да, спасибо, я пытаюсь это сделать. получить универсальную версию
@ИгорьХодыко файл xlxs
Если вы можете точно определить имя столбца и сопоставить его с данными, я не думаю, что это большая проблема. Но если это не так, я думаю, вы должны изменить API со стороны сервиса.
Может быть, нам нужно немного изменить вопрос.
Прочитайте столбцы один за другим и привяжите их тип, затем проверьте данные в этих столбцах.
См. пример проверки типов: Лучший язык для анализа очень больших файлов Excel 2007
Если вы можете точно идентифицировать столбец, это не проблема. Если нет, то стоит подумать о смене api.
Пример из 2010 года? - это не будет работать с последним кодом POI - последний код имеет перечисление CellType вместо использования целых чисел.
@PJFanning: Спасибо! Обновлено здесь.
Пожалуйста, объясните правильнее. Это непонятно. Вы не знаете тип данных в ячейке, не так ли?