2015-05-13 3 views
0

Для проекта я читаю богатый текст из файла excel (.xlsx), который должен быть сохранен в файле mongoDB для последующего копирования в другой файл excel. Сейчас я пытаюсь сохранить его, как это:Сохранение XSSFRichTextString в (mongo) DB с помощью Apache POI

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

Я не мог найти способ обойти это. Вместо этого я теперь сохраняю всю рабочую книгу в базе данных как байт []. Я сохраняю richTextStrings как обычные строки, но я добавил ссылку на ячейку в книге, откуда она появилась. поэтому всякий раз, когда мне нужна богатая строка, я могу просто перестроить книгу из байта [] и искать строку, используя ссылки.