Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将图片添加到Excel单元格时,Apache POI-HSSF会扭曲图像大小_Java_Image_Excel_Apache Poi_Hssf - Fatal编程技术网

Java 将图片添加到Excel单元格时,Apache POI-HSSF会扭曲图像大小

Java 将图片添加到Excel单元格时,Apache POI-HSSF会扭曲图像大小,java,image,excel,apache-poi,hssf,Java,Image,Excel,Apache Poi,Hssf,我正在使用Apache POI-HSSF将图片添加到单元格中。图像是120x100,但无论我做什么以及如何调整大小,Excel电子表格总是显示跨越多行的图像,并将其扭曲到比宽度大得多的高度 我如何保持原来的尺寸 我的代码: InputStream is = new FileInputStream(getImageURL()); byte[] bytes = IOUtils.toByteArray(is); int pictureIdx = wb.addPicture(bytes, Workboo

我正在使用Apache POI-HSSF将图片添加到单元格中。图像是120x100,但无论我做什么以及如何调整大小,Excel电子表格总是显示跨越多行的图像,并将其扭曲到比宽度大得多的高度

我如何保持原来的尺寸

我的代码:

InputStream is = new FileInputStream(getImageURL());
byte[] bytes = IOUtils.toByteArray(is);
int pictureIdx = wb.addPicture(bytes, Workbook.PICTURE_TYPE_JPEG);
is.close();

//add a picture shape
CreationHelper helper = wb.getCreationHelper();
ClientAnchor anchor = helper.createClientAnchor();
// Create the drawing patriarch.  This is the top level container for all shapes.
Drawing drawing = sheet1.createDrawingPatriarch();
//set top-left corner of the picture,
//subsequent call of Picture#resize() will operate relative to it

anchor.setAnchorType(0);
anchor.setCol1(1);
anchor.setRow1(1);

Picture pict = drawing.createPicture(anchor, pictureIdx);

//auto-size picture relative to its top-left corner
pict.resize();

我尝试了所有的dx/dy坐标和Col/Row。位置无关紧要,问题在于它会水平拉伸图像

据我从ApachePOI文档中了解,这是因为
pict.resize()

,因为上面说,如果工作簿的默认字体大小被更改,图片可能会垂直或水平拉伸

我一直面临着类似的问题,我添加的图像被扭曲了。我尝试了pict.resize()和sheet.autoSizeColumn(),但没有成功。最后我找到了下面的URL:-

我将上述类添加到代码中,并使用它的方法将图像添加到excel中。我能够添加几乎没有失真的图像。希望这对你也有帮助。我写了以下代码:-

BufferedImage imageIO = ImageIO.read(new URL(image));
int height= imageIO.getHeight();
int width=imageIO.getWidth();
int relativeHeight=(int)(((double)height/width)*28.5);
new AddDimensionedImage().addImageToSheet(2,  sheet.getPhysicalNumberOfRows()-1 , sheet, sheet.createDrawingPatriarch(),new URL(image), 30, relativeHeight, AddDimensionedImage.EXPAND_ROW);

我创建了另一个空图像,其宽度取自
工作表。getColumnWidthInPixels
,在其上绘制必要的图像,并使用
添加维度图像。展开_ROW_和_COLUMN
,将其精确地放入单元格:

    HSSFRow imageRow = sheet.createRow(row);

    BufferedImage image = ImageIO.read(Paths.get(pathToImage).toUri().toURL());

    AddDimensionedImage addImage = new AddDimensionedImage();
    float columnWidth = sheet.getColumnWidthInPixels(0);

    BufferedImage off_Image = new BufferedImage((int) columnWidth, actualImageHeight, BufferedImage.TYPE_INT_RGB);
    Graphics2D g2 = off_Image.createGraphics();
    g2.setColor(new Color(192,192,192));
    g2.fillRect(0, 0, off_Image.getWidth(), off_Image.getHeight());
    g2.drawImage(image, 0, 0, null);
    g2.dispose();

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ImageIO.write(off_Image, "jpg", baos);
    byte[] bytes = baos.toByteArray();

    double reqImageWidthMM = ((double) off_Image.getWidth()) / ConvertImageUnits.PIXELS_PER_MILLIMETRES;
    double reqImageHeightMM = ((double) off_Image.getHeight()) / ConvertImageUnits.PIXELS_PER_MILLIMETRES;

    addImage.addImageToSheet("A1", sheet, bytes, reqImageWidthMM, reqImageHeightMM, AddDimensionedImage.EXPAND_ROW_AND_COLUMN);
我必须复制到我的类路径并重载
addImageToSheet
以接受字节数组


在此之前,我尝试了这里提到的其他选择,但没有帮助。希望我的答案对其他人有用。

我也有同样的问题,我的解决方案是在我的项目中复制这个类 然后用这个方法

protected void addImageInCell(Sheet sheet, URL url, Drawing<?> drawing, int colNumber, int rowNumber) {
    BufferedImage imageIO = ImageIO.read(url);
    int height = imageIO.getHeight();
    int width = imageIO.getWidth();
    int relativeHeight = (int) (((double) height / width) * 28.5);
    new AddDimensionedImage().addImageToSheet(colNumber, rowNumber, sheet, drawing, url, 30, relativeHeight,
            AddDimensionedImage.EXPAND_ROW_AND_COLUMN);

}

我发现在使用Row.setHeight()设置行的高度时会发生这种情况。如果我不这样做,图像是好的。无论我将高度设置得多大,图像仍然垂直拉伸。新URL:addDimensioneImage.java似乎已移动。新URL:addDimensioneImage.java似乎已移动。新网址:
URL url = new URL("https://blog.expedia.mx/por-que-los-viajeros-internacionales-visitan-mexico/");
addImageInCell(sheet, url, sheet.createDrawingPatriarch(), 0, 0);