У меня есть парсер xlxs. В коде. Я не могу сильно изменить свой подход

      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)

Пожалуйста, объясните правильнее. Это непонятно. Вы не знаете тип данных в ячейке, не так ли?

Игорь Ходыко 16.01.2023 19:46

Почему бы не читать по порядку, как это? Вы все еще можете switch в getCellType().

trashgod 16.01.2023 19:46

Игорь Ходыко, сейчас я привязываюсь к конкретным колонкам. Например, getCell(0) и get.cell(1). Я не понимаю, как это сделать, чтобы не привязываться так

aleksandr1994 16.01.2023 20:49

трэшбог, я не могу этого сделать, я должен сделать это во многих местах(

aleksandr1994 16.01.2023 20:50

@trashgod, мой вариант подходит, когда столбцы в файле не меняются, но если какие-то столбцы не входят в xlxs, то код будет работать некорректно

aleksandr1994 16.01.2023 20:58

@Игорь Ходыко подходит мой вариант, когда столбцы в файле не меняются, но если некоторые столбцы не входят в xlxs, то код будет работать некорректно

aleksandr1994 16.01.2023 21:01

Попробуйте установить poi.apache.org/apidocs/dev/org/apache/poi/ss/usermodel/… при извлечении ячейки, чтобы контролировать, что делать, если в этом столбце нет ячейки?

Gagravarr 17.01.2023 00:17

@Gagravarr Я проверяю xssfSheet.getRow(i).getCell(i, Row.MissingCellPolicy.RETURN_BLANK_AS_NULL) == null. Но но моя главная цель не быть привязанным к сотовым номерам

aleksandr1994 17.01.2023 07:08

Объясните пожалуйста, как формируется xlxs? И что ты здесь делаешь. Мне нужно немного больше контекста. Может быть, вы можете сделать небольшой пример.

Игорь Ходыко 17.01.2023 07:30

@Игорь Ходыко, xlxs приходит ко мне с уже известными именами столбцов. Но может быть и такой случай, что каких-то динамиков не хватает, и тогда у меня не та флешка. Обычно я всегда импортирую и анализирую xlx с одинаковым количеством столбцов, но здесь количество отличается

aleksandr1994 17.01.2023 07:42

Итак, но вы можете проверить столбцы во время выполнения и привязать его имя к своим данным?

Игорь Ходыко 17.01.2023 07:46

@ИгорьХодыко Мне нужно сделать что-то подобное - не указывать количество столбцов в коде номера столбца, как я сделал cell = row.getCell(0); или row.getCell(1) или row.getCell(2). Но я не делаю это в коде.

aleksandr1994 17.01.2023 07:52

Знаете ли вы максимальный размер столбцов и количество строк, в которых находится заголовок столбцов?

Игорь Ходыко 17.01.2023 08:25

@ИгорьХодыко да (мне нужно просто количество столбцов) int noOfColumns = xssfSheet.getRow(0).getPhysicalNumberOfCells(); , я пробовал это с помощью

aleksandr1994 17.01.2023 08:29

И в чем проблема?

Игорь Ходыко 17.01.2023 08:53

@ИгорьХодыко Я думаю, что подход немного запутанный и немного неправильный..

aleksandr1994 17.01.2023 09:00

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

Игорь Ходыко 17.01.2023 09:06

Может быть, вы можете изменить поведение формирования файла? Почему он динамичен?

Игорь Ходыко 17.01.2023 09:46

@ИгорьХодыко потому что другой сервис может отправить 20 колонок, а может и 10. Я просто сделал привязку к размеру и инкременту с проверками, но не думаю, что это хороший вариант

aleksandr1994 17.01.2023 09:57

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

Gagravarr 17.01.2023 10:08

Вы получили файл или данные?

Игорь Ходыко 17.01.2023 10:18

@Gagravarr Да, спасибо, я пытаюсь это сделать. получить универсальную версию

aleksandr1994 17.01.2023 10:19

@ИгорьХодыко файл xlxs

aleksandr1994 17.01.2023 10:20

Если вы можете точно определить имя столбца и сопоставить его с данными, я не думаю, что это большая проблема. Но если это не так, я думаю, вы должны изменить API со стороны сервиса.

Игорь Ходыко 17.01.2023 10:21

Может быть, нам нужно немного изменить вопрос.

Игорь Ходыко 17.01.2023 10:22
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
25
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

См. пример проверки типов: Лучший язык для анализа очень больших файлов Excel 2007

Если вы можете точно идентифицировать столбец, это не проблема. Если нет, то стоит подумать о смене api.

Пример из 2010 года? - это не будет работать с последним кодом POI - последний код имеет перечисление CellType вместо использования целых чисел.

PJ Fanning 17.01.2023 14:22

@PJFanning: Спасибо! Обновлено здесь.

trashgod 17.01.2023 19:15

Другие вопросы по теме