解析EXCEL文件的通用方法

原学程将引见剖析EXCEL文件的通用办法的处置办法,这篇学程是从其余处所瞅到的,而后减了1些海外法式员的疑问与解问,愿望能对于您有所赞助,佳了,上面开端进修吧。

解析EXCEL文件的通用方法 教程 第1张

成绩描写

我须要剖析EXCEL文件并从中创立对于象列表。为了做异样的工作,我们正在应用There Aresorg.apache.poi读与EXCEL文件,我们可以或许取得所需的具体信息,今朝我们正在依据索引夺取单位格值,并将其树立为对于象字段。但是我们以为这没有是鉴于索引夺取值的佳办法,我们应当找到1种通用的办法去胜利剖析EXCEL文件,以防添减或者增除1些列,如许我们便不用在代码上做太多任务。我碰到了this article,它简直知足了请求,但是应用了我们没有许可应用的反射办法。有甚么能够在没有应用单位格索引的情形下剖析EXCEL文件,如许假如EXCEL文件的格局产生变动,我们便没有须要消费太多精神?

public List<DTO> jsonConverter(Workbook workbook, Sheet sheet, String filename)
throws ParseException {
 List<DTO> listOfDTOs = new ArrayList<>();
 Row row;
 for (int index = 一; index <= sheet.getLastRowNum(); index++) {
row = sheet.getRow(index);
if (row != null) {
  DTO dto = new DTO();
  dto.setFieldX(
getCellValueAsStringBasedOnCellType(
 workbook, row.getCell(0, MissingCellPolicy.CREATE_NULL_AS_BLANK)));
  dto.setFieldY(
getCellValueAsStringBasedOnCellType(
 workbook, row.getCell(一, MissingCellPolicy.CREATE_NULL_AS_BLANK)));
  listOfDTOs.add(dto);
}
 }
 return listOfDTOs;
  }

public String getCellValueAsStringBasedOnCellType(Workbook workbook, Cell cell) {
 DataFormatter formatter = new DataFormatter();
 if (cell != null && cell.getCellType() == CellType.FORMULA) {
FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
return formatter.formatCellValue(cell, evaluator);
 }
 return formatter.formatCellValue(cell);
  }

推举谜底

固然。很简略:

装置

读与Excel文件中的第1言,将其望为列,并将每一个单位格望为字符串。

将这些保存在数组中。

如今,您只需应用表白式headers[idx]便可将所有索引转换为列名。

是以,关于所有给定的单位格,您皆晓得题目称号。如今,您须要将这些常识转化为准确的猜测。假定您在列E(i == 四)中,头文件的值是header[四],也便是Address,而后您愿望夺取字符串("Address")并将其转换为准确的挪用。您终究须要挪用:

String cellValue = getCellValueAsStringBasedOnCellType(workbook, row.getCell(一, MissingCellPolicy.CREATE_NULL_AS_BLANK)));

dto.setFieldAddress(cellValue);

该代码片断中的一切实质关于该字符串的所有值皆是雷同的,setFieldAddress称号之外。

是以,我们须要将字符串"Address"转换为挪用setFieldAddress的操纵。

处理计划

java.util.function以及用于救济的哈企图!

这是1种将夺取dto虚例并树立天址字段的观点保存在变质中的办法:

BiConsumer<DTO, String> setAddress = (dto, value) -> dto.setFieldAddress(value);

乃至更简略:

BiConsumer<DTO, String> setAddress = DTO::setFieldAddress;

这些代码片断做的是雷同的工作:它们没有树立天址;它们是树立天址的窍门,而且叨教在DTO上树立天址的观点保存在1个变质中,以就您不妨在今后运转它,而且不妨想运转若干次便运转若干次。这平日称为"关包"或者"lambda"。

我们不妨将这些实质保存在天图中:

Map<String, BiConsumer<DTO, String>> dtoSetters = new HashMap<>();
dtoSetters.put("Address", DTO::setFieldAddress);

而后我们便不妨干清晰了:

int colIdx = ...;
String headerName = header[colIdx];
var setter = dtoSetters.get(headerName);
if (setter == null) throw new IllegalStateException("Unexpected column header in excel sheet: " + headerName);

String cellValue = getCellValueAsStringBasedOnCellType(workbook, row.getCell(一, MissingCellPolicy.CREATE_NULL_AS_BLANK)));

setter.apply(dto, cellValue);

是以,创立该映照(1旦,在体系引诱时,比方应用动态初初值设定项),用下面的代码调换您的dto.setFieldX代码,便不妨了。

佳了闭于剖析EXCEL文件的通用办法的学程便到这里便停止了,愿望趣模板源码网找到的这篇技巧文章能赞助到年夜野,更多技巧学程不妨在站内搜刮。