40

Apache POI を使用してスプレッドシートに値を入力しています。これらの値には改行があり、このコードを正常に使用できました。

CellStyle style = cell.getCellStyle()
style.setWrapText(true)
cell.setCellStyle(style)

残念ながら、テキストは正しく折り返されていますが、行の高さが常にコンテンツを表示するのに十分なほど大きくなるとは限りません。行が常に正しい高さであることを確認するにはどうすればよいですか?

4

11 に答える 11

25
currentRow.setHeight((short)-1)

XSSFCell および Excel 2013 で動作

于 2015-03-18T19:41:24.213 に答える
5

これを機能させる唯一の方法は、行の高さを計算する独自の実装を作成することでした。コードはTaroプロジェクトとしてリリースされているので、それを使用できます。はるかに少ないコード行で Excel ファイルを作成できる便利なメソッドが多数あります。

独自のコードに実装する場合は、 SpreadsheetTabクラスで見つけることができます。途中に autoSizeRow(int rowIndex) メソッドがあります。これは基本的に行を反復し、セルごとにテキストの行数を見つけ、フォント サイズを使用して最適なセルの高さを計算します。次に、行の高さを最も高いセルの高さに設定します。

于 2013-10-03T17:08:47.810 に答える
4

列の幅とセルの内容に基づいて、行の正しい高さを手動で計算するコードを提供するこのリンクをすべて参照してください。私は個人的にそれをテストしていません。便宜上、以下にも貼り付けます。

// Create Font object with Font attribute (e.g. Font family, Font size, etc) for calculation
java.awt.Font currFont = new java.awt.Font(fontName, 0, fontSize);
AttributedString attrStr = new AttributedString(cellValue);
attrStr.addAttribute(TextAttribute.FONT, currFont);

// Use LineBreakMeasurer to count number of lines needed for the text
FontRenderContext frc = new FontRenderContext(null, true, true);
LineBreakMeasurer measurer = new LineBreakMeasurer(attrStr.getIterator(), frc);
int nextPos = 0;
int lineCnt = 0;
while (measurer.getPosition() < cellValue.length())
{
    nextPos = measurer.nextOffset(mergedCellWidth); // mergedCellWidth is the max width of each line
    lineCnt++;
    measurer.setPosition(nextPos);
}

Row currRow = currSht.getRow(rowNum);
currRow.setHeight((short)(currRow.getHeight() * lineCnt));

// The above solution doesn't handle the newline character, i.e. "\n", and only
// tested under horizontal merged cells.
于 2014-01-20T18:03:16.780 に答える
2
cell.getRow().setHeight((short) -1);

apache poi 3.9 以降で HSSFCell に取り組んだ

于 2016-03-04T07:01:43.537 に答える
-1

行aitosizeは私のために働きます:

cell.getRow().setHeight((short)0);

ここ0で自動高さを計算します。

于 2013-12-13T10:55:14.343 に答える