关于java用EasyExcel读取Excel表格数据,有的单元格数据是公式的,如何获取具体值的问题
问题:读取数据的时候,有的表格读取出来的是一个公式,不是我看到的值。
·
问题:读取数据的时候,有的表格读取出来的是一个公式,不是我看到的值
解决办法:一:如果是直接读取本地文件的,如下:
InputStream in = new FileInputStream("path/to/your/excel/file.xlsx")) {
Workbook workbook = WorkbookFactory.create(in);
FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
for (Sheet sheet : workbook) {
for (Row row : sheet) {
for (Cell cell : row) {
if (cell != null) {
// 移除公式,只保留计算后的值
cell.setCellFormula(null);
// 计算单元格的值
evaluator.evaluateFormulaCell(cell);
//获取单元格的值
String cellValue = getStringCellValue(cell).trim()
}
}
}
}
二:由前端传输文件,通过EasyExcel读取,如下:
private List<GoodsRecordDTO> parseExcelToOrderDTOList(MultipartFile file) throws IOException {
ExcelReader reader = ExcelUtil.getReader(file.getInputStream());
List<String> sheetNames = reader.getSheetNames();
List<GoodsRecordDTO> read = new ArrayList<>();
sheetNames.forEach(sheetName -> {
reader.setSheet(sheetName);
FormulaEvaluator evaluator = reader.getWorkbook().getCreationHelper().createFormulaEvaluator();
Sheet sheet = reader.getSheet();
Row row = this.findHeaderRow(sheet,evaluator);
String harbour = this.getHarbour(sheet,evaluator);
int headerRow = row.getRowNum();
reader.setIgnoreEmptyRow(true);
Map<String, String> aliasMap = new HashMap<>();
aliasMap.put("CD", "cd");
aliasMap.put("Qty", "qty");
aliasMap.put("Unit", "unit");
reader.setHeaderAlias(aliasMap);
// 第一个参数是指表头所在行,第二个参数是指从哪一行开始读取
List<GoodsRecordDTO> read1 = reader.read(headerRow + 1, headerRow + 2, GoodsRecordDTO.class);
});
return read;
}
//获取某个关键信息
private String getHarbour (Sheet sheet,FormulaEvaluator evaluator) {
//关键词1
String keyWord1 = "FROM";
//关键词2
String keyWord2 = "TO";
//关键词3
String keyWord3 = "BY";
String harbour = null;
for (Row row : sheet) {
StringBuilder buffer = new StringBuilder();
for (Cell cell : row) {
if (cell != null) {
cell.setCellFormula(null); // 移除公式,只保留计算后的值
evaluator.evaluateFormulaCell(cell); // 计算单元格的值
String cellValue = getStringCellValue(cell).trim().toUpperCase();
buffer.append(cellValue);
}
}
String line = buffer.toString();
if (StringUtils.isNotBlank(line)) {
if (line.contains(keyWord1)&&line.contains(keyWord2)&&line.contains(keyWord3)){
String s = line.split(keyWord2)[1];
harbour = s.split(keyWord3)[0];
return harbour;
}
}
}
return null;
}
//定位标题行
private Row findHeaderRow(Sheet sheet,FormulaEvaluator evaluator) {
HashSet<Object> requiredHeaders = new HashSet<>();
requiredHeaders.add("CD");
requiredHeaders.add("HOME FASHION GOODS AND/OR PARTS");
requiredHeaders.add("QTY");
requiredHeaders.add("UNIT");
for (Row row : sheet) {
int matchCount = 0;
for (Cell cell : row) {
cell.setCellFormula(null); // 移除公式,只保留计算后的值
evaluator.evaluateFormulaCell(cell); // 计算单元格的值
String cellValue = getStringCellValue(cell).trim().toUpperCase();
if (requiredHeaders.contains(cellValue)) {
matchCount++;
}
}
// 当匹配到70%以上的标题时判定为标题行
if (matchCount >= requiredHeaders.size() * 0.7) {
return row;
}
}
throw new IllegalArgumentException("未找到有效的标题行");
}
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)