我们已经在我们的Java应用程序的新要求,其中用户将上传的Excel文件。 在一个Excel文件中的列将粗体,斜体,要点,彩色文字等进行格式化
我们需要读这个excel文件,并存储在Oracle数据库表中的这些值。 也随之我们需要提取这些数据和下载到Excel工作表与保存的格式。
我们计划使用Apache的POI的相同,但现在卡在那里我们有一点HSSFRichTextString
需要被转换成格式存储到Oracle表对象。
的tostring()
方法HSSFRichTextString
给出了字符串,但格式会丢失。 是否有人可以建议我如何将此转化HSSFRichTextString
对象为Oracle数据类型(最好CLOB)。
你是正确的,该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));
}
要在数据库中存储这些数据,首先认识到,有一个间的一种一对多的关系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
,但数据可以说是更有意义的这种方式存储。