htmlで出力する

サンプルコードでOdsファイルを読み込むには、ファイル名を指定してOdsReaderクラスをインスタンス化します。 selectSheetメソッドで読み込むシートを選択するとgetCellメソッドで目的のセルにアクセスできます。

OdsReader ods = new OdsReader(ファイル名);
ods.selectSheet(シート名);
Cell cell = ods.getCell(, );

getCellメソッドでは手抜きのためインデックスの範囲チェックをしていません。 範囲外の座標を指定された場合、EMPTYセルが返されます。 EMPTYセルには空白文字列などダミーのセル情報が入っているので、チェックせずにアクセスしても例外は発生しません。 EMPTYセルはpublic static final Cell型なので==演算子でチェックできます。

if(cell == Cell.EMPTY)
{
    範囲外の場合の処理
}

結合されたセル(table:covered-table-cell)の場合も同様にCOVEREDというインスタンスが定義されています。

if(cell == Cell.COVERED)
{
    結合されたセルの場合の処理
}

Cellクラスには収められた文字列、行の結合数、列の結合数を返すメソッドがあります。 これらの情報を使えばOdsファイルからhtmlのテーブルを作ることができます。

StringBuilder str = new StringBuilder();
str.append("<table summary=\"test\">\n");

// HTMLのテーブル内容を追加
for(int i = 0; i < ROW; i++)
{
    str.append("<tr>");
    for(int j = 0; j < COL; j++)
    {
        Cell cell = ods.getCell(i, j);

        // 結合セルの中で左上以外のセルは無視
        if(cell == Cell.COVERED)
        {
            continue;
        }

        // セルの結合サイズを得る
        int rowSpan = cell.getRowSpan();
        rowSpanAttr = rowSpan == 1 ? "" : " rowspan=\"" + rowSpan + "\"";
        int colSpan = cell.getColSpan();
        colSpanAttr = colSpan == 1 ? "" : " colspan=\"" + colSpan + "\"";

        // セル1つ分のタグを追加
        String cellStr = String.format("<td%s%s>%s</td>",
                                       rowSpanAttr,
                                       colSpanAttr,
                                       cell);
        str.append(cellStr);
    }
    str.append("</tr>\n");
}
str.append("</table>");

スタイル名を利用する

Cellクラスにはスタイル名を返すメソッドもあります。 スタイルが記述されていない場合は行、列のデフォルトスタイルが使用されます。 サンプルコードではデフォルトスタイルまでは追ってません。 セル自体にスタイル名が書かれている場合のみ利用できます。

全く同じスタイルのセルには同じスタイル名が割り当てられます。 スタイル名でどの様な意味を持つセルか判断して出力に反映することができます。 例えば、「背景色が青のセルはヘッダを表しているのでhtmlに出力するときthタグで囲む」とか、 「罫線に囲まれているセルは注意事項を表しているのでhtmlのタグにclass="warning"を付けてCSSで強調する」などができます。

// 文字修飾の参考にしたいセルからスタイル名を得る。
String headerStyle = ods.getCell(0, 0).getStyleName();
String cellTag;

// HTMLのテーブル内容を追加
for(int i = 0; i < ROW; i++)
{
    str.append("<tr>");
    for(int j = 0; j < COL; j++)
    {
        Cell cell = ods.getCell(i, j);
        String cellStyle = cell.getStyleName();

        // セル(0,0)と同じスタイル名のセルはthタグで囲む
        cellTag = cellStyle.equals(headerStyle) ? "th" : "td";
        
        // セル1つ分のタグを追加
        String cellStr = String.format("<%s>%s</%s>",
                                       cellTag,
                                       cell,
                                       cellTag);
        str.append(cellStr);
    }
    str.append("</tr>\n");
}

ただし、スタイルの内容が全く同じでなければスタイル名は変わってしまいます。 背景色が「白」と「塗りつぶしなし」の場合、見た目では違いが分かりませんがスタイル名は別です。 罫線が一部消えていた場合も別スタイルになります。 全く同じに見える結合セルでも、結合を解いてセルとセルの間に罫線が有るものと無いものでは別スタイルです。

見た目が同じドキュメントでも編集の過程によってスタイル名が記述されている場所が異なる可能性があります。 セルにスタイル名が書かれている場合と、行や列のデフォルトスタイルにスタイル名が書かれていてセルのスタイル名が省略されている場合が考えられます。 ドキュメントをOpenOffice2.4.1で作った場合と3.0.0で作った場合では記述場所が違うケースがありました。 セルのスタイルを調べるときにデフォルトスタイルも反映するようなコードならば影響は無いんですが、このサンプルは手抜きなので出力が微妙に変わってしまいます。

スタイル名で場合分けをするならば、Calcドキュメントを書くときに少しの違いも出ないように注意しながら書かなければなりません。 それは面倒なので「この項目はこの座標」と決め打ちするかセルにキーとなる項目名を書いたほうが楽かもしれません。