如何使用合并单元格值大于单元格宽度的Apache-POI来增加excel行的高度?

我正在使用java类创建一个大的excel。 Excel包含存储字符串的合并单元格。 字符串的长度非常大,我动态地得到这个字符串。 我需要增加合并单元格的高度,以便完整的字符串适合该单元格。 我已经尝试使用“换行文本”,它包装文本但不会增加合并单元格的高度,因为在excel中看不到完整的字符串。 我正在使用的Java类是:

  1. XSSFWorkbook
  2. XSSFSheet
  3. XSSFRow
  4. XSSFCell
  5. XSSFCellStype

和其他所需的依赖类。 有没有办法如何根据单元格值增加合并单元格的高度。

为了让您了解如何计算所需行高的挑战。

我们可以使用Sheet.getColumnWidth(int)获取列的字符宽度的列宽。 但这并不准确,因为它仅用于数字字形:1,2,3,4,5,6,7,8,9,0。 在真实字体中,有字形(。,|,l,…)需要更少的宽度。 因此,这个结果将更加不准确,因为在文本中使用这种较小宽度的字形。

我们可能会用一个因子来校正列中的列宽。 我用5/4。 但这在很大程度上取决于所使用的语言。

然后我们可以计算所需的行数,然后通过获取用于一行的默认行高并将其与所需的行数相乘来获得所需的行高。

 import java.io.FileOutputStream; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.ss.util.CellRangeAddress; public class CreateExcelCellWrapText { public static void main(String[] args) throws Exception { XSSFWorkbook workbook = new XSSFWorkbook(); CellStyle cellstyle = workbook.createCellStyle(); cellstyle.setWrapText(true); Sheet sheet = workbook.createSheet(); //__________________________not merged = height is auto sized Row row = sheet.createRow(0); Cell cell = row.createCell(2); cell.setCellValue("String cell content\nhaving line wrap."); cell.setCellStyle(cellstyle); //__________________________merged = height is not auto sized row = sheet.createRow(2); cell = row.createCell(2); cell.setCellValue("String cell content\nhaving line wrap."); cell.setCellStyle(cellstyle); CellRangeAddress cellRangeAddress = new CellRangeAddress(2, 2, 2, 3); sheet.addMergedRegion(cellRangeAddress); //__________________________merged with calculated height row = sheet.createRow(4); String text = "String cell content\nhaving line wrap.\nIt has new line marks and then a long text without new line marks.\nFollowed by short text part.\n\n\nGreetings"; cell = row.createCell(2); cell.setCellValue(text); cell.setCellStyle(cellstyle); cellRangeAddress = new CellRangeAddress(4, 4, 2, 3); sheet.addMergedRegion(cellRangeAddress); //get the column width in character widths for the merged columns //this is not really accurate since it only is for number glyphs: 1,2,3,4,5,6,7,8,9,0 //in true type fonts there are glyps (., |, l, ...) which need much less width int colwidthinchars = (sheet.getColumnWidth(2) + sheet.getColumnWidth(3)) / 256; System.out.println(colwidthinchars); //correct the colwidthinchars by a factor 5/4 (highly dependent on the language used) colwidthinchars = Math.round(colwidthinchars * 5f/4f); System.out.println(colwidthinchars); //calculate the needed rows dependent on the text and the column width in character widths String[] chars = text.split(""); int neededrows = 1; int counter = 0; for (int i = 0; i < chars.length; i++) { counter++; if (counter == colwidthinchars) { System.out.println("new line because of charcter count"); neededrows++; counter = 0; } else if ("\n".equals(chars[i])) { System.out.println("new line because of new line mark"); neededrows++; counter = 0; } } System.out.println(neededrows); //get default row height float defaultrowheight = sheet.getDefaultRowHeightInPoints(); System.out.println(defaultrowheight); row.setHeightInPoints(neededrows * defaultrowheight); workbook.write(new FileOutputStream("CreateExcelCellWrapText.xlsx")); workbook.close(); } } 

这是有效的,因为使用了默认字体和字体大小。 当使用不同的字体和不同的字体大小时,挑战会增加到无穷大;-)。

请参阅如何使用Java获取具有已定义宽度的多行富文本字段(任何字体,任何字体大小)所需的高度? 例如,在JTextPane呈现格式化文本以获取首选高度。