Java REST客户端接收和保存excel响应时出错(字节数组)

Java REST客户端接收和保存excel响应时出错(字节数组),java,excel,rest,Java,Excel,Rest,我让SpringREST服务以字节数组的形式返回excel文件(XLS),并且需要编写适当的客户端代码来接收此响应并保存该文件。无法获取字节数组响应,但在将其转换为excel工作簿(HSSFWorkbook)时出现以下错误 org.apache.poi.poifs.filesystem.NotOLE2FileException:头签名无效;读取0x000506000100809,应为0xE11AB1A1E011CFD0-您的文件似乎不是有效的OLE2文档 我尝试了以下方法,但没有成功 在返回响应

我让SpringREST服务以字节数组的形式返回excel文件(XLS),并且需要编写适当的客户端代码来接收此响应并保存该文件。无法获取字节数组响应,但在将其转换为excel工作簿(HSSFWorkbook)时出现以下错误

org.apache.poi.poifs.filesystem.NotOLE2FileException:头签名无效;读取0x000506000100809,应为0xE11AB1A1E011CFD0-您的文件似乎不是有效的OLE2文档

我尝试了以下方法,但没有成功

  • 在返回响应之前,通过将文件保存在服务中来验证该文件是否有效
  • 尝试发送InputStream而不是字节数组
  • 尝试使用ResponseEntity 等
  • 服务端代码

    HSSFWorkbook workbook = //code to generate the workbook
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    workbook.write(outputStream);
    byte[] response = outputStream.toByteArray();
    
                HSSFWorkbook workbook = //workbook creation call
                ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
                workbook.write(outputStream);
                response = outputStream.toByteArray();
                headers = new HttpHeaders();
                headers.setAccessControlExposeHeaders(Collections.singletonList("Content-Disposition"));
                headers.set("Content-Disposition", "attachment; filename=download.xls");
                headers.setAccessControlExposeHeaders(Collections.singletonList("Content-Type"));
                headers.set("Content-Type","application/vnd.ms-excel");
                outputStream.close();
    
    String uri = //URI
        RestTemplate restTemplate = new RestTemplate();
            //input object
        ResponseEntity<byte[]> result = restTemplate.postForEntity(uri, input, byte[].class);
        if(result!=null && result.getStatusCodeValue() == 200 && result.getBody()!=null && result.getBody().length>0)
        {
            ByteArrayInputStream inputStream = new ByteArrayInputStream(result.getBody());
            HSSFWorkbook workbook = new HSSFWorkbook(inputStream);
            FileOutputStream outputStream = new FileOutputStream("output\\download.xls");
            workbook.write(outputStream);
            inputStream.close();
            workbook.close();
            outputStream.close();
        }
    

    非常感谢您的帮助。

    找到问题并解决

    服务器端代码

    HSSFWorkbook workbook = //code to generate the workbook
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    workbook.write(outputStream);
    byte[] response = outputStream.toByteArray();
    
                HSSFWorkbook workbook = //workbook creation call
                ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
                workbook.write(outputStream);
                response = outputStream.toByteArray();
                headers = new HttpHeaders();
                headers.setAccessControlExposeHeaders(Collections.singletonList("Content-Disposition"));
                headers.set("Content-Disposition", "attachment; filename=download.xls");
                headers.setAccessControlExposeHeaders(Collections.singletonList("Content-Type"));
                headers.set("Content-Type","application/vnd.ms-excel");
                outputStream.close();
    
    String uri = //URI
        RestTemplate restTemplate = new RestTemplate();
            //input object
        ResponseEntity<byte[]> result = restTemplate.postForEntity(uri, input, byte[].class);
        if(result!=null && result.getStatusCodeValue() == 200 && result.getBody()!=null && result.getBody().length>0)
        {
            ByteArrayInputStream inputStream = new ByteArrayInputStream(result.getBody());
            HSSFWorkbook workbook = new HSSFWorkbook(inputStream);
            FileOutputStream outputStream = new FileOutputStream("output\\download.xls");
            workbook.write(outputStream);
            inputStream.close();
            workbook.close();
            outputStream.close();
        }
    
    客户端代码

    HSSFWorkbook workbook = //code to generate the workbook
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    workbook.write(outputStream);
    byte[] response = outputStream.toByteArray();
    
                HSSFWorkbook workbook = //workbook creation call
                ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
                workbook.write(outputStream);
                response = outputStream.toByteArray();
                headers = new HttpHeaders();
                headers.setAccessControlExposeHeaders(Collections.singletonList("Content-Disposition"));
                headers.set("Content-Disposition", "attachment; filename=download.xls");
                headers.setAccessControlExposeHeaders(Collections.singletonList("Content-Type"));
                headers.set("Content-Type","application/vnd.ms-excel");
                outputStream.close();
    
    String uri = //URI
        RestTemplate restTemplate = new RestTemplate();
            //input object
        ResponseEntity<byte[]> result = restTemplate.postForEntity(uri, input, byte[].class);
        if(result!=null && result.getStatusCodeValue() == 200 && result.getBody()!=null && result.getBody().length>0)
        {
            ByteArrayInputStream inputStream = new ByteArrayInputStream(result.getBody());
            HSSFWorkbook workbook = new HSSFWorkbook(inputStream);
            FileOutputStream outputStream = new FileOutputStream("output\\download.xls");
            workbook.write(outputStream);
            inputStream.close();
            workbook.close();
            outputStream.close();
        }
    
    stringuri=//uri
    RestTemplate RestTemplate=新RestTemplate();
    //输入对象
    ResponseEntity结果=restTemplate.postForEntity(uri,输入,字节[].class);
    如果(结果!=null&&result.getStatusCodeValue()==200&&result.getBody()!=null&&result.getBody().length>0)
    {
    ByteArrayInputStream inputStream=新建ByteArrayInputStream(result.getBody());
    HSSF工作簿=新的HSSF工作簿(inputStream);
    FileOutputStream outputStream=新的FileOutputStream(“output\\download.xls”);
    workbook.write(outputStream);
    inputStream.close();
    workbook.close();
    outputStream.close();
    }