如何在 java 中将 POI 工作簿添加为 json 元素
How to add POI Workbook as a json element in java
我在这个问题上苦苦挣扎了好几天。我需要将 Apache poi 工作簿添加到 json 对象。我尝试了 Json.org、objectmapper 和 gson 库。
我序列化它的方法对于所有经过测试的库都是相似的,例如:
objectMapper.writeValue(writer, objectToSerialize);
当我想写入 json 我的工作簿对象时,我收到此错误:
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Not implemented yet (through reference chain: com.....[".."]->java.util.ArrayList[0]->com.["workbook"]->org.apache.poi.xssf.usermodel.XSSFWorkbook["hidden"])
at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:388)
at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:348)
at com.fasterxml.jackson.databind.ser.std.StdSerializer.wrapAndThrow(StdSerializer.java:343)
有没有办法解决这个问题,或者我应该尝试其他方法吗?谢谢
Axel Richter 的评论是正确的,工作簿不可序列化。
发送 Java Object
并避免对文件本身进行编码的解决方法,首先使用 WorkBook
的 write(OutputStream s) 方法:
void write(java.io.OutputStream stream)
Write out this workbook to an Outputstream.
完成后,我们可以将原始 OutputStream
的字节转换为 Base64 编码字符串。 发送的步骤现在已经完成了。
现在,当接收到字符串时,为了将其读回 Workbook Object
,关键是使用 Workbook(InputStream s)
构造函数。 Workbook 的三个直接实现中有两个提供了此构造函数,而最棘手的实现还需要多一步。 (下面的附录中有关于此的信息)*.
这段代码是对整个过程的简单测试。
Workbook -> convert -> send -> receive -> revert -> Workbook
使用 Workbook
的 HSSFWorkbook
实现来实际测试它。
编码 - 发送{附加到Json}
HSSFWorkbook wb = new HSSFWorkbook();
wb.createSheet("test");
ByteArrayOutputStream binOut = new ByteArrayOutputStream();
wb.write(binOut);
String wbString = Base64.getEncoder().encodeToString(binOut.toByteArray());
wb.close();
现在,工作簿表示为字符串 [wbString
],您可以将其附加到 JSON。另请注意,ByteArray
流不需要关闭,但根据我的阅读,工作簿应该关闭。
出于好奇,这个例子的编码base64:
0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAOwADAP7/CQAGAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAEAAABQAAAAEAAAD+////AAAAAAYAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9SAG8AbwB0ACAARQBuAHQAcgB5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAFAf//////////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAACABgAAAAAAAFcAbwByAGsAYgBvAG8AawAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAAIB////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAD///////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAP///////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkIEAAABgUA0xDMB0EAAAAGAAAA4QACALAEwQACAAAA4gAAAFwAcAAFAAA2MDE1NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQgACALAEYQECAAAAPQECAAAAnAACAA4AGQACAAAAEgACAAAAEwACAAAArwECAAAAvAECAAAAPQASAGgBDgFcOr4jOAAAAAAAAQBYAkAAAgAAAI0AAgAAACIAAgAAAA4AAgABALcBAgAAANoAAgAAADEAFQDIAAAA/3+QAQAAAAAAAAUAQXJpYWwxABUAyAAAAP9/kAEAAAAAAAAFAEFyaWFsMQAVAMgAAAD/f5ABAAAAAAAABQBBcmlhbDEAFQDIAAAA/3+QAQAAAAAAAAUAQXJpYWweBBoABQAVAAAiJCIjLCMjMF8pOygiJCIjLCMjMCkeBB8ABgAaAAAiJCIjLCMjMF8pO1tSZWRdKCIkIiMsIyMwKR4EIAAHABsAACIkIiMsIyMwLjAwXyk7KCIkIiMsIyMwLjAwKR4EJQAIACAAACIkIiMsIyMwLjAwXyk7W1JlZF0oIiQiIywjIzAuMDApHgQsACoAJwAAXygqICMsIyMwXyk7XygqICgjLCMjMCk7XygqICItIl8pO18oQF8pHgQ1ACkAMAAAXygiJCIqICMsIyMwXyk7XygiJCIqICgjLCMjMCk7XygiJCIqICItIl8pO18oQF8pHgQ0ACwALwAAXygqICMsIyMwLjAwXyk7XygqICgjLCMjMC4wMCk7XygqICItIj8/Xyk7XyhAXykeBD0AKwA4AABfKCIkIiogIywjIzAuMDBfKTtfKCIkIiogKCMsIyMwLjAwKTtfKCIkIiogIi0iPz9fKTtfKEBfKeAAFAAAAAAA9f8gAAAAAAAAAAAAAADAIOAAFAABAAAA9f8gAAD0AAAAAAAAAADAIOAAFAABAAAA9f8gAAD0AAAAAAAAAADAIOAAFAACAAAA9f8gAAD0AAAAAAAAAADAIOAAFAACAAAA9f8gAAD0AAAAAAAAAADAIOAAFAAAAAAA9f8gAAD0AAAAAAAAAADAIOAAFAAAAAAA9f8gAAD0AAAAAAAAAADAIOAAFAAAAAAA9f8gAAD0AAAAAAAAAADAIOAAFAAAAAAA9f8gAAD0AAAAAAAAAADAIOAAFAAAAAAA9f8gAAD0AAAAAAAAAADAIOAAFAAAAAAA9f8gAAD0AAAAAAAAAADAIOAAFAAAAAAA9f8gAAD0AAAAAAAAAADAIOAAFAAAAAAA9f8gAAD0AAAAAAAAAADAIOAAFAAAAAAA9f8gAAD0AAAAAAAAAADAIOAAFAAAAAAA9f8gAAD0AAAAAAAAAADAIOAAFAAAAAAAAQAgAAAAAAAAAAAAAADAIOAAFAABACsA9f8gAAD4AAAAAAAAAADAIOAAFAABACkA9f8gAAD4AAAAAAAAAADAIOAAFAABACwA9f8gAAD4AAAAAAAAAADAIOAAFAABACoA9f8gAAD4AAAAAAAAAADAIOAAFAABAAkA9f8gAAD4AAAAAAAAAADAIJMCBAAQgAP/kwIEABGABv+TAgQAEoAE/5MCBAATgAf/kwIEAACAAP+TAgQAFIAF/2ABAgAAAIUACwBLBQAAAAADAGFhYYwABAABAAEArgEEAAEAAQQXAAgAAQAAAAAAAAD8AAgAAAAAAAAAAAD/AAIACAAKAAAACQgQAAAGEAC7DcwHwQAAAAYAAAALAhAAAAAAAP////8AAAAAAAAAAA0AAgABAAwAAgBkAA8AAgABABEAAgAAABAACAD8qfHSTWJQP18AAgABACoAAgAAACsAAgAAAIIAAgABAIAACAAAAAAAAAAAACUCBAAAAP8AgQACAMEEFAAAABUAAACDAAIAAACEAAIAAAChACIAAQBkAAEAAQABAAIALAEsAQAAAAAAAOA/AAAAAAAA4D8BAFUAAgAIAAACDgAAAAAAAQAAAAAAAQAAAD4CEgC2BgAAAABAAAAAAAAAAAAAAAAdAA8AAwAAAAAAAAEAAAAAAAAACgAAAP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAAEwAAABQAAAAVAAAAFgAAABcAAAAYAAAAGQAAAP7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+////AgAAAAMAAAAEAAAA/v////7////+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////w==
解码 - 从 Json}
接收 {read
为了取回您的 Workbook
对象,一旦您从 Json 字段中读取字符串 - 在此示例中 wbJsonString
.使用 Workbook(java.io.InputStream s)
构造函数,您可以取回原始工作簿:
byte[] decodedB64 = Base64.getDecoder().decode(wbJsonString);
ByteArrayInputStream bis = new ByteArrayInputStream(decodedB64);
HSSFWorkbook receivedWb = new HSSFWorkbook(bis);
System.out.println(receivedWb.getSheetAt(0).getSheetName()); // --> test
还有另一种可能的方法,使用解码器的 wrap
方法。这将return一个用于解码Base64编码字节流的输入流,因此您可以直接将其传递给Workbook构造函数:
InputStream b64Ins = Base64.getDecoder()
.wrap(new ByteArrayInputStream(wbJsonString.getBytes()));
HSSFWorkbook receivedWb = new HSSFWorkbook(b64Ins);
就是这样,您正确地将工作簿作为字符串发送并将其转换回来。
请注意,这也会让您 save/send Workbook
Java 对象作为文本,无论序列化格式如何(Json、protobuff、..)
即使不需要编码为 Base64 来获得字符串表示,它也能保证数据的完整性。
附录 - 实施
工作簿界面offers 4 implementations:
HSSFWorkbook
XSSFWorkbook
SXSSFWorkbook
3.1 SXSSFWorkbookWithCustomZipEntrySource
上面的代码将直接使用 HSSFWorkbook
和 XSSFWorkbook
对象。
大名的实现是SXSSFWorkbook
的扩展,所以最后两个也一样。此实现中的区别在于对象创建,因为它们不像前两个那样提供基于输入流的构造函数。
但它确实提供了这个:SXSSFWorkbook(XSSFWorkbook workbook)
。因此,唯一的附加步骤是调用此构造函数。例如:
InputStream b64Ins = Base64.getDecoder()
.wrap(new ByteArrayInputStream(wbJsonString.getBytes()));
SXSSFWorkbook sxss = new SXSSFWorkbook(new XSSFWorkbook(b64Ins));
/* The inputstream will by itself decode the base 64 encoded bytes,
allowing the creation of the XSSFWorkbook. But who the hell cares about
XSSF when you can have the KING OF kings, aka SXSSF? NO-BO-DY. So
we just send it as argument for the SXSSFWorkbook creation and forget
that looser. All the POI fans know SXSSF is the implementation that can
get you laid in a matter of seconds if shown to that co-worker...
Yes you know what I'm talking about. Come on baby burn my fire.
Also, Apache, "SXSSFWorkbookWithCustomZipEntrySource"? Really? Who
chooses your names? */
我在这个问题上苦苦挣扎了好几天。我需要将 Apache poi 工作簿添加到 json 对象。我尝试了 Json.org、objectmapper 和 gson 库。 我序列化它的方法对于所有经过测试的库都是相似的,例如:
objectMapper.writeValue(writer, objectToSerialize);
当我想写入 json 我的工作簿对象时,我收到此错误:
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Not implemented yet (through reference chain: com.....[".."]->java.util.ArrayList[0]->com.["workbook"]->org.apache.poi.xssf.usermodel.XSSFWorkbook["hidden"])
at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:388)
at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:348)
at com.fasterxml.jackson.databind.ser.std.StdSerializer.wrapAndThrow(StdSerializer.java:343)
有没有办法解决这个问题,或者我应该尝试其他方法吗?谢谢
Axel Richter 的评论是正确的,工作簿不可序列化。
发送 Java Object
并避免对文件本身进行编码的解决方法,首先使用 WorkBook
的 write(OutputStream s) 方法:
void write(java.io.OutputStream stream)
Write out this workbook to an Outputstream.
完成后,我们可以将原始 OutputStream
的字节转换为 Base64 编码字符串。 发送的步骤现在已经完成了。
现在,当接收到字符串时,为了将其读回 Workbook Object
,关键是使用 Workbook(InputStream s)
构造函数。 Workbook 的三个直接实现中有两个提供了此构造函数,而最棘手的实现还需要多一步。 (下面的附录中有关于此的信息)*.
这段代码是对整个过程的简单测试。
Workbook -> convert -> send -> receive -> revert -> Workbook
使用 Workbook
的 HSSFWorkbook
实现来实际测试它。
编码 - 发送{附加到Json}
HSSFWorkbook wb = new HSSFWorkbook();
wb.createSheet("test");
ByteArrayOutputStream binOut = new ByteArrayOutputStream();
wb.write(binOut);
String wbString = Base64.getEncoder().encodeToString(binOut.toByteArray());
wb.close();
现在,工作簿表示为字符串 [wbString
],您可以将其附加到 JSON。另请注意,ByteArray
流不需要关闭,但根据我的阅读,工作簿应该关闭。
出于好奇,这个例子的编码base64:
0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAOwADAP7/CQAGAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAEAAABQAAAAEAAAD+////AAAAAAYAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9SAG8AbwB0ACAARQBuAHQAcgB5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAFAf//////////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAACABgAAAAAAAFcAbwByAGsAYgBvAG8AawAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAAIB////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAD///////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAP///////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkIEAAABgUA0xDMB0EAAAAGAAAA4QACALAEwQACAAAA4gAAAFwAcAAFAAA2MDE1NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQgACALAEYQECAAAAPQECAAAAnAACAA4AGQACAAAAEgACAAAAEwACAAAArwECAAAAvAECAAAAPQASAGgBDgFcOr4jOAAAAAAAAQBYAkAAAgAAAI0AAgAAACIAAgAAAA4AAgABALcBAgAAANoAAgAAADEAFQDIAAAA/3+QAQAAAAAAAAUAQXJpYWwxABUAyAAAAP9/kAEAAAAAAAAFAEFyaWFsMQAVAMgAAAD/f5ABAAAAAAAABQBBcmlhbDEAFQDIAAAA/3+QAQAAAAAAAAUAQXJpYWweBBoABQAVAAAiJCIjLCMjMF8pOygiJCIjLCMjMCkeBB8ABgAaAAAiJCIjLCMjMF8pO1tSZWRdKCIkIiMsIyMwKR4EIAAHABsAACIkIiMsIyMwLjAwXyk7KCIkIiMsIyMwLjAwKR4EJQAIACAAACIkIiMsIyMwLjAwXyk7W1JlZF0oIiQiIywjIzAuMDApHgQsACoAJwAAXygqICMsIyMwXyk7XygqICgjLCMjMCk7XygqICItIl8pO18oQF8pHgQ1ACkAMAAAXygiJCIqICMsIyMwXyk7XygiJCIqICgjLCMjMCk7XygiJCIqICItIl8pO18oQF8pHgQ0ACwALwAAXygqICMsIyMwLjAwXyk7XygqICgjLCMjMC4wMCk7XygqICItIj8/Xyk7XyhAXykeBD0AKwA4AABfKCIkIiogIywjIzAuMDBfKTtfKCIkIiogKCMsIyMwLjAwKTtfKCIkIiogIi0iPz9fKTtfKEBfKeAAFAAAAAAA9f8gAAAAAAAAAAAAAADAIOAAFAABAAAA9f8gAAD0AAAAAAAAAADAIOAAFAABAAAA9f8gAAD0AAAAAAAAAADAIOAAFAACAAAA9f8gAAD0AAAAAAAAAADAIOAAFAACAAAA9f8gAAD0AAAAAAAAAADAIOAAFAAAAAAA9f8gAAD0AAAAAAAAAADAIOAAFAAAAAAA9f8gAAD0AAAAAAAAAADAIOAAFAAAAAAA9f8gAAD0AAAAAAAAAADAIOAAFAAAAAAA9f8gAAD0AAAAAAAAAADAIOAAFAAAAAAA9f8gAAD0AAAAAAAAAADAIOAAFAAAAAAA9f8gAAD0AAAAAAAAAADAIOAAFAAAAAAA9f8gAAD0AAAAAAAAAADAIOAAFAAAAAAA9f8gAAD0AAAAAAAAAADAIOAAFAAAAAAA9f8gAAD0AAAAAAAAAADAIOAAFAAAAAAA9f8gAAD0AAAAAAAAAADAIOAAFAAAAAAAAQAgAAAAAAAAAAAAAADAIOAAFAABACsA9f8gAAD4AAAAAAAAAADAIOAAFAABACkA9f8gAAD4AAAAAAAAAADAIOAAFAABACwA9f8gAAD4AAAAAAAAAADAIOAAFAABACoA9f8gAAD4AAAAAAAAAADAIOAAFAABAAkA9f8gAAD4AAAAAAAAAADAIJMCBAAQgAP/kwIEABGABv+TAgQAEoAE/5MCBAATgAf/kwIEAACAAP+TAgQAFIAF/2ABAgAAAIUACwBLBQAAAAADAGFhYYwABAABAAEArgEEAAEAAQQXAAgAAQAAAAAAAAD8AAgAAAAAAAAAAAD/AAIACAAKAAAACQgQAAAGEAC7DcwHwQAAAAYAAAALAhAAAAAAAP////8AAAAAAAAAAA0AAgABAAwAAgBkAA8AAgABABEAAgAAABAACAD8qfHSTWJQP18AAgABACoAAgAAACsAAgAAAIIAAgABAIAACAAAAAAAAAAAACUCBAAAAP8AgQACAMEEFAAAABUAAACDAAIAAACEAAIAAAChACIAAQBkAAEAAQABAAIALAEsAQAAAAAAAOA/AAAAAAAA4D8BAFUAAgAIAAACDgAAAAAAAQAAAAAAAQAAAD4CEgC2BgAAAABAAAAAAAAAAAAAAAAdAA8AAwAAAAAAAAEAAAAAAAAACgAAAP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAAEwAAABQAAAAVAAAAFgAAABcAAAAYAAAAGQAAAP7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+////AgAAAAMAAAAEAAAA/v////7////+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////w==
解码 - 从 Json}
接收 {read为了取回您的 Workbook
对象,一旦您从 Json 字段中读取字符串 - 在此示例中 wbJsonString
.使用 Workbook(java.io.InputStream s)
构造函数,您可以取回原始工作簿:
byte[] decodedB64 = Base64.getDecoder().decode(wbJsonString);
ByteArrayInputStream bis = new ByteArrayInputStream(decodedB64);
HSSFWorkbook receivedWb = new HSSFWorkbook(bis);
System.out.println(receivedWb.getSheetAt(0).getSheetName()); // --> test
还有另一种可能的方法,使用解码器的 wrap
方法。这将return一个用于解码Base64编码字节流的输入流,因此您可以直接将其传递给Workbook构造函数:
InputStream b64Ins = Base64.getDecoder()
.wrap(new ByteArrayInputStream(wbJsonString.getBytes()));
HSSFWorkbook receivedWb = new HSSFWorkbook(b64Ins);
就是这样,您正确地将工作簿作为字符串发送并将其转换回来。
请注意,这也会让您 save/send Workbook
Java 对象作为文本,无论序列化格式如何(Json、protobuff、..)
即使不需要编码为 Base64 来获得字符串表示,它也能保证数据的完整性。
附录 - 实施
工作簿界面offers 4 implementations:
HSSFWorkbook
XSSFWorkbook
SXSSFWorkbook
3.1
SXSSFWorkbookWithCustomZipEntrySource
上面的代码将直接使用 HSSFWorkbook
和 XSSFWorkbook
对象。
大名的实现是SXSSFWorkbook
的扩展,所以最后两个也一样。此实现中的区别在于对象创建,因为它们不像前两个那样提供基于输入流的构造函数。
但它确实提供了这个:SXSSFWorkbook(XSSFWorkbook workbook)
。因此,唯一的附加步骤是调用此构造函数。例如:
InputStream b64Ins = Base64.getDecoder()
.wrap(new ByteArrayInputStream(wbJsonString.getBytes()));
SXSSFWorkbook sxss = new SXSSFWorkbook(new XSSFWorkbook(b64Ins));
/* The inputstream will by itself decode the base 64 encoded bytes,
allowing the creation of the XSSFWorkbook. But who the hell cares about
XSSF when you can have the KING OF kings, aka SXSSF? NO-BO-DY. So
we just send it as argument for the SXSSFWorkbook creation and forget
that looser. All the POI fans know SXSSF is the implementation that can
get you laid in a matter of seconds if shown to that co-worker...
Yes you know what I'm talking about. Come on baby burn my fire.
Also, Apache, "SXSSFWorkbookWithCustomZipEntrySource"? Really? Who
chooses your names? */