如何在Java中将POI工作簿添加为JSON元素 [英] How to add POI Workbook as a json element in java

查看:77
本文介绍了如何在Java中将POI工作簿添加为JSON元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在这个问题上,我已经奋斗了好几天.我需要将Apache poi Workbook添加到json对象.我尝试了Json.org,objectmapper和gson库.对于所有经过测试的库,我进行序列化的方法都相似,例如:

I have been struggling for days in this issue. I need to add Apache poi Workbook to json object. I tried Json.org, objectmapper and gson libraries. My approach in order to serialize it is similar for all the tested libraries, something like:

objectMapper.writeValue(writer,objectToSerialize);

当我想将JSON写入Workbook对象时,出现此错误:

When I want to Write to json my Workbook object I get this error:

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)

是否有解决此问题的方法,还是应该尝试其他方法?谢谢.

Is there a way to solve this issue or should I try another approach ? Thanks.

推荐答案

Axel Richter的评论是正确的,该工作簿不可序列化.

Axel Richter's comment is right, the workbook is not serializable.

使用

The workaround to send the Java Object and avoid encoding the file itself, starts by using WorkBook's write(OutputStream s) method:

无效写入(java.io.OutputStream流)

void write(java.io.OutputStream stream)

将此工作簿写到输出流中.

完成后,我们可以将原始 OutputStream 的字节转换为 Base64 编码的字符串.发送的步骤现已完成.

Once done, we can convert the origin OutputStream's bytes to a Base64 encoded string. The steps in order to send it are complete by now.

现在,当接收到字符串时,为了将其读回 Workbook对象,密钥是使用

Now, when receiving the string, in order to read it back to a Workbook Object, the key is using the Workbook(InputStream s) constructor. Two of the three direct implementations of Workbook offer this constructor, while the trickiest one would need one more step. (Info about this on the appendix below)*.

此代码是探测整个过程的简单测试.

This code is a simple test probing the whole process.

工作簿->转换->发送->收到->还原->工作簿

使用 Workbook HSSFWorkbook 实现来对其进行实际测试.

Using the HSSFWorkbook implementation of Workbook in order to actually test it.

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 流,但是从我的阅读中可以看出,Workbook应该如此.

Now the Workbook is represented as a String [wbString], which you can append into the JSON. Also note that ByteArray streams don't need to be closed, but from what I've read, the Workbook should.

出于好奇,此示例的编码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)构造函数,您可以获得原始的Workbook:


Decode - Receive {read from Json}

In order to get back your Workbook object, once you read the string from the Json field - in this example wbJsonString. Using the Workbook(java.io.InputStream s) constructor you get your original Workbook back:

 byte[] decodedB64 = Base64.getDecoder().decode(wbJsonString); 
            
 ByteArrayInputStream bis = new ByteArrayInputStream(decodedB64);
 HSSFWorkbook receivedWb = new HSSFWorkbook(bis);
 
 System.out.println(receivedWb.getSheetAt(0).getSheetName()); // --> test

还有另一种可能的方法,使用解码器的

There's another possible approach for this, using the decoder's wrap method. This will return an input stream for decoding Base64 encoded byte stream, so you can directly pass it to the Workbook constructor:

InputStream b64Ins = Base64.getDecoder()
                           .wrap(new ByteArrayInputStream(wbJsonString.getBytes()));

HSSFWorkbook receivedWb = new HSSFWorkbook(b64Ins);


就是这样,您正确地将工作簿作为String发送并转换回了.


And that's it, you properly sent the Workbook as String and converted it back.

请注意,这也使您可以将 Workbook Java对象保存/发送为文本,而不管序列化格式(Json,protobuff等)如何.

Note that this would also let you save/send the Workbook Java Objects as text, regardless of the serialization format (Json, protobuff,..)

即使为了获得String表示形式而无需对Base64进行编码,它也会保证数据的完整性.

Workbook界面提供4种实现方式:

The Workbook interface offers 4 implementations:

  1. HSSFWorkbook

XSSFWorkbook

SXSSFWorkbook

3.1 SXSSFWorkbookWithCustomZipEntrySource

上面的代码将直接与 HSSFWorkbook XSSFWorkbook 对象一起使用.

The code above will directly work with HSSFWorkbook and XSSFWorkbook objects.

大名的实现是 SXSSFWorkbook 的扩展,因此对于后两者同样适用.此实现之间的区别在于对象的创建,因为它们不像前两个那样提供基于Inputstream的构造函数.

The large name's implementation is an extension of SXSSFWorkbook, so the same applies for these last two. The difference within this implementations is in the object creation, as these don't offer the constructor based on an Inputstream that the first two do.

但是它确实提供了以下内容:

But it does offer this one: SXSSFWorkbook(XSSFWorkbook workbook). So, the only additional step would consist of calling this constructor. For example:

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?  */

这篇关于如何在Java中将POI工作簿添加为JSON元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆