你是對的,toString()
方法將只返回HSSFRichTextString
的無格式String
內容。
這裏是一個從HSSFRichTextString
中提取出所有其他重要數據以存儲字符串值的方法。
與my answer to this question非常相似,從HSSFRichTextString
中提取富文本格式信息,並將該數據存儲在您要創建的類中,FormattingRun
。
public class FormattingRun {
private int beginIdx;
private int length;
private short fontIdx;
public FormattingRun(int beginIdx, int length, short fontIdx) {
this.beginIdx = beginIdx;
this.length = length;
this.fontIdx = fontIdx;
}
public int getBegin() { return beginIdx; }
public int getLength() { return length; }
public short getFontIndex { return fontIdx; }
}
然後,調用Apache POI方法來提取該數據。
在現在,數據的實際提取:
List<FormattingRun> formattingRuns = new ArrayList<FormattingRun>();
int numFormattingRuns = richTextString.numFormattingRuns();
for (int fmtIdx = 0; fmtIdx < numFormattingRuns; fmtIdx)
{
int begin = richTextString.getIndexOfFormattingRun(fmtIdx);
short fontIndex = richTextString.getFontOfFormattingRun(fmtIdx);
// Walk the string to determine the length of the formatting run.
int length = 0;
for (int j = begin; j < richTextString.length(); j++)
{
short currFontIndex = richTextString.getFontAtIndex(j);
if (currFontIndex == fontIndex)
length++;
else
break;
}
formattingRuns.add(new FormattingRun(begin, length, fontIndex));
}
要在數據庫中存儲該數據,第一識別HSSFRichTextString
和FormattingRun
之間存在一對多關係。因此,在您計劃存儲富文本字符串數據的任何Oracle表中,您需要與存儲格式化運行數據的另一個新表創建外鍵關係。事情是這樣的:
Table: rich_text_string
rts_id NUMBER
contents VARCHAR2(4000)
與rts_id
作爲主鍵,:
Table: rts_formatting_runs
rts_id NUMBER
run_id NUMBER
run_pos NUMBER
run_len NUMBER
font_index NUMBER
與(rts_id, run_id)
作爲主鍵,rts_id
回頭參考rich_text_string
表。
使用您喜歡的Java到數據庫的框架(JDBC,Hibernate的等),存儲String
價值爲contents
在rich_text_string
,以及相關的FormattingRun
對象數據爲rt_formatting_runs
。
只要小心 - 字體索引僅在工作簿中有效。您還需要存儲來自HSSFWorkbook
的字體信息,以賦予font_index
的含義。
它不是作爲CLOB
存儲的,但可以通過這種方式存儲更有意義的數據。