gpt4 book ai didi

java - Apache POI - 在数据库中读取和存储富文本内容

转载 作者:太空宇宙 更新时间:2023-11-04 07:57:48 25 4
gpt4 key购买 nike

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

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

我们计划使用 Apache-poi 来实现同样的目的,但现在陷入困境,我们需要将 HSSFRichTextString 对象转换为某种格式以存储到 Oracle 表中。

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

最佳答案

您说得对,toString() 方法只会返回 HSSFRichTextString 的未格式化的 String 内容。

这是一种从 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 方法来提取该数据。

现在,实际提取数据:

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_stringcontents 中,并将关联的 FormattingRun 对象数据存储到 rt_formatting_runs 中。

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

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

关于java - Apache POI - 在数据库中读取和存储富文本内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13338037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com