对于一个项目,我正在从excel文件(.xlsx)中读取富文本,该文件应存储在mongoDB中,以便稍后复制粘贴到另一个excel文件中。现在我正试图像这样保存它:
public static BasicDBObject createDBGlobalIssue(GlobalIssue g) {
BasicDBObject o = new BasicDBObject();
XSSFRichTextString richText = g.getRichValue();
byte[] value;
try {
value = transform(richText);
} catch (IOException e) {
throw new RuntimeException(e.getMessage(), e);
}
o.put("test", value);
}
return o;
}
public static byte[] transform(XSSFRichTextString yourObject) throws IOException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutput out = null;
try {
out = new ObjectOutputStream(bos);
out.writeObject(yourObject);
byte[] yourBytes = bos.toByteArray();
return yourBytes;
} finally {
// lots of try-catch
}
}
并尝试将其转换回来:
public static GlobalIssue createGlobalIssue(BasicDBObject o) {
byte[] stream = (byte[])o.get("test");
XSSFRichTextString record;
try {
record = (XSSFRichTextString)unPack(stream);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e.getMessage(), e);
} catch (IOException e) {
throw new RuntimeException(e.getMessage(), e);
}
}
GlobalIssue g = new GlobalIssue(richStringsByAttribute);
return g;
}
public static XSSFRichTextString unPack(byte[] input) throws ClassNotFoundException, IOException {
ByteArrayInputStream bis = new ByteArrayInputStream(input);
ObjectInput in = null;
try {
in = new ObjectInputStream(bis);
Object o = in.readObject();
return (XSSFRichTextString)o;
} finally {
try {
bis.close();
} catch (IOException ex) {
// ignore close exception
}
try {
if (in != null) {
in.close();
}
} catch (IOException ex) {
// ignore close exception
}
}
}
不幸的是,这会导致错误,因为XSSFRichTextString不可序列化: 引起:java.io.NotSerializableException:org.apache.poi.xssf.usermodel.XSSFRichTextString
我知道对于HSSF,有一个可序列化的包装类(TextObjectRecord),但是我为XSSF编写类似类的所有尝试都失败了。我宁愿不把我的整个程序转回HSSF,因为它已经过时并且在很多其他地方受伤。
有谁知道如何解决这个问题?谢谢!
答案 0 :(得分:0)
我无法找到解决方法。相反,我现在将整个工作簿作为byte []保存在数据库中。我将richTextStrings保存为普通字符串,但我在工作簿中添加了对其来源的单元格的引用。因此,每当我需要丰富的字符串时,我可以从byte []重建工作簿,并使用引用查找字符串。