2012-11-12 58 views
1

我們在我們的java應用程序中有一個新的需求,用戶可以上傳一個excel文件。 Excel文件中的一列將用粗體,斜體,項目符號點,彩色文本等格式化。Apache POI - 在數據庫中讀取和存儲RTF內容

我們需要讀取此excel文件並將這些值存儲在Oracle數據庫表中。 也隨後我們需要提取這些數據並下載到保存格式的Excel表格中。

我們計劃同樣使用Apache-poi,但現在停留在需要轉換爲可存儲到Oracle表格的格式的地方。

tostring()方法HSSFRichTextString給出字符串,但格式化丟失。 有人可以請我建議我如何將這個HSSFRichTextString對象轉換成Oracle數據類型(最好是clob)。

回答

1

你是對的,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)); 
} 

要在數據庫中存儲該數據,第一識別HSSFRichTextStringFormattingRun之間存在一對多關係。因此,在您計劃存儲富文本字符串數據的任何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價值爲contentsrich_text_string,以及相關的FormattingRun對象數據爲rt_formatting_runs

只要小心 - 字體索引僅在工作簿中有效。您還需要存儲來自HSSFWorkbook的字體信息,以賦予font_index的含義。

它不是作爲CLOB存儲的,但可以通過這種方式存儲更有意義的數據。

相關問題