当前位置: 首页 > 知识库问答 >
问题:

Apache POI-在DB中读取和存储富文本内容

管炳
2023-03-14

我们在java应用程序中有一个新的需求,用户将上传一个excel文件。excel文件中的一列将使用粗体、斜体、项目符号、彩色文本等进行格式化。

我们计划将Apache-poi用于相同的操作,但现在我们遇到了HSSFrichTextString对象的问题,该对象需要转换为存储到Oracle表中的格式。

HSSFrichTextStringtoString()方法提供字符串,但格式丢失。有人可以建议我如何将这个HSSFrichTextString对象转换为Oracle数据类型(最好是clob)。

共有1个答案

何晗昱
2023-03-14

您是正确的,toString()方法将只返回HSSFrichTextString的未格式化的String内容。

下面是从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; }
}
  • numformattingruns()-返回HSFFRichTextString.
  • 中格式化运行的次数
  • getfontofformattingrun(int)-返回字符串中指定位置的字体索引

现在,数据的实际提取:

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)
Table: rts_formatting_runs
rts_id     NUMBER
run_id     NUMBER
run_pos    NUMBER
run_len    NUMBER
font_index NUMBER

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

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

 类似资料:
  • 我有书的摘要,我想显示给用户。在firebase中存储富文本以显示给用户的最佳方式是什么?我应该使用firebase数据库吗?我有一个包含所有书籍的数据库,我只是要为书籍摘要文本创建一个列。

  • 我必须写一个程序: 提示用户输入输入文件的名称, 从输入文件中读取数据,并将有关汽车的信息存储在汽车对象数组列表中, 将数组列表中未排序的数据打印到屏幕上,如下所示: 我想不出前三步该怎么做。 我也有两个类,与这个项目,并将添加他们,如果需要/需要。因此,基本上只需要帮助了解如何从用户那里读取文本文件,将文本文件的内容添加到ArrayList中,并以格式化的方式打印出ArrayList的内容(我的

  • 问题内容: 我有一个文件,其内容为python列表的形式,如下所示: 有什么办法可以将python文件读回到列表对象中吗?而不是使用整个文件,而是将其读取为字符串。 编辑:对于那些可能有兴趣的人,我使用(import ast)遇到了一个奇怪的问题,作为解决上述问题的建议。 我在其中使用的程序具有从yahoo finance python模块获取历史股票数据的功能。此函数与ast.literal_e

  • 我是编程界的新手。嗯,我正在尝试使用ApachePOI库读取excel文件(5行5列)。我实际上有两个相同问题的实现。在第一个代码片段中,我只是读取excel文件并将其打印到控制台中。 然而,现在我正试图将读取的excel数据保存到一个数组中。所以我想在动态获取excel行和列大小后设置数组大小。但令我惊讶的是,当我执行第二个代码段时,似乎“while(cellIterator.hasNext()

  • 到目前为止,我们介绍了如何处理数据以及如何构建、训练和测试深度学习模型。然而在实际中,我们有时需要把训练好的模型部署到很多不同的设备。在这种情况下,我们可以把内存中训练好的模型参数存储在硬盘上供后续读取使用。 读写NDArray 我们可以直接使用save函数和load函数分别存储和读取NDArray。下面的例子创建了NDArray变量x,并将其存在文件名同为x的文件里。 from mxnet im

  • 问题内容: 有什么方法可以读取文本文件并将内容存储在Jtable中?我有一个文本文件,其中包含有关某些过程的某些信息。就像一个具有列和各自值的表。是否可以获取.txt文件的内容并以Jtable的形式显示?我正在使用Eclipse和Window Builder。任何帮助将不胜感激。谢谢! 问题答案: 我将研究Oracle的教程: 读/写文本文件 JTable教程 当从文本文件中获取数据时,您需要将其