如何通过 Java POI 将多个图像导入 Excel

How to import multiple image into Excel by Java POI

有什么方法可以将多图文字导入到excel的一个单元格中? 我正在使用 Java 个兴趣点。 这是 my expected result

图片不在 个单元格中Excel。它们悬停在单元格上方的绘图层中,并且仅锚定在单元格上。所以你需要计算锚点位置。这需要以下知识:

A ClientAnchor 具有以下属性:

Col1 = 形状的左上边缘被锚定在该列的左边缘

第 1 行 = 形状的左上边缘被锚定在该行的上边缘

Col2 = 形状的右下边缘被锚定在该列的左边缘

第 2 行 = 形状的右下边缘被锚定在该行的上边缘

Dx1 = delta x 将形状的左上边缘从 Col1 的左边缘移开

Dy1 = delta y 将形状的左上边缘从 Row1 的上边缘移开

Dx2 = delta x 将形状的右下边缘从 Col2 的左边缘移开

Dy2 = delta y 将形状的右下边缘从 Row2 的上边缘移开

注意,dx和dy的计量单位是EMU(英制单位)。 Units 可以正确处理那些奇怪的测量单位。

另外我们需要一些数学知识。

Apache Poi, insert 2 images in one cell with differend anchor properites 的示例中获取方法 void addImage 并像这样使用它:

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

  workbook = new XSSFWorkbook();
  sheet = workbook.createSheet();

  int gapTopPx = 10;
  int gapLeftPx = 20;
  int gapBetweenPx = 30;
  int gapBelowPx = 40;
  
  sheet.setColumnWidth(0, 30*256);
  int columnWidthPx = Math.round(sheet.getColumnWidthInPixels(0));
  sheet.createRow(0).setHeightInPoints((float)Units.pixelToPoints(gapTopPx+pictureHeightPx*2+gapBetweenPx+gapBelowPx));
  
  sheet.getRow(0).createCell(0).setCellValue("Two pictures in A1");
  
  addImage(0, 0, 0, 0, /*all fits in cell A1*/
   /*Dx1 = gap left and Dy1 = gap top*/
   Units.pixelToEMU(gapLeftPx), Units.pixelToEMU(gapTopPx), 
   /*Dx2 is gap left plus picture's width and Dy2 is gap top plus first picture's height*/
   Units.pixelToEMU(gapLeftPx + pictureWidthPx), Units.pixelToEMU(gapTopPx + pictureHeightPx),
   pictureFileNames[0], pictureTypes[0], ClientAnchor.AnchorType.MOVE_AND_RESIZE);

  addImage(0, 0, 0, 0, /*all fits in cell A1*/
   /*Dx1 = gap left and Dy1 = gap top plus first picture's height plus gap between pictures*/
   Units.pixelToEMU(gapLeftPx), Units.pixelToEMU(gapTopPx + pictureHeightPx + gapBetweenPx), 
   /*Dx2 is gapleft plus picture's width and Dy2 is gap top plus first picture's height plus gab betweeen pictures plus second picture's height*/
   Units.pixelToEMU(gapLeftPx + pictureWidthPx), Units.pixelToEMU(gapTopPx + pictureHeightPx + gapBetweenPx + pictureHeightPx),
   pictureFileNames[1], pictureTypes[1], ClientAnchor.AnchorType.MOVE_AND_RESIZE);
   

  FileOutputStream fos = new FileOutputStream(excelPath);
  workbook.write(fos);
  fos.close();
  workbook.close();

 }
...

这导致: