2013-04-24 10 views
7

Dodaję obraz do komórki za pomocą Apache POI-HSSF. Obraz ma wymiary 120 x 100, ale bez względu na to, co robię i jak go zmieniam, arkusz kalkulacyjny programu Excel zawsze pokazuje, że obejmuje on wiele wierszy i zniekształca go na znacznie większą wysokość niż szerokość.Apache POI-HSSF zniekształca rozmiar obrazu podczas dodawania obrazu do komórki Excel

Jak zachować oryginalny rozmiar?

Mój kod:

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(); 

Próbowałem wszystkie dx/dy współrzędnych i Col/wiersza. Pozycja nie ma znaczenia, problem rozciąga obraz w poziomie. Dzięki

+0

Odkryłem, że dzieje się tak, gdy ustawię Wysokość rzędu za pomocą row.setHeight(). Jeśli tego nie zrobię, obraz będzie w porządku. Bez względu na to, jak duża jest wysokość, obraz jest nadal rozciągnięty w pionie. –

Odpowiedz

3

O ile zrozumiałem z dokumentacji Apache POI, to z powodu pict.resize(); , jak mówi here że jeśli domyślny rozmiar czcionki dla skoroszycie został zmieniony, obraz może się rozciągnięty w pionie lub poziomie.

3

Miałem do czynienia z podobnym problemem, w którym obraz dodałem został zniekształcony. Próbowałem pict.resize() i sheet.autoSizeColumn(), ale nie działa. W końcu znalazłem poniższy adres URL: - https://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/ss/examples/AddDimensionedImage.java

Dodałem powyższą klasę do mojego kodu i użyłem jej metody, aby dodać obraz do programu Excel. Udało mi się dodać obraz z niewielkim zniekształceniem. Mam nadzieję, że to wam pomoże. Napisałem poniżej kodu: -

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); 
0

stworzyłem kolejny pusty obraz o szerokości pobranej od sheet.getColumnWidthInPixels, rysować niezbędną obraz nad nim i używane AddDimensionedImage.EXPAND_ROW_AND_COLUMN aby dopasować ją dokładnie do komórki:

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); 

I musiałem skopiować AddDimensionedImage.java do mojej ścieżki klasy i przeciążyć addImageToSheet, aby zaakceptować tablicę bajtów.

Wcześniej próbowałem innych opcji wymienionych tutaj, ale to nie pomogło. Mam nadzieję, że moja odpowiedź przyda się komuś.

Powiązane problemy