1. 先上一段代码
public String importExcelFile(MultipartFile file) throws IOException
{
int startRow = 0;
int count = 0;
if (file.isEmpty()) {
throw new MyException(MyCodeEnum.PARAMETER_ERROR,"上传的文件不能为空");
}
InputStream inputStream = file.getInputStream();
//文件的原名称
long size = file.getSize();
String originalFilename = file.getOriginalFilename();
String fileExtName = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
logger.info("upload file path: " + originalFilename);
Date date = new Date();
// 获取当前操作用户名, 可忽略这段代码
ActiveUser activeUser = (ActiveUser) SecurityUtils.getSubject().getPrincipal();
String operator = activeUser.getUser().getUsername();
Workbook wb = null;
try {
wb = WorkbookFactory.create(inputStream);//new FileInputStream(inputStream)
Sheet sheet = wb.getSheetAt(0);
startRow = 9; // 从excel第9行开始遍历
int endRow = sheet.getLastRowNum(); // 获取该excel最后一行长度
while (startRow <= endRow) {
Row row = sheet.getRow(startRow); // 获取每一行数据
String info1 = getCellValue(row, 0); // 获取该行第0列数据xxx
...
String infon = getCellValue(row, n); // 获取该行第n列数据xxx
System.out.println(info1);
startRow++;
count++;
}
} catch (Exception e) {
logger.error(e.getMessage());
} finally {
try {
wb.close();
} catch (Exception e) {
logger.error(e.getMessage());
}
}
//TODO
return "共导入" + count + "行数据";
}
private String getCellValue(Row row, int cellIndex) {
logger.info("row: " + row.getRowNum() + " cellIndex: " + cellIndex);
if (row.getCell(cellIndex) == null || row.getCell(cellIndex).getCellTypeEnum() == CellType.BLANK)
return "";
// formatter 格式化, 可以读取任何类型的cell数据,避免了去判断cell类型是String还是Numberic等等
DataFormatter formatter = new DataFormatter();
logger.info(formatter.formatCellValue(row.getCell(cellIndex)));
return formatter.formatCellValue(row.getCell(cellIndex));
}
重点
读取excel默认行、列索引都是从0开始。
重点在一开始读取它时String数据使用
row.getCell(cellIndex).getStringCellValue();
数值类型数据读取调用
row.getCell(cellIndex).getNumericCellValue();
这样太死板,一旦excel某一列本身不是对应数据类型还得做异常校验,故采用了上述代码里的:
DataFormatter formatter = new DataFormatter();
formatter.formatCellValue(row.getCell(cellIndex));
ps:另外有个问题,当读取的excel行数较多时,
wb = WorkbookFactory.create(inputStream);
这段代码执行的特别慢,目前没啥好解决的办法,留待以后再说,若有好的解决办法,还请不吝赐教,深表感谢。
参考博客:
完美解决读取Excel的数字单元格时Cannot get a STRING value from a NUMERIC cell 报错处理
不积跬步无以至千里。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/157315.html