Java ApachePOI:找出溢出到下一列的文本的colspan

Java ApachePOI:找出溢出到下一列的文本的colspan,java,apache-poi,xssf,Java,Apache Poi,Xssf,我正在使用ApachePOI将Excel转换为HTML。我希望HTML表与Excel中显示的完全相同。我看到很多次Excel单元格中的数据溢出到下一列。有没有办法找出数据跨越了多少列,这样我就可以在TD标记中添加colspan属性?请参见Excel中的此屏幕截图: 在这种情况下,小区A2中的数据溢出到小区B2(也就是A3溢出到B3)。是否有办法确定与单元格A2相对应的TD标签需要colspan=“2”属性 数据溢出的单元格没有合并,因此我无法真正使用像sheet.getNumMergedReg

我正在使用ApachePOI将Excel转换为HTML。我希望HTML表与Excel中显示的完全相同。我看到很多次Excel单元格中的数据溢出到下一列。有没有办法找出数据跨越了多少列,这样我就可以在
TD
标记中添加
colspan
属性?请参见Excel中的此屏幕截图:

在这种情况下,小区A2中的数据溢出到小区B2(也就是A3溢出到B3)。是否有办法确定与单元格A2相对应的TD标签需要
colspan=“2”
属性

数据溢出的单元格没有合并,因此我无法真正使用像
sheet.getNumMergedRegions()这样的函数

如果我能找出Excel中列的“可见”宽度,我想我也能计算出来。但是,
sheet.getColumnWidth()
仅提供实际宽度。我没有看到在Excel中找到列的“可见”宽度的方法。在屏幕截图中,链接上方A列的可见宽度非常小。有没有办法找到“可见”宽度


我使用的是ApachePOI3.17,ApachePOI能够根据列的内容自动调整列的大小。因此,它需要能够计算特殊内容需要的列宽。这就是我们正在做的

此外,还需要了解Microsoft为
Excel
中的列宽引入的非常特殊的测量单位。例如,在
Excel
s
GUI
中,列宽为10表示默认字符宽度的10个字符适合单元格宽度。但在内部,宽度是以默认字符宽度的1/256为单位计算的。这就是为什么ApachePOI决定以字符宽度的1/256为单位

因此,如果您有一个
单元格
具有单元格索引
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);
...
您可以确定内容是否适合单元格。如果
columnWidth>=neededColunmnWidth
,则它适合,否则它不适合,并且必须使用
colspan

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

工作表:

代码:

import org.apache.poi.ss.usermodel.*;
导入org.apache.poi.ss.util.SheetUtil;
导入java.io.*;
类ExcelToHTMLColspan{
公共静态void main(字符串[]args)引发异常{
工作簿=WorkbookFactory.create(新文件输入流(“Test.xlsx”);
DataFormatter DataFormatter=新的DataFormatter();
int defaultCharWidth=SheetUtil.getDefaultCharWidth(工作簿);
int lastColumnToExport=5;//列E
工作表=工作簿。getSheetAt(0);
行行;
细胞;
字符串单元格值;
StringBuilder tableHTML=新的StringBuilder();
tableHTML.append(“”);
tableHTML.append(“”);
对于(int c=0;c对于(int r=0;r)在阅读列宽之前,如何调用
autoSizeColumn
,以强制列的宽度足以容纳所有文本?非常感谢您提供如此详细的答案。这对我帮助很大。
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());

 }
}