Apache的POI - 阅读和DB店富文本内容(Apache POI - Read and st

2019-08-02 14:49发布

我们已经在我们的Java应用程序的新要求,其中用户将上传的Excel文件。 在一个Excel文件中的列将粗体,斜体,要点,彩色文字等进行格式化

我们需要读这个excel文件,并存储在Oracle数据库表中的这些值。 也随之我们需要提取这些数据和下载到Excel工作表与保存的格式。

我们计划使用Apache的POI的相同,但现在卡在那里我们有一点HSSFRichTextString需要被转换成格式存储到Oracle表对象。

tostring()方法HSSFRichTextString给出了字符串,但格式会丢失。 是否有人可以建议我如何将此转化HSSFRichTextString对象为Oracle数据类型(最好CLOB)。

Answer 1:

你是正确的,该toString()方法将只返回格式化String的内容HSSFRichTextString

下面是从提取了所有的其他重要数据的方法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的方法来提取数据。

  • numFormattingRuns() -返回格式化的运行次数HSFFRichTextString
  • getFontOfFormattingRun(INT) -返回short字体索引存在于字符串中的特定位置

现在,数据的实际提取:

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 ,但数据可以说是更有意义的这种方式存储。



文章来源: Apache POI - Read and store Rich Text content in DB