前言
公司要做一个对某个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();
}
网友评论