【问题标题】:Convert byteArray to XSSFWorkbook using Apache POI使用 Apache POI 将 byteArray 转换为 XSSFWorkbook
【发布时间】:2017-04-06 16:40:52
【问题描述】:

我正在使用 Apache POI,我正在尝试将 xlsx 文件作为 HTTP 请求发送并将其作为响应返回。我正在使用jayway restassured 发出 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

【问题讨论】:

    标签: java apache-poi


    【解决方案1】:

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

    会有可能被替换/截断/修改的特殊字符。

    目前您将二进制数据和纯文本通道 (HTTP) 混合在一起。您将需要以不同的方式进行操作,要么使用二进制数据传输而不将其转换为字符串,要么使用一些二进制到文本的表示形式,参见例如https://en.wikipedia.org/wiki/Binary-to-text_encoding,最常见的是Base64

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-17
      • 1970-01-01
      • 1970-01-01
      • 2017-10-26
      • 2018-04-29
      • 1970-01-01
      相关资源
      最近更新 更多