linux下Java上传解析excel报错java.io.FileNotFoundException:xxx.xls(No such file or directory)

原文链接:https://www.longkui.site/error/linuxjavaexceljava-io/4523/
0.背景
一个简单的上传并解析excel文件的方法,在windows上正常导入并解析,但是放到linux中上传excel就报错”No such file or directory”。一开始以为是linux服务器权限的问题,但是把所有的权限都改成777后发现还是报错,于是开始找代码的错并修改成功。这篇文章简单记录了改错的过程。

1.windows下的代码
@RequestMapping(value = "/batchImport ", method = RequestMethod.POST)
@ResponseBody
public InvokeResult batchImport(HttpServletResponse response,
@RequestParam(“file”) MultipartFile file) throws IOException {
try {
if (file == null) {
return InvokeResult.failure(“文件内容错误”);
}
int n;
File f = new File(file.getOriginalFilename());
try (InputStream in = file.getInputStream();
OutputStream os = new FileOutputStream(f)) {
// 得到文件流。以文件流的方式输出到新文件
// 可以使用byte[] ss = multipartFile.getBytes();代替while
byte[] buffer = new byte[4096];
while ((n = in.read(buffer, 0, 4096)) != -1) {
os.write(buffer, 0, n);
}
// 读取文件第一行
BufferedReader bufferedReader = new BufferedReader(new FileReader(f));
// 输出路径
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
InputStream is = new FileInputStream(f);
Workbook xssfWorkbook = new HSSFWorkbook(is);
Sheet xssfSheet = xssfWorkbook.getSheetAt(0);
if (xssfSheet.getLastRowNum() < 1) {
return InvokeResult.failure(“EXCEL文件中没有数据!”);
}
//从第4行开始输入
int sum=0;
for (int rowNum = 3; rowNum <= xssfSheet.getLastRowNum(); rowNum++) {
try{
Row xssfRow = xssfSheet.getRow(rowNum);
EnergySavingReview energySavingReview =new EnergySavingReview();
String id = UUID.randomUUID().toString();
energySavingReview.setId(id);
// 每一行构建一个新对象
Student stu = new Student();
if (xssfRow != null) {
//第一列数据
Cell c1 = xssfRow.getCell(0);
try{
if(c1!=null){
stu.id(getCellValueStr(c1));
}
}catch (Exception e){
return InvokeResult.failure(“第” + (rowNum + 1) + “行数据,id解析失败!”);
}
//继续构造其他行数据

            }
            catch (Exception e) {
                return InvokeResult.failure("导入失败,请检查第" + (rowNum + 1) + "行数据");
            }
        }
        //这里使用insert往数据库里插入数据
        
        
        String result="成功导入"+sum+"条数据.";
        return InvokeResult.success(result);
    }catch (Exception ex) {
        return InvokeResult.failure("批量导入数据源出现错误:" + ex.toString());
    }
}
//获取Excel单元格的字符串值
public static String getCellValueStr(Cell cell) {
    cell.setCellType(CellType.STRING);
    return cell.getStringCellValue();
}
//获取Excel单元格的NUMERIC值
public static double getCellValueDouble(Cell cell) {
    cell.setCellType(CellType.NUMERIC);
    return cell.getNumericCellValue();
}

上面这段代码在windows上正常上传并解析excel入库,但是到了linux上就开始报错。查了很多百度,有的说是路径问题,有的说是格式问题,但是最后都没有解决掉。最终在不断的尝试下,终于找到问题所在,在于文件流那一部分。

  1. linux 下的代码
    @RequestMapping(value = "/batchImport ", method = RequestMethod.POST)
    @ResponseBody
    public InvokeResult batchImport(HttpServletResponse response,
    @RequestParam(“file”) MultipartFile file) throws IOException {
    try {
    if (file == null) {
    return InvokeResult.failure(“文件内容错误”);
    }
    try {
    if (file == null) {
    return InvokeResult.failure(“文件内容错误”);
    }
    Workbook workbook = null;
    InputStream inputStream = file.getInputStream();
    workbook = new HSSFWorkbook(inputStream);
    Sheet xssfSheet = workbook.getSheetAt(0); //读取第一个sheet页
    if (xssfSheet.getLastRowNum() < 1) {
    return InvokeResult.failure(“EXCEL文件中没有数据!”);
    }
    //从第4行开始输入
    int sum=0;
    for (int rowNum = 3; rowNum <= xssfSheet.getLastRowNum(); rowNum++) {
    try{
    Row xssfRow = xssfSheet.getRow(rowNum);
    EnergySavingReview energySavingReview =new EnergySavingReview();
    String id = UUID.randomUUID().toString();
    energySavingReview.setId(id);
    // 每一行构建一个新对象
    Student stu = new Student();
    if (xssfRow != null) {
    //第一列数据
    Cell c1 = xssfRow.getCell(0);
    try{
    if(c1!=null){
    stu.id(getCellValueStr(c1));
    }
    }catch (Exception e){
    return InvokeResult.failure(“第” + (rowNum + 1) + “行数据,id解析失败!”);
    }
    //继续构造其他行数据

             }
             catch (Exception e) {
                 return InvokeResult.failure("导入失败,请检查第" + (rowNum + 1) + "行数据");
             }
         }
         //这里使用insert往数据库里插入数据
         
         
         String result="成功导入"+sum+"条数据.";
         return InvokeResult.success(result);
     }catch (Exception ex) {
         return InvokeResult.failure("批量导入数据源出现错误:" + ex.toString());
     }
    

    }
    把原来那一部分try…catch 去掉后,改成下面这样

         Workbook workbook = null;
         InputStream inputStream = file.getInputStream();
         workbook = new HSSFWorkbook(inputStream);
         Sheet xssfSheet = workbook.getSheetAt(0);  //读取第一个sheet页
         if (xssfSheet.getLastRowNum() < 1) {
             return InvokeResult.failure("EXCEL文件中没有数据!");
         }
    

然后重新打包上传到linux上,就上传解析excel正常了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: java.io.filenotfoundexception: openfailed: enoent (no such file or directory)是Java程序中常见的异常之一,表示在指定路径或目录下找不到文件或文件夹。 通常这种异常会在程序尝试打开一个文件时发生,可能是因为路径错误,文件不存在或者没有权限等原因导致。解决该异常的方法是检查程序中读取或写入文件的路径是否正确,确认文件是否存在,以及确保程序有足够的权限访问目标文件。 在处理该异常时,可以使用Java的异常处理机制来捕获该异常并给出相应的提示信息,如未找到文件或目录,请检查路径是否正确、文件是否存在、是否有权限等。同时,对于无法处理的情况,可以通过向用户显示错误消息或记录日志来提醒用户或开发者。 总之,遇到java.io.filenotfoundexception: openfailed: enoent (no such file or directory)异常时,一定不要惊慌,需要对代码进行仔细检查,找出问题所在,最终通过适当的处理方法来解决问题。 ### 回答2: 这个错误提示是Java编程中常见的IO异常之一。它产生的原因是程序尝试打开一个不存在的文件或文件夹。 当程序运行时,它会尝试打开一个指定的文件或文件夹。如果这个文件或文件夹不存在,那么Java就会抛出这个异常。通常这个错误提示会指示程序在执行open方法时出错,因为找不到指定的文件或文件夹。 如果你遇到了这个问题,首先要检查的是你的文件路径是否正确。你应该确保你指定的路径是一个存在的文件或文件夹。如果这个路径确实存在,那么你还需要检查该路径是否可读,是否被占用等等。 此外,这个错误提示也可能是由于文件权限的问题所致。如果你正在尝试读取或写入一个文件,但是你没有足够的权限来访问它,那么Java就会抛出这个异常。 总之,要解决这个问题,你需要仔细检查你的代码,确保文件路径正确并且你有足够的权限来访问它。如果问题仍未解决,你可能需要查看更多的异常信息来确定具体的原因。 ### 回答3: Java是一种运行于虚拟机上的编程语言Java提供了一套完整的API,包括操作文件系统的API。在Java程序中,当我们想要打开一个文件时,会出现如下提示:java.io.filenotfoundexception: openfailed: enoent (no such file or directory)。 该异常表示在尝试打开该文件之前,Java未找到指定的文件或目录。通常情况下,这种错误会由于路径错误或文件名输入错误而引起。解决这个问题的方法如下: 1. 检查文件路径是否正确: 当我们向打开文件时,指定的文件路径必须是正确的。如果文件路径不正确,则会出现java.io.filenotfoundexception异常。因此,我们需要确保路径是指向正确的文件或目录。 2. 检查文件名是否正确: 文件名可能会输入错误,例如,大小写可能会错误地输入或者忘记输入扩展名。在这种情况下,我们需要检查文件名是否正确,并且输入的大小写是否符合实际情况。 3. 检查文件是否存在: 在尝试打开文件之前,我们需要确保该文件真正存在。因此,我们需要检查该文件是否存在,如果不存在,则需要创建新文件或引发NoSuchFileException异常。 总之,当我们在Java程序中打开文件时,如果出现java.io.filenotfoundexception: openfailed: enoent (no such file or directory)异常,我们需要首先检查路径和文件名是否正确,并且确保文件真实存在。如果以上三种方法无法解决问题,我们需要检查文件系统中的权限问题,或者文件是否正在使用等其他问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值