使用Apache POI在(mongo)DB中保留XSSFRichTextString

时间:2015-05-13 07:53:51

标签: java database apache-poi richtext xssf

对于一个项目,我正在从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,因为它已经过时并且在很多其他地方受伤。

有谁知道如何解决这个问题?谢谢!

1 个答案:

答案 0 :(得分:0)

我无法找到解决方法。相反,我现在将整个工作簿作为byte []保存在数据库中。我将richTextStrings保存为普通字符串,但我在工作簿中添加了对其来源的单元格的引用。因此,每当我需要丰富的字符串时,我可以从byte []重建工作簿,并使用引用查找字符串。