我在这个问题上挣扎了好几天。我需要向json对象添加Apache工作簿。我尝试了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)是否有办法解决这个问题,还是我应该尝试另一种方法?谢谢。
发布于 2021-02-19 08:25:36
Axel的评论是对的,工作簿是不可连载的。
发送Java Object并避免对文件本身进行编码的解决方案,首先使用WorkBook的写(OutputStream)方法:
void write(java.io.OutputStream stream)将此工作簿写入输出流。
一旦完成,我们就可以将原始OutputStream的字节转换成Base64编码的字符串。发送的步骤到现在已经完成。
现在,当接收到字符串时,为了将它读回Workbook Object,键是使用Workbook(InputStream s)构造函数。工作簿的三个直接实现中有两个提供了这个构造函数,而最棘手的一个则需要再执行一个步骤。(有关这方面的信息,见下文附录)*。
这段代码是一个简单的测试,可以探测整个过程。
Workbook -> convert -> send -> receive -> revert -> Workbook
使用HSSFWorkbook实现的Workbook,以便实际测试它。
编码-发送{追加到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读取}
为了取回您的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方法。这将返回一个输入流,用于解码Base64编码的字节流,因此您可以直接将其传递给Workbook构造函数:
InputStream b64Ins = Base64.getDecoder()
                           .wrap(new ByteArrayInputStream(wbJsonString.getBytes()));
HSSFWorkbook receivedWb = new HSSFWorkbook(b64Ins);就这样,您正确地将工作簿作为字符串发送并将其转换回来。
请注意,这还允许您将Workbook对象保存/发送为文本,而不管序列化格式如何(Json,protobuff,.)
即使为了获得字符串表示而不需要对Base64进行编码,它也将保证数据的完整性。
附录-实施
工作簿接口提供4种实现
HSSFWorkbookXSSFWorkbookSXSSFWorkbook
3.1 SXSSFWorkbookWithCustomZipEntrySource上面的代码将直接用于HSSFWorkbook和XSSFWorkbook对象。
大名的实现是SXSSFWorkbook,的一个扩展,所以最后两个也是如此。这种实现的不同之处在于对象的创建,因为它们不提供基于Inputstream的构造函数,而前两种方法都是这样做的。
但它确实提供了这样一个: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?  */https://stackoverflow.com/questions/66273818
复制相似问题