繁体   English   中英

Apache POI-在数据库中读取和存储RTF内容

[英]Apache POI - Read and store Rich Text content in DB

我们在Java应用程序中有一个新要求,即用户可以上传一个excel文件。 excel文件中的一列将使用粗体,斜体,项目符号,彩色文本等格式。

我们需要读取此excel文件并将这些值存储在Oracle DB表中。 随后,我们还需要提取这些数据,并保留格式并下载到excel工作表中。

我们计划将Apache-poi用于相同的功能,但是现在停留在需要将HSSFRichTextString对象转换为要存储到Oracle表的格式的位置。

HSSFRichTextStringtostring()方法提供字符串,但是格式丢失。 有人可以建议我如何将这个HSSFRichTextString对象转换为Oracle数据类型(最好是clob)。

正确的是, toString()方法将仅返回HSSFRichTextString的未格式化String内容。

这是一种从HSSFRichTextString中提取所有其他重要数据以与字符串值一起存储的方法。

我对这个问题的回答非常相似,从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值存储到rich_text_string contents中,并将关联的FormattingRun对象数据存储到rt_formatting_runs

请注意-字体索引仅在工作簿中有效。 您还需要存储HSSFWorkbook的字体信息,以赋予font_index含义。

它没有存储为CLOB ,但是可以说这种方式存储的数据更有意义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM