编程语言
首页 > 编程语言> > java-使用Apache POI将byteArray转换为XSSFWorkbook

java-使用Apache POI将byteArray转换为XSSFWorkbook

作者:互联网

我正在使用Apache POI,并且尝试将xlsx文件作为HTTP请求发送并作为响应返回.我正在使用jayway来确保发出HTTP请求.

这是我发送请求的代码部分

 File file = new File("path");
String response = given().multipart(file).when().post("URL").getBody().asString();

byte[] bytes = response.getBytes("ISO-8859-1");
InputStream stream = new ByteArrayOutputStream(bytes);

try
{
    XSSFWorkbook workbook = new XSSFWorkbook(stream);
}
catch(Exception e){
    e.printStackTrace();
}

这是为请求生成响应的代码

XSSFWorkbook workBook;  //this workBook has the workbook sent as HTTP request
//code to make changes in workBook

ByteArrayOutputStream outStream = new ByteArrayOutputStream();

workBook.write(outStream);
byte[] byteArray = outStream.toByteArray();
String responseBody = new String(byteArray, "ISO-8859-1");

context.response().putHeader("Content-Type", "multipart/form-data").setStatusCode(200).end(responseBody);

因此,我想做的是发送xlsx文件作为请求进行一些更改,并将其作为字符串响应返回,然后将其转换回xssfworkbook.当转换回来时,我在下面的行中得到错误-

XSSFWorkbook workbook = new XSSFWorkbook(stream);

我得到的错误是

java.util.zip.ZipException: invalid code lengths set

解决方法:

您不能简单地以您尝试的方式将字节数组作为ISO-8859-1编码的文本发送.

会有一些特殊字符可能会被替换/截断/修改.

当前,您将二进制数据和纯文本通道(HTTP)混合在一起.您将需要做不同的事情,要么使用二进制数据传输而不将其转换为String,要么使用某种二进制文本表示法,例如https://en.wikipedia.org/wiki/Binary-to-text_encoding,最常见的是Base64

标签:apache-poi,java
来源: https://codeday.me/bug/20191118/2024485.html