jxl apiを使用してセル内のコンテンツを自動調整する方法は?
8 に答える
これは現時点では古い質問であることは知っていますが、これに対する解決策を探していて、他の誰かが必要とする場合に備えて投稿すると思いました.
ドキュメントに非常に明確に存在するため、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ファイルに役立ちます。
CellViewのautosizeメソッドは、私にはいつも機能しません。これを行う私の方法は、列内のデータの最大長に基づいて列のサイズ(幅)をプログラムで設定することです。次に、いくつかの数学演算を実行します。
CellView cv = excelSheet.getColumnView(0);
cv.setSize((highest + ((highest/2) + (highest/4))) * 256);
ここhighest
で、は列内のデータの最長長を保持するintです。
JExcelApi FAQから
Excel の「書式/列/自動選択選択」と同等の操作を行うにはどうすればよいですか?
これを行うための API 関数はありません。各列のセルをスキャンし、最大長を計算し、それに応じて setColumnView() を呼び出すコードを記述する必要があります。これにより、Excel の動作に近づくことができますが、正確にはなりません。ほとんどのフォントには可変幅の文字があるため、まったく同じ値を取得するには、FontMetrics を使用して、列内の各文字列の最大幅を計算する必要があります。これを行う方法についてのコードはまだ投稿されていません。コードを Yahoo! グループ化するか、このページの下部にリストされている FAQ 作成者に直接送信してください。
FontMetrics はおそらくjava.awt.FontMetricsを参照しています。私が持っている getLineMetrics(String, Graphics) メソッドで何かを解決できるはずです。
セルが 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);
}
}
コトリンの実装
private fun sheetAutoFitColumns(sheet: WritableSheet, columnsIndexesForFit: Array<Int>? = null, startFromRowWithIndex: Int = 0, excludeLastRows : Int = 0) {
for (columnIndex in columnsIndexesForFit?.iterator() ?: IntProgression.fromClosedRange(0, sheet.columns, 1).iterator()) {
val cells = sheet.getColumn(columnIndex)
var longestStrLen = -1
if (cells.isEmpty()) continue
for (j in startFromRowWithIndex until cells.size - excludeLastRows) {
if (cells[j].contents.length > longestStrLen) {
val str = cells[j].contents
if (str == null || str.isEmpty()) continue
longestStrLen = str.trim().length
}
}
if (longestStrLen == -1) continue
val newWidth = if (longestStrLen > 255) 255 else longestStrLen
sheet.setColumnView(columnIndex, newWidth)
}
}
使用例
sheetAutoFitColumns(sheet) // fit all columns by all rows
sheetAutoFitColumns(sheet, arrayOf(0, 3))// fit A and D columns by all rows
sheetAutoFitColumns(sheet, arrayOf(0, 3), 5)// fit A and D columns by rows after 5
sheetAutoFitColumns(sheet, arrayOf(0, 3), 5, 2)// fit A and D columns by rows after 5 and ignore two last rows