Apache POI中行的自动大小高度

时间:2013-10-02 19:51:53

标签: java excel apache-poi

我正在使用Apache POI将值输入到电子表格中。这些值有换行符,我能够成功使用此代码:

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

不幸的是,虽然文本正确包装,但行的高度并不总是足以显示内容。如何确保我的行总是正确的高度?

11 个答案:

答案 0 :(得分:19)

currentRow.setHeight((short)-1)

适用于XSSFCell和Excel 2013

答案 1 :(得分:18)

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);

上面的代码将生成行的动态高度。

答案 2 :(得分:5)

我使用它的唯一方法是编写我自己的实现来计算行高。代码现在作为Taro项目发布,因此您可以使用它。它有许多方便的方法,可以用更少的代码行编写Excel文件。

如果您希望将实现放在自己的代码中,可以在SpreadsheetTab类中找到它。中途有一个autoSizeRow(int rowIndex)方法。它基本上向下遍历行,每个单元格找到文本行数,然后使用字体大小计算最佳单元格高度。然后它将行高设置为最高单元格的高度。

答案 3 :(得分:4)

查看所有this link,其中提供了一些代码,用于根据列宽和单元格内容手动计算行的正确高度。我没有亲自测试过它。为方便起见,也粘贴在下面:

// 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 :(得分:3)

您无法直接调整单元格高度。 但是你可以改变行的高度

final HSSFSheet fs = wb.createSheet("sheet1");
final HSSFRow row0 = fs.createRow(0);
final HSSFCell cellA1 = row0.createCell(0);
row0.setHeight((short)700);

答案 5 :(得分:1)

cell.getRow().setHeight((short) -1);

在apache poi 3.9或以上版本中为HSSFCell工作

答案 6 :(得分:1)

它在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);
    }

答案 7 :(得分:0)

为我分配工作:

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

此处0用于计算自动高度。

答案 8 :(得分:0)

“ LibreOffice Calc”和“ WPS电子表格”具有合并销售的自动高度的解决方法。

我在主文档右边添加一列(在我的情况下是32列) 将宽度设置为所有具有相同文本的合并单元格。 将样式WrapText设置为true 将样式设置为顶部对齐 复制将在合并的单元格中显示的内容 将该列设置为隐藏 设置行高= -1

代码示例:

   private void applyRowHightWorkaroundForMergedCells(HSSFCell cell0) {
       HSSFSheet sheet = cell0.getSheet();
       HSSFRow row = cell0.getRow();
    
       String value = cell0.getStringCellValue();
       HSSFCell cell = row.createCell(32);
       sheet.setColumnWidth(32, 32000);
       cell.getCellStyle().setWrapText(true);
       cell.getCellStyle().setVerticalAlignment(VerticalAlignment.TOP);
       cell.setCellValue(value);
       sheet.setColumnHidden(32, true);
       row.setHeight((short) -1);
   }

答案 9 :(得分:0)

就我而言,一个可靠的解决方案是计算行数并将行高设置为默认行高的倍数:

int numberOfLines = cell.getStringCellValue().split("\n").length;
row.setHeightInPoints(numberOfLines*sheet.getDefaultRowHeightInPoints());

答案 10 :(得分:-8)

//我们可以使用工作表的列宽

Ex: sheet.setColumnWidth(0, 2000);