首页 > 系统相关 >linux下Java上传解析excel报错java.io.FileNotFoundException:xxx.xls(No such file or directory)

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

时间:2022-09-03 16:14:21浏览次数:92  
标签:Java linux excel 报错 file new such InvokeResult

原文链接:linux下Java上传解析excel报错java.io.FileNotFoundException:xxx.xls(No such file or directory) – 每天进步一点点 (longkui.site)

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上就开始报错。查了很多百度,有的说是路径问题,有的说是格式问题,但是最后都没有解决掉。最终在不断的尝试下,终于找到问题所在,在于文件流那一部分。

2. 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正常了。

标签:Java,linux,excel,报错,file,new,such,InvokeResult
From: https://www.cnblogs.com/longkui-site/p/16652841.html

相关文章

  • JavaScript的变量命名规则和关键字的介绍
    JavaScript的变量命名规则和关键字的介绍规则一:开头必须是字母或$或_规则二:关键字和保留字不能用做变量名那么能不能使用typeof做为变量名呢?想都别想!那么能不能......
  • java 用反射获取自定义注解的信息实例
    最近看了些spring的源码,回来重新看一下反射和注解的一些文档,写了一个小例子,记录一下。packagecom.wbk.annotation;importjava.lang.annotation.*;importjava.lang.refle......
  • 力扣20(java)-有效的括号(简单)
    题目:给定一个只包括'(',')','{','}','[',']' 的字符串s,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括......
  • java学习9.3-重写
    1.重写:子类继承父类以后,可以对父类中同名同参数的方法,进行覆盖操作2.应用:重写以后,当创建子类对象以后,通过子类对象调用子父类中的同名同参数的方法时,实际执行的是子类重写......
  • 用文本文档写第一个java程序并用命令行运行
    新建一个文本文档,后缀是java  编辑以下代码:classHellochina{publicstaticvoidmain(String[]args){System.out.println("hello");}......
  • [javascript] 构造函数与原型对象 +原型链
    构造函数与原型对象1、使用工厂方法创建对象functioncreatePerson(name,age,gender){//创建一个新的对象varobj=newObject();//向对象中添加属性......
  • Java 使用flink读写kafka中的数据(windows下)
    一、启动服务(网上查)1、启动zookeeper2、启动kafka3、启动flink二、写producerpublicvoidkafkaProducer(List<ResultBean>opcValue)throwsException{......
  • [javascript] 自调用函数
    自调用函数(IIFE)作用1.隐藏实现2.利用局部作用域,避免污染全局命名空间3.用它编写js模块(function(){vara=3;console.log(a+3);})();......
  • java环境变量配置
    安装好java和jdk之后,对环境进行配置。  ================  上面的administrator是用户变量,下面为系统变量,上面或者下面都可以配置,这里选择配置系统变量。  先......
  • 并发的核心:CAS 是什么?Java8是如何优化 CAS 的?
    大家可能都听说说Java中的并发包,如果想要读懂Java中的并发包,其核心就是要先读懂CAS机制,因为CAS可以说是并发包的底层实现原理。今天就带大家读懂CAS是......