有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java Apache POI Excel文件在数据库对象中的映射是否具有类似HeaderColumn策略的功能?

我的应用程序允许FE中的用户手动将HeaderColumn映射到数据库的字段。至少这是我的意图和目标

我用OpenCSV和HeaderColumnNameTranslateMappingStrategy成功地为CSV文件做了这项工作。现在我想对Excel文件这样做。xls或。xlsx也是。 后端使用Spring Boot,以JSONArray的形式获取整个文件和映射。这些列可以是数据库中每一个现有实体的列:例如商品、商店、收据等。如果名为EAN的列现在有映射文章。ean,可能还有一个名为Size的列,该列映射到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("");
     }

但我不知道如何将每个单元格值映射到我的jsonArray映射。像HeaderColumnNameTranslateMappingStrategy这样的东西不存在,或者我是瞎子


共 (1) 个答案

  1. # 1 楼答案

    我间接解决了。我建议您将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