我想把一个图像设置在Excel的一个单元格的中心,我使用XSSFClientAnchor来锚定图片的位置,但仍然不像图1中的工作。
如何将图像设置在单元格的中心,如图2所示。
InputStream iStream = new FileInputStream(iList.get(q.getProductID()));
byte[] bytes = IOUtils.toByteArray(iStream);
int pictureIdx = wb.addPicture(bytes, Workbook.PICTURE_TYPE_PNG);
XSSFDrawing patriarch = sheet.createDrawingPatriarch();
XSSFClientAnchor anchor = new XSSFClientAnchor();
anchor.setCol1(1);
anchor.setRow1(row);
anchor.setCol2(2);
anchor.setRow2(row + 1);
Picture pic = patriarch.createPicture(anchor, pictureIdx);
pic.resize();
1条答案
按热度按时间nbysray51#
图像不是单元格内容,而是悬停在工作表上称为绘图的单独图层中。它们被锚定到单元格。
ClientAnchor
提供以下设置:col1
=图片的左边缘锚定的列索引。因此图片的左边缘锚定在col1
的左列边缘上。dx1
= x方向上的差。因此,图片的左边缘锚定在col1
+dx1
的左列边缘上。row1
=图片的顶边缘锚定的行索引。因此图片的顶边缘锚定在row1
的顶行边缘。dy1
= y方向上的差。因此,图片的顶部边缘锚定在row1
+dy1
的顶部行边缘。col2
=图片的右边缘锚定的列索引。因此图片的右边缘锚定在col2
的左列边缘。dx2
= x方向上的差。因此,图片的右边缘锚定在col1
+dx2
的左列边缘上。row2
=图片底边锚定的行索引。因此图片底边锚定在row2
的顶行边。dy2
= y方向上的差。因此,图片的底部边缘锚定在row2
+dy2
的顶部行边缘。因此,给定一个完整的两单元锚,这确定了图片的位置以及它的大小。
如果图片的大小应该是它的原始大小,那么只需要一个单元格锚。其中
col1
+dx1
和row1
+dy1
确定图片左上边缘的位置。大小由图片的原始大小给定。如果仅设置
col1
和row1
,而不设置dx1
和dy1
,则图片的左上边缘始终固定到col1
的左边缘和row1
的上边缘。因此,如果需要在单元格上居中,则需要计算dx1
和dy1
。为了计算dx1
和dy1
,需要知道图片的宽度和高度以及单元的宽度和高度。听起来很简单,但有多种不同的测量单位用于单元格的宽度和高度,二进制BIFF
(*.xls
)文件系统和Office Open XML
(*.xlsx
)文件系统之间有很大的差异。以下代码提供
putPictureCentered
方法,该方法将工作表绘图中的图片定位到由colIdx
和rowIdx
给定的单元格。如果可能,它计算dx1
和dy1
,使图片固定在单元格的中心。它使用像素作为通用度量单位。它考虑二进制BIFF
(*.xls
)文件系统和Office Open XML
(*.xlsx
)文件系统。因此,它适用于Sheet
,可能是XSSFSheet
或HSSFSheet
。