我们的java应用程序中有一个新要求,用户可以上传excel文件。 excel文件中的一列将使用粗体,斜体,项目符号,彩色文本等格式化。
我们需要读取此excel文件并将这些值存储在Oracle DB表中。 随后我们还需要提取这些数据并下载到excel表格中并保留格式。
我们计划使用 Apache-poi ,但现在我们已经停留在需要转换为存储到Oracle的格式的HSSFRichTextString
对象的位置表
tostring()
的{{1}}方法会给出字符串,但格式会丢失。
有人可以建议我如何将这个HSSFRichTextString
对象转换为Oracle数据类型(最好是clob)。
答案 0 :(得分:1)
您是对的,toString()
方法只会返回String
的无格式HSSFRichTextString
内容。
这是一种从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方法来提取该数据。
HSFFRichTextString
。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));
}
要将此数据存储在数据库中,请首先确认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
,但数据存储起来更有意义。