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

前言

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

下载

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


  org.springframework.boot
  spring-boot-starter-web

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

private static final String base_url = "target_url";

RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
// 这里请求方式为GET,如果是POST则写HttpMethod.POST
ResponseEntity response = restTemplate.exchange(request_url, HttpMethod.GET, new HttpEntity(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的包:


  org.apache.poi
  poi-ooxml
  3.17

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文件并读取内容)