1

我们的 Java 应用程序有一个新要求,用户需要上传一个 Excel 文件。excel 文件中的一列将被格式化为粗体、斜体、项目符号、彩色文本等。

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

我们计划使用Apache-poi,但现在卡在了我们需要将HSSFRichTextString对象转换为格式以存储到 Oracle 表中的点上。

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

4

1 回答 1

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 方法来提取该数据。

现在,实际提取数据:

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要将这些数据存储在数据库中,首先要认识到 a和之间存在一对多的关系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_idrich_text_string

使用您最喜欢的 Java 到数据库框架(JDBC、Hibernate 等),将String值存储到contentsin 中rich_text_string,并将关联的FormattingRun对象数据存储到rt_formatting_runs.

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

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

于 2013-08-29T23:11:02.517 回答