2013-04-24 182 views
7

我正在使用Apache POI-HSSF將圖片添加到單元格中。圖像是120x100,但無論我做什麼以及如何調整它大小,Excel電子表格總是顯示它橫跨多行,並將其扭曲到比寬度大得多的高度。Apache POI-HSSF在將圖片添加到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座標和彩色/行。位置並不重要,它橫向拉伸圖像的問題。由於

+0

我發現這種情況發生在我使用row.setHeight()設置行高時。如果我不這樣做,圖像是好的。無論我身高多大,圖像仍然垂直拉伸。 – 2013-04-24 01:25:35

回答

3

據我從Apache的POI的文件的理解,這是因爲pict.resize(); ,因爲它說here,如果工作簿的默認字體大小改變時,畫面可能會垂直或水平拉伸。

3

我一直在面對類似的問題,我添加的圖像變得扭曲。我嘗試過pict.resize()和sheet.autoSizeColumn(),但它不起作用。最後,我發現下面的網址: - https://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/ss/examples/AddDimensionedImage.java

我加了上面的類爲我的代碼,並使用它的方法,將圖像添加到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); 
0

我創建與來自sheet.getColumnWidthInPixels採取的寬度另一空圖像,吸取必要的圖像在其上,並用於AddDimensionedImage.EXPAND_ROW_AND_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); 

我必須將AddDimensionedImage.java複製到我的類路徑並重載addImageToSheet以接受字節數組。

在此之前,我嘗試了這裏提到的其他選項,但它沒有幫助。希望我的回答對某人有用。