Java Apache POI Excel файлы сопоставления в объектах базы данных с чем-то вроде стратегии HeaderColumn? - PullRequest
0 голосов
/ 22 декабря 2019

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

Я сделал это для файлов CSV с OpenCSV и HeaderColumnNameTranslateMappingStrategy успешно. Теперь я хочу сделать это для файлов Excel, таких как .xls или .xlsx. Бэкэнд использует Spring Boot и получает весь файл и отображение в виде JSONArray. Столбцы могут относиться к каждой существующей сущности базы данных: например, статья, магазин, квитанция или что-то еще. Если столбец с именем EAN теперь имеет сопоставление Article.ean и, возможно, также столбец с именем Size, который сопоставлен с Article.size, тогда должен быть создан объект класса Article и остальные поля класса Articleдолжно быть пустым.

Таким образом, все строки должны быть повторены, и объекты сопоставленных типов должны быть созданы и помещены в список, а затем сохранены в базе данных.

Моя попытка пока состоит в том, чтобы прочитать всестроки, которые работают довольно хорошо:

     // Create Workbook instance holding reference to .xlsx file
     XSSFWorkbook workbook = new XSSFWorkbook(file.getInputStream());

     // 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 NUMERIC:
                 System.out.print(cell.getNumericCellValue() + "\t");
                 break;
             case STRING:
                 System.out.print(cell.getStringCellValue() + "\t");
                 break;
             case BLANK:
                 break;
             case BOOLEAN:
                 break;
             case ERROR:
                 break;
             case FORMULA:
                 break;
             case _NONE:
                 break;
             default:
                 break;
             }
         }
         System.out.println("");
     }

Но я понятия не имею, как сопоставить каждое значение cellValue с отображением моего jsonArray. Что-то вроде HeaderColumnNameTranslateMappingStrategy не существует или я слепой?

1 Ответ

0 голосов
/ 23 декабря 2019

Я решил это косвенно. Я бы порекомендовал вам конвертировать файл Excel (.xls или .xlsx) в CSV (локальная строка) и сделать из него HeaderColumnNameTranslateMappingStrategy.

Вот как я конвертирую его в csv.

     List<String[]> noDoubt = new ArrayList<>();

     StringWriter strWrt = new StringWriter();
     CSVWriter csvWrt = new CSVWriter(strWrt);

     InputStream inputStream = new BufferedInputStream(file.getInputStream());

     XSSFWorkbook xlsxWorkbook = new XSSFWorkbook(inputStream);

     XSSFSheet xlsxWorksheet = xlsxWorkbook.getSheetAt(0);

     Iterator<Row> rowIterator = xlsxWorksheet.iterator();

     while (rowIterator.hasNext()) {
         Row row = rowIterator.next();
         int i = 0; //String array
         int noOfColumns = xlsxWorksheet.getRow(0).getPhysicalNumberOfCells();
         String[] nextLine = new String[noOfColumns];

         Iterator<Cell> cellIterator = row.cellIterator();
         while (cellIterator.hasNext()) {
             Cell cell = cellIterator.next();
             switch (cell.getCellType()) {
             case STRING:
                 nextLine[i] = cell.getStringCellValue();
                 break;
             case BLANK:
                 break;
             case BOOLEAN:
                 break;
             case ERROR:
                 break;
             case FORMULA:
                 break;
             case NUMERIC:
                 String str = NumberToTextConverter.toText(cell.getNumericCellValue());
                 nextLine[i] = str;
                 break;
             case _NONE:
                 break;
             default:
                 break;
             }
             i = i + 1;
         }
         noDoubt.add(nextLine);
     }
     xlsxWorkbook.close();
     inputStream.close();
     csvWrt.writeAll(noDoubt);
     csvWrt.close();
     String finalString = strWrt.toString();

     // csv stuff following...

Этот код работает только для файлов .xlsx! Для файлов .xls используйте HSSF

...