1

Javaアプリケーションには、ユーザーがExcelファイルをアップロードするという新しい要件があります。Excelファイルの列の1つは、太字、斜体、箇条書き、色付きのテキストなどでフォーマットされます。

このExcelファイルを読み取り、これらの値をOracleDBテーブルに格納する必要があります。また、その後、これらのデータを抽出し、フォーマットを保持したままExcelシートにダウンロードする必要があります。

同じようにApache-poiを使用することを計画しましたHSSFRichTextStringが、Oracleテーブルに格納するための形式に変換する必要のあるオブジェクトがある時点で立ち往生しています。

tostring()メソッドはHSSFRichTextString文字列を提供しますが、フォーマットは失われます。HSSFRichTextStringこのオブジェクトをOracleデータ型(できればclob)に変換する方法を教えてもらえますか?

4

1 に答える 1

1

メソッドtoString()がフォーマットされていない.StringHSSFRichTextString

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このデータをデータベースに保存するには、まずとの間に 1 対多の関係があることを認識します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-to-database フレームワーク (JDBC、Hibernate など) を使用して、String値をcontentsに保存しrich_text_string、関連するFormattingRunオブジェクト データを に保存しrt_formatting_runsます。

注意してください - フォント インデックスはワークブック内でのみ有効です。意味HSSFWorkbookを与えるために、フォント情報も保存する必要があります。font_index

として保存されていませんCLOBが、データは間違いなくこの方法で保存された方が意味があります。

于 2013-08-29T23:11:02.517 に答える