2015-11-12 157 views
3

插入從docs時,所述insert_image函數採用以下選項:設置寬度和圖像高度經由worksheet.insert_image

{ 
    'x_offset': 0, 
    'y_offset': 0, 
    'x_scale':  1, 
    'y_scale':  1, 
    'url':   None, 
    'tip':   None, 
    'image_data': None, 
    'positioning': None, 
} 

的問題是,輸入圖像的大小我需要插入可變化,但他們需要的單元格的大小是固定的。是否有可能以某種方式提供寬度和高度,並讓Excel將圖像調整爲提供的尺寸?

+0

你想拉伸圖像或保持縱橫比嗎? – KobeJohn

+0

我想縮小圖像,同時可能保持寬高比不變。但圖像的尺寸保持不變 - 特別是高度。 – Unos

回答

2

:要保持原始的分辨率和讓Excel做內部縮放也是你提供的範圍內適合,你可以給它練成之前計算正確的比例因子根據單元格和圖像的高度和寬度,可以使用XlsxWriter和x_scaley_scale在外部或Excel中使用縮放圖像。

例如:

import xlsxwriter 

workbook = xlsxwriter.Workbook('image_scaled.xlsx') 
worksheet = workbook.add_worksheet() 

image_width = 140.0 
image_height = 182.0 

cell_width = 64.0 
cell_height = 20.0 

x_scale = cell_width/image_width 
y_scale = cell_height/image_height 

worksheet.insert_image('B2', 'python.png', 
         {'x_scale': x_scale, 'y_scale': y_scale}) 

workbook.close() 

縮放它像這樣的好處是,用戶可以通過設置比例恢復到100%,在Excel中找回原來的圖像。

+0

從你那裏得到答案真棒。我也嘗試了這種方法..做它有所作爲,如果我把圖像放在單元格範圍內,V/S如果我先合併單元格範圍,然後插入圖像? – Unos

+0

在合併或未合併的單元格範圍內應該沒問題。只需相應地增加單元格的高度和寬度即可。 – jmcnamara

+0

相關q:我們如何近似計算像素中的行高/列寬? – Unos

2

我不認爲它有一個內置的方式來做規模和保持寬高比。你將不得不自己計算。

如果要調整,並在目標分辨率提交的文件(可能是讓你的文件大小向下),與xlsxwriterimage_data選項一起使用pillowthumbnail()圖像的方法:

import io 
from PIL import Image 

def get_resized_image_data(file_path, bound_width_height): 
    # get the image and resize it 
    im = Image.open(file_path) 
    im.thumbnail(bound_width_height, Image.ANTIALIAS) # ANTIALIAS is important if shrinking 

    # stuff the image data into a bytestream that excel can read 
    im_bytes = io.BytesIO() 
    im.save(im_bytes, format='PNG') 
    return im_bytes 

# use with xlsxwriter 
image_path = 'asdf.png' 
bound_width_height = (240, 240) 
image_data = get_resized_image_data(image_path, bound_width_height) 

# sanity check: remove these three lines if they cause problems 
im = Image.open(image_data) 
im.show() # test if it worked so far - it does for me 
im.seek(0) # reset the "file" for excel to read it. 

worksheet.insert_image(cell, image_path, {'image_data': image_data}) 

如果您

from PIL import Image 


def calculate_scale(file_path, bound_size): 
    # check the image size without loading it into memory 
    im = Image.open(file_path) 
    original_width, original_height = im.size 

    # calculate the resize factor, keeping original aspect and staying within boundary 
    bound_width, bound_height = bound_size 
    ratios = (float(bound_width)/original_width, float(bound_height)/original_height) 
    return min(ratios) 

# use with xlsxwriter 
image_path = 'asdf.png' 
bound_width_height = (240, 240) 
resize_scale = calculate_scale(image_path, bound_width_height) 
worksheet.insert_image(cell, image_path, {'x_scale': resize_scale, 'y_scale': resize_scale}) 
+0

感謝您的回答!是的,我可以在插入前調整大小。該圖像是保存在磁盤上的PNG文件。 – Unos

+1

@Unos更新了基本代碼和備選備註。 – KobeJohn

+0

@Unos更新的方法,應該工作,而無需創建新的文件,並且還保持圖像在原始高寬比的範圍內。 – KobeJohn

相關問題