美文网首页
Java请求(下载)Excel文件并读取内容

Java请求(下载)Excel文件并读取内容

作者: 小米智能香蕉 | 来源:发表于2021-05-04 19:46 被阅读0次

    前言

    公司要做一个对某个API请求所得到数据的呈现,可是这个API返回的并不是纯数据的格式,而是一个ms-excel的格式(如果直接在浏览器访问该接口地址,则会直接下载Excel文件到本地),处理起来稍显麻烦。

    下载

    咱们使用RestTemplate完成请求,在Springboot项目中使用,包含starter-web就好:

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    

    使用起来非常简单,几行就搞定了:

    private static final String base_url = "target_url";
    
    RestTemplate restTemplate = new RestTemplate();
    HttpHeaders headers = new HttpHeaders();
    // 这里请求方式为GET,如果是POST则写HttpMethod.POST
    ResponseEntity<byte[]> response = restTemplate.exchange(request_url, HttpMethod.GET, new HttpEntity<byte[]>(headers), byte[].class);
    byte[] result = response.getBody();
    

    可以发现,在响应体(Body)中Excel文件(其他文件也是如此)是通过字节流的形式传输的,如果希望直接把结果保存成文件,那么这样写就好:

    String filePath = "想要保存的文件路径,例如:E:/result.xlsx";
    try {
      InputStream inputStream = new ByteArrayInputStream(result);
      outputStream = new FileOutputStream(new File(filePath));
      int len = 0;
      byte[] buf = new byte[1024];
      while ((len = inputStream.read(buf, 0, 1024)) != -1) {
        outputStream.write(buf, 0, len);
      }
      outputStream.flush();
    } catch (Exception e) {
        e.printStackTrack();
    } finally {
      // 关闭输入、输出流
      try {
        if(inputStream != null) inputStream.close();
        if(outputStream != null) outputStream.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
    

    处理

    如果单纯只是想要其中的数据,不想保存为文件(不然保存好了又要读取,反复操作,效率就低了),那么,咱们就直接字节流然后处理就好啦。

    引入poi-ooxml包,这是一个专门处理Excel的包:

    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml</artifactId>
      <version>3.17</version>
    </dependency>
    

    3.17是目前相对合适的版本,有更高的5.0版本,但似乎部分用法发生了变化,会引起错误。

    然后保存文件的部分,替换为直接读取:

    try {
      InputStream inputStream = new ByteArrayInputStream(result);
      // 如果是2007以上的版本创建的Excel文件,一定要用XSSF
      XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
      // 读取第一个Sheet
      XSSFSheet sheet = workbook.getSheetAt(0);
      // 循环读取每一行
      for (int rowNum = 1; rowNum <= sheet.getLastRowNum(); rowNum++) {
        // 读取该行第0列的元素,用getRow().getCell得到的是一个Cell对象
        String v = sheet.getRow(rowNum).getCell(0).getStringCellValue()
        // 做其他操作...
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
    

    根据不同的元素类型,还有getNumericCellValue()getBooleanCellValue()方法。

    如果要读取本地的文件,同样地使用文件输入流来创建即可:

    String filePath = "本地的文件路径,例如:C:/file.xlsx";
    try {
      InputStream inputStream = new FileInputStream(filePath);
      XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
      // 其他操作类似...
    } catch (Exception e) {
      e.printStackTrace();
    }
    

    相关文章

      网友评论

          本文标题:Java请求(下载)Excel文件并读取内容

          本文链接:https://www.haomeiwen.com/subject/dnchdltx.html