Insert image to excel file using JXL without stretching it

11,971

As much as this has bugged me about jxl, I've never found a way to insert an image without associating the aspect ratio to cells instead of pixels/inches/any standard unit of measurement, and I've done decent research in the past on doing so.

The best you can do is to adapt the images to the height/width of the cells you are inserting it into, or even better, set the cell width/height for the cells you are putting the image in.

From the JExcel FAQ- http://jexcelapi.sourceforge.net/resources/faq/

private static final double CELL_DEFAULT_HEIGHT = 17;
private static final double CELL_DEFAULT_WIDTH = 64;

File imageFile = new File(GIF_OR_JPG_IMAGE_FILE);
BufferedImage input = ImageIO.read(imageFile);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(input, "PNG", baos);
sheet.addImage(new WritableImage(1,1,input.getWidth() / CELL_DEFAULT_WIDTH,
    input.getHeight() / CELL_DEFAULT_HEIGHT,baos.toByteArray()));

To keep the aspect ratio, you'll also want to set the WritableImage to not re-size if the user changes the row height or column width. Do this with either of the below (your preference based on if you want the image anchor locked or to move with resizing):

WritableImage.MOVE_WITH_CELLS;
WritableImage.NO_MOVE_OR_SIZE_WITH_CELLS;
Share:
11,971
Jemp
Author by

Jemp

Updated on July 30, 2022

Comments

  • Jemp
    Jemp almost 2 years

    I can insert image to my excel file using jxl usingsheet.addImage(WritableImage obj). My problem is that, it stretches based on the args of WritableImage. I'm wondering if there is a way so that the image that I insert will not stretch like if I insert a 200x200 sized image it will appear to the sheet as 200x200.

  • Jemp
    Jemp over 12 years
    Thank you for your reply! I think I can't apply it to my current situation since the column width and height is subjected to the length of the longest word in the same column where i need to put an image. But I appreciate your answer so much.
  • king14nyr
    king14nyr over 12 years
    No problem, this situation has happened to me before as well. The above works IF you can fix the width/height of the cells, but in the case where you cannot (such as when you set AUTOSIZE to true on columns), I haven't found a way to do so. If you do find a way to do so in jxl, be sure to post here, as it may help others.
  • king14nyr
    king14nyr almost 12 years
    @shareef If you have to have your columns at a dynamic width, such as when using AUTOSIZE, I've not found a way to do this properly still. I haven't had looked into this issue for a good while, so maybe jxl has handled it in an update, but I am unaware. That'd be your best bet, since I haven't found a good solution with the case that the row/column sizes are dynamic. :(
  • shareef
    shareef almost 12 years
    thanx for replying but what i need to set image size as like pixels 50,50 its a logo by the way and it seem hard to add it to excel because its getting streched according to the cell witdh how to set it any ideas