Jxl apiを使用してセルのコンテンツを自動調整する方法は?
これは今のところ古い質問であることはわかっていますが、私はこれに対する解決策を探していました。
FAQがこれについて言及していない理由はわかりません。ドキュメントに非常に明確に存在しているためです。
私のコードは次のようになりました:
for(int x=0;x<c;x++)
{
cell=sheet.getColumnView(x);
cell.setAutosize(true);
sheet.setColumnView(x, cell);
}
c
は、作成された列の数を格納します
セルは、返されたCellView
オブジェクトの一時的なプレースホルダーにすぎません
シートはWriteableSheet
オブジェクトです
Apiは、これはプロセッサ集約型の機能であることを警告しているため、大きなファイルにはおそらく理想的ではありません。しかし、私のような小さなファイル(100行未満)の場合、目立った時間はかかりませんでした。
これが誰かを助けることを願っています。
メソッドは自明でコメントされています:
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);
}
}
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ファイルに役立ちます。
JExcelApiから [〜#〜] faq [〜#〜]
Excelの「フォーマット/列/自動フィット選択」と同等の方法を教えてください。
これを行うAPI関数はありません。各列のセルをスキャンして最大長を計算し、それに応じてsetColumnView()を呼び出すコードを記述する必要があります。これにより、Excelの機能に近づきますが、正確ではありません。ほとんどのフォントには可変幅の文字があるため、正確に同じ値を取得するには、FontMetricsを使用して列の各文字列の最大幅を計算する必要があります。これを行う方法についてのコードはまだ誰も投稿していません。 Yahoo!にコードを投稿してください。グループ化するか、FAQこのページの下部にリストされている作成者に直接送信してください。
FontMetricsはおそらく Java.awt.FontMetrics を参照します。あなたは私が持っているであろうgetLineMetrics(String、Graphics)メソッドで何かをうまくできるはずです。
CellViewのautosizeメソッドは、常に機能しません。これを行う私の方法は、列のデータの最大長に基づいて列のサイズ(幅)をプログラムで設定することです。次に、いくつかの数学演算を実行します。
CellView cv = excelSheet.getColumnView(0);
cv.setSize((highest + ((highest/2) + (highest/4))) * 256);
ここで、highest
は、列内のデータの最長の長さを保持するintです。
セルが255文字を超える場合、setAutosize()メソッドは機能しません。これは、Excel 2003の最大列幅の指定に関連しています: http://office.Microsoft.com/en-us/Excel-help/Excel-specifications-and-limits-HP005199291.aspx
このケースを処理するには、独自のautosizeメソッドを記述する必要があります。
この例を試してください:
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);
}
}