gpt4 book ai didi

Java Apache POI Excel 文件使用诸如 HeaderColumn 策略之类的方法映射到数据库对象中?

转载 作者:行者123 更新时间:2023-12-01 19:13:54 25 4
gpt4 key购买 nike

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

我使用 OpenCSV 和 HeaderColumnNameTranslateMappingStrategy 成功地对 CSV 文件执行了此操作。现在我也想对 .xls 或 .xlsx 等 Excel 文件执行此操作。后端使用 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 这样的东西不存在,还是我瞎了?

最佳答案

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

关于Java Apache POI Excel 文件使用诸如 HeaderColumn 策略之类的方法映射到数据库对象中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59440266/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com