2013-04-24 19 views
7

Aggiungo un'immagine in una cella utilizzando Apache POI-HSSF. L'immagine è 120x100 ma non importa cosa faccio e come la ridimensiono, il foglio di calcolo Excel mostra sempre che si estende su più righe e lo distorce a un'altezza molto più grande della larghezza.Apache POI-HSSF distorce le dimensioni dell'immagine quando si aggiunge un'immagine nella cella di Excel

Come mantenere le dimensioni originali?

Il mio codice:

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

Ho provato tutte le coordinate dx/dy e Col/file. La posizione non ha importanza, il problema si estende orizzontalmente l'immagine. Grazie

+0

Ho scoperto che questo accade quando imposto l'altezza della riga usando row.setHeight(). Se non lo faccio, l'immagine va bene. Non importa quanto sia grande l'altezza, l'immagine è ancora allungata verticalmente. –

risposta

3

Per quanto ho capito dalla documentazione di Apache POI, è a causa di pict.resize(); , come si dice here che se la dimensione della cartella di lavoro di carattere predefinito è stato modificato, l'immagine potrebbe avere allungato verticalmente o orizzontalmente.

3

Ho dovuto affrontare il problema simile in cui l'immagine che ho aggiunto è stata distorta. Ho provato pict.resize() e sheet.autoSizeColumn() ma non ha funzionato. Finalmente ho trovato il seguente URL: - https://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/ss/examples/AddDimensionedImage.java

Ho aggiunto la classe sopra nel mio codice e ho usato il suo metodo per aggiungere l'immagine in Excel. Sono stato in grado di aggiungere l'immagine con poca distorsione. Spero che questo ti aiuti anche. Ho scritto qui di seguito il codice: -

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

ho creato un'altra immagine vuota con la larghezza tratto da sheet.getColumnWidthInPixels, disegnare l'immagine necessaria su di esso e usato AddDimensionedImage.EXPAND_ROW_AND_COLUMN per adattarsi esattamente nella cella:

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 dovevo copiare AddDimensionedImage.java nel mio classpath e sovraccaricare addImageToSheet per accettare array di byte.

Prima ho provato altre opzioni menzionate qui ma non ha aiutato. Spero che la mia risposta sarà utile a qualcuno.

Problemi correlati