web-dev-qa-db-ja.com

Apache POIの行の自動サイズの高さ

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

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

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

33
user1007895
currentRow.setHeight((short)-1)

XSSFCellおよびExcel 2013に対応

20
HSSFWorkbook workbook=new HSSFWorkbook();
HSSFSheet sheet =  workbook.createSheet("FirstSheet");  
HSSFRow rowhead=   sheet.createRow((short)0);
HSSFCellStyle style = workbook.createCellStyle();
style.setWrapText(true);
row.setRowStyle(style);
row.getCell(0).setCellStyle(style);

上記のコードは、行の動的な高さを生成します。

18
Vinil Vijayan

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

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

5
JMB

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

// 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.
4
GreenGiant

セルの高さを直接調整することはできません。ただし、行の高さは変更できます

final HSSFSheet fs = wb.createSheet("sheet1");
final HSSFRow row0 = fs.createRow(0);
final HSSFCell cellA1 = row0.createCell(0);
row0.setHeight((short)700);
3
Arthur
cell.getRow().setHeight((short) -1);

Apache poi 3.9以上でHSSFCellで働いた

1
Miller Cy Chan

Excel 2010で動作します。セルの長さの制限を50文字に設定します

    Row row = sheet.createRow(0);
    CellStyle style = workbook.createCellStyle();
    style.setWrapText(true);
    if (data.length() > 50) {
        for (int i = 1; i <= Math.abs(data.length() / 50); i++) {
            data = data.substring(0, i * 50) + "\n" + data.substring(i * 50);
        }
        Cell cell = row.createCell(0);
        row.setRowStyle(style);
        cell.setCellStyle(style);
        cell.setCellValue(data);
        sheet.autoSizeColumn(0);
    }
1

私のための行aitosize作業:

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

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

0