为了账号安全,请及时绑定邮箱和手机立即绑定

Apache POI:找出溢出到下一列的文本的 colspan

Apache POI:找出溢出到下一列的文本的 colspan

慕桂英3389331 2022-12-28 15:46:03
我正在使用 Apache POI 将 Excel 转换为 HTML。我希望 HTML 表格与它在 Excel 中显示的完全一样。我经常看到 Excel 单元格中的数据溢出到下一列的情况。有没有办法找出数据跨越多少列,以便我可以向标签添加colspan属性?TD从 Excel 中查看此屏幕截图:在这种情况下,单元格 A2 中的数据溢出到单元格 B2(A3 也溢出到 B3)。有没有办法查到A2单元格对应的TD标签需要colspan="2"属性?数据溢出的单元格没有合并,所以我不能真正使用像sheet.getNumMergedRegions()我想如果我能以某种方式找出 Excel 中列的“可见”宽度,我也可以计算它。但是,sheet.getColumnWidth()仅提供实际宽度。我没有看到在 Excel 中找出列的“可见”宽度的方法。在上面的截图链接中,A 列的可见宽度非常小。有没有办法找到“可见”宽度?我正在使用 Apache POI 3.17
查看完整描述

1 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

Apache poi能够根据内容自动调整列的大小。所以它需要能够计算特殊内容需要的列宽。这就是SheetUtil.getCellWidth正在做的事情。


此外,还需要了解Microsoft在Excel. 例如,在ExcelsGUI中,列宽为 10 意味着默认字符宽度的 10 个字符适合单元格宽度。但在内部,宽度是以默认字符宽度的 1/256 为单位计算的。这就是为什么apache poi决定以字符宽度的 1/256 为单位获取Sheet.getColumnWidth的原因。


所以如果你有一个Cell cell单元格索引c和一个特殊的内容,那么使用


Workbook workbook...

...

DataFormatter dataFormatter = new DataFormatter();

...

int defaultCharWidth = SheetUtil.getDefaultCharWidth(workbook);

...

double cellValueWidth = SheetUtil.getCellWidth(cell, defaultCharWidth, dataFormatter, false);

int neededColunmnWidth = (int)cellValueWidth*256;

int columnWidth = sheet.getColumnWidth(c);

...

您可以确定内容是否适合单元格。它适合 if columnWidth >= neededColunmnWidth,否则它不适合并且colspan必须使用。


让我们有一个完整的例子来说明原理:


床单:

//img1.sycdn.imooc.com//63abf46200017f4a06250156.jpg

代码:


import org.apache.poi.ss.usermodel.*;

import org.apache.poi.ss.util.SheetUtil;


import java.io.*;


class ExcelToHTMLColspan {


 public static void main(String[] args) throws Exception{


  Workbook workbook = WorkbookFactory.create(new FileInputStream("Test.xlsx"));


  DataFormatter dataFormatter = new DataFormatter();


  int defaultCharWidth = SheetUtil.getDefaultCharWidth(workbook);


  int lastColumnToExport = 5; // column E


  Sheet sheet = workbook.getSheetAt(0);


  Row row;

  Cell cell;

  String cellValue;


  StringBuilder tableHTML = new StringBuilder();


  tableHTML.append("<TABLE>");

  tableHTML.append("<COLGROUP>");

  for (int c = 0; c < lastColumnToExport; c++) {

   long columnWidthPx = Math.round(sheet.getColumnWidthInPixels(c));

   tableHTML.append("<COL width=\"" + columnWidthPx + "\"/>");

  }

  tableHTML.append("</COLGROUP>");


  for (int r = 0; r <= sheet.getLastRowNum(); r++) {

   row = sheet.getRow(r); if (row == null) row = sheet.createRow(r);

   long rowHeightPx = Math.round(row.getHeightInPoints() * 92f / 72f);

   tableHTML.append("<TR height=\"" + rowHeightPx + "\">");

   int c = 0;

   while(c < lastColumnToExport) {

    tableHTML.append("<TD");

    cell = row.getCell(c); if (cell == null) cell = row.createCell(c);

    cellValue = dataFormatter.formatCellValue(cell);

    double cellValueWidth = SheetUtil.getCellWidth(cell, defaultCharWidth, dataFormatter, false);

    int neededColunmnWidth = (int)cellValueWidth*256;

    int columnWidth = sheet.getColumnWidth(c);

    if (columnWidth < neededColunmnWidth) {

     int colSpan = 1;

     while(columnWidth < neededColunmnWidth) {

      colSpan++;

      c++;

      columnWidth += sheet.getColumnWidth(c);

     } 

     tableHTML.append(" colspan=\"" + colSpan + "\""  + ">" + cellValue);

     c++;

    } else {

     tableHTML.append(">" + cellValue);

     c++;

    }

    tableHTML.append("</TD>");

   }

   tableHTML.append("</TR>");

  }


  tableHTML.append("</TABLE>");


  workbook.close();


System.out.println(tableHTML.toString());


  //creating a sample HTML file 

  String encoding = "UTF-8";

  FileOutputStream fos = new FileOutputStream("result.html");

  OutputStreamWriter writer = new OutputStreamWriter(fos, encoding);

  writer.write("<!DOCTYPE html>\n");

  writer.write("<html lang=\"en\">");

  writer.write("<head>");

  writer.write("<meta charset=\"utf-8\"/>");

  writer.write("<style>");

  writer.write("table {border-collapse: collapse; table-layout: fixed;}");

  writer.write("table, tr, td {border: 1px solid black;}");

  writer.write("td {font: 11pt Calibri, arial, sans-serif;}");

  writer.write("</style>");

  writer.write("</head>");

  writer.write("<body>");


  writer.write(tableHTML.toString());


  writer.write("</body>");

  writer.write("</html>");

  writer.close();


  java.awt.Desktop.getDesktop().browse(new File("result.html").toURI());


 }

}

结果:

//img1.sycdn.imooc.com//63abf46e0001dfcc05470242.jpg

查看完整回答
反对 回复 2022-12-28
  • 1 回答
  • 0 关注
  • 139 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号