web-dev-qa-db-ja.com

JXLセルのフォーマット

Jxl apiを使用してセルのコンテンツを自動調整する方法は?

27
SAK

これは今のところ古い質問であることはわかっていますが、私はこれに対する解決策を探していました。

CellView自動サイズ

FAQがこれについて言及していない理由はわかりません。ドキュメントに非常に明確に存在しているためです。

私のコードは次のようになりました:

for(int x=0;x<c;x++)
{
    cell=sheet.getColumnView(x);
    cell.setAutosize(true);
    sheet.setColumnView(x, cell);
}

cは、作成された列の数を格納します
セルは、返されたCellViewオブジェクトの一時的なプレースホルダーにすぎません
シートはWriteableSheetオブジェクトです

Apiは、これはプロセッサ集約型の機能であることを警告しているため、大きなファイルにはおそらく理想的ではありません。しかし、私のような小さなファイル(100行未満)の場合、目立った時間はかかりませんでした。

これが誰かを助けることを願っています。

42
clang1234

メソッドは自明でコメントされています:

private void sheetAutoFitColumns(WritableSheet sheet) {
    for (int i = 0; i < sheet.getColumns(); i++) {
        Cell[] cells = sheet.getColumn(i);
        int longestStrLen = -1;

        if (cells.length == 0)
            continue;

        /* Find the widest cell in the column. */
        for (int j = 0; j < cells.length; j++) {
            if ( cells[j].getContents().length() > longestStrLen ) {
                String str = cells[j].getContents();
                if (str == null || str.isEmpty())
                    continue;
                longestStrLen = str.trim().length();
            }
        }

        /* If not found, skip the column. */
        if (longestStrLen == -1) 
            continue;

        /* If wider than the max width, crop width */
        if (longestStrLen > 255)
            longestStrLen = 255;

        CellView cv = sheet.getColumnView(i);
        cv.setSize(longestStrLen * 256 + 100); /* Every character is 256 units wide, so scale it. */
        sheet.setColumnView(i, cv);
    }
}
13
neuro_sys
for(int x=0;x<c;x++)
{
    cell=sheet.getColumnView(x);
    cell.setAutosize(true);
    sheet.setColumnView(x, cell);
}

すべての列をスキャンするのではなく、問題ありません。列をパラメーターとして渡します。

void display(column) 
{ 
    Cell = sheet.getColumnView(column);
    cell.setAutosize(true);
    sheet.setColumnView(column, cell);
}

したがって、テキストを表示するときに、特定の長さを設定できます。巨大なExcelファイルに役立ちます。

6
John

JExcelApiから [〜#〜] faq [〜#〜]

Excelの「フォーマット/列/自動フィット選択」と同等の方法を教えてください。

これを行うAPI関数はありません。各列のセルをスキャンして最大長を計算し、それに応じてsetColumnView()を呼び出すコードを記述する必要があります。これにより、Excelの機能に近づきますが、正確ではありません。ほとんどのフォントには可変幅の文字があるため、正確に同じ値を取得するには、FontMetricsを使用して列の各文字列の最大幅を計算する必要があります。これを行う方法についてのコードはまだ誰も投稿していません。 Yahoo!にコードを投稿してください。グループ化するか、FAQこのページの下部にリストされている作成者に直接送信してください。

FontMetricsはおそらく Java.awt.FontMetrics を参照します。あなたは私が持っているであろうgetLineMetrics(String、Graphics)メソッドで何かをうまくできるはずです。

2
Brian Beckett

CellViewのautosizeメソッドは、常に機能しません。これを行う私の方法は、列のデータの最大長に基づいて列のサイズ(幅)をプログラムで設定することです。次に、いくつかの数学演算を実行します。

CellView cv = excelSheet.getColumnView(0);
cv.setSize((highest + ((highest/2) + (highest/4))) * 256);

ここで、highestは、列内のデータの最長の長さを保持するintです。

2
Jemp

セルが255文字を超える場合、setAutosize()メソッドは機能しません。これは、Excel 2003の最大列幅の指定に関連しています: http://office.Microsoft.com/en-us/Excel-help/Excel-specifications-and-limits-HP005199291.aspx

このケースを処理するには、独自のautosizeメソッドを記述する必要があります。

1

この例を試してください:

 expandColumns(sheet, 3);

    workbook.write();
    workbook.close();

private void expandColumn(WritableSheet sheet, int amountOfColumns){
    int c = amountOfColumns;
    for(int x=0;x<c;x++)
    {
        CellView cell = sheet.getColumnView(x);
        cell.setAutosize(true);
        sheet.setColumnView(x, cell);
    }
}
0
Leandro P.