Bug 52504 - Can't insert picture on a XSSFWorkbook
Summary: Can't insert picture on a XSSFWorkbook
Status: RESOLVED WONTFIX
Alias: None
Product: POI
Classification: Unclassified
Component: XSSF (show other bugs)
Version: 3.8-dev
Hardware: Other All
: P2 normal (vote)
Target Milestone: ---
Assignee: POI Developers List
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2012-01-23 16:05 UTC by Felipe Issa
Modified: 2012-02-03 11:23 UTC (History)
0 users



Attachments
Sample code. (2.32 KB, application/octet-stream)
2012-01-23 16:05 UTC, Felipe Issa
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Felipe Issa 2012-01-23 16:05:01 UTC
Created attachment 28195 [details]
Sample code.

I'm using apache poi 3.8 beta 5 (20111217) it It cant add a picture on a XSSFWorkbook using the margin I configured at the anchor. The same code works normally when I try to insert it on a HSSFWorkbook.

The only way i found to display the picture was to call picture.resize, but if i do this it will ignore the dx and dy values I configured at the Anchor.
Comment 1 Yegor Kozlov 2012-02-03 11:23:43 UTC
The problem is that XSSF interprets dx and dy offsets differently than HSSF.  
In HSSF dx is a fraction of cell width in units of 1/1024. 
anchor.setDx1(400) sets the offset to approximately 40% of the cell width (400/1024) and anchor.setDx2(655) sets the second dx offset to 65% of the cell. that is, the image is located in the middle of the cell between 40% and 65% of the width.

In XSSF all dx and dy offsets are set in EMUS (one pixel is 9525 EMUs) and the equivalent code to anchor your image is as follows:

            anchor.setDx1(25*XSSFShape.EMU_PER_PIXEL);
            anchor.setDx2(41*XSSFShape.EMU_PER_PIXEL);
            anchor.setDy1(1*XSSFShape.EMU_PER_PIXEL);
            anchor.setDy2(14*XSSFShape.EMU_PER_PIXEL);

Setting dx and dy offsets is not portable between HSSF and XSSF. Change your code to set them in pixels. If both .xls and .xlsx should be supported then add a 'if' clause for each format:

        if(wb instanceof HSSFWorkbook){
            anchor.setDx1(400);
            anchor.setDx2(655);
            anchor.setDy1(10);
            anchor.setDy2(200);
        } else {
            anchor.setDx1(25*XSSFShape.EMU_PER_PIXEL);
            anchor.setDx2(41*XSSFShape.EMU_PER_PIXEL);
            anchor.setDy1(1*XSSFShape.EMU_PER_PIXEL);
            anchor.setDy2(14*XSSFShape.EMU_PER_PIXEL);
        }

Cheers,
Yegor