python将excel单元格图片超链接url地址替换为图片

在有些系统中导出excel文件后里面会有图片的超链接url地址,如果想要在excel里面查看图片,还得在浏览器中打开图片的url地址进行查看很不直观,如果能够有个软件自动将excel里面的图片url转换成图片嵌入到excel里面就再好不过了!是的,今天直接上python源码,只要将任意指定excel文件放在python脚本同目录下运行程序,就会自动遍历excel文件将里面单元格的url地址附件进行下载,如果遇到图片还可以自动将下载的图片插入到excel里面。

下面是python实现excel图片超链接变为图片的源码,注意看源码内的说明:

import xlrd
import requests
import xlsxwriter
#import cv2
from PIL import Image

#只要修改这个需要处理的excel文件名即可,请使用.xls后缀的excel文件!
excel_url_file = '图片url.xls' # 设置单元格带有图片或附件url的excel文件名


a = xlrd.open_workbook(excel_url_file, 'r')  # 打开.xlsx文件
sht = a.sheets()[0]  # 打开表格中第一个sheet
nrows = sht.nrows;
#列与列名的对照表
indexToRow = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','AA','AB']

workbook2 = xlsxwriter.Workbook(r'结果.xlsx')
worksheet2 = workbook2.add_worksheet()

start = 0;# 开始行 1表示第二行开始, 0表示第一行开始
columon_find  = 25;#最多找到第26列
cell_width = 50 #设置图片单元格的列宽
cell_height = 100 #设置图片单元格的行高 

for i in range(start, nrows): #从开始行到结束行
    #url = sht.cell(i, 5).value  # 依次读取每行第6列(0-5)的数据,也就是 URL
    
    for j in range(0,columon_find): # 从每行的第0列到第N列
        rownow = indexToRow[j]+str(i+1) #注意是从A1单元格开始的!!
        #worksheet2.write('A2', '插入第一张图片:')
        #print('jjjjj'+str(j))
        try:
            print('正在复制: '+rownow+' = ' + str(sht.cell(i,j).value))
            rowValue = sht.cell(i,j).value
            worksheet2.write(rownow, rowValue)  #直接讲读取到的值复制到新的excel中
        
            try:
                if rowValue:
                    f = requests.get(rowValue)
                    ii = rownow+"_file" #按照单元格构造文件名
                    url2 = rowValue[-3:]  # 根据链接地址获取文件后缀,后缀有.jpg 和 .gif 两种
                    filedir = ii + "." + url2  # 构造完整文件名称
                    with open(filedir, "wb") as code:
                        code.write(f.content)  # 保存文件
                    print('已下载: '+rowValue)  # 打印当前的 URL
                    
                    
                    # 使用pillow读取图片,获取图片的宽和高
                    try:
                        img_pillow = Image.open(filedir)
                        img_width = img_pillow.width  # 图片宽度
                        img_height = img_pillow.height  # 图片高度
                        #print("width -> {}, height -> {}".format(img_width, img_height))
                        #cell_width = 50
                        #cell_height = 100
                        worksheet2.set_column(j,j, cell_width+4)  # 设置带图片单元格列宽               
                        worksheet2.set_row(i, cell_height+4)  # 设置带图片单元格行高
                        
                        x_scale = cell_width/img_width
                        y_scale = cell_height/img_height
                        if img_width/img_height < cell_width/cell_height: #让图片 大小适应调整
                            y_scale = x_scale
                        else:
                            x_scale = y_scale

                        #worksheet2.insert_image(rownow, filedir, {'x_offset': 2,'y_offset':2,'x_scale': 100/img_width, 'y_scale': 100/img_height})
                        worksheet2.insert_image(rownow, filedir, {'x_offset': 2,'y_offset':2,'x_scale': x_scale, 'y_scale': y_scale})
                    except:
                        print('')
                    
            except:
                print('普通单元格')
                
            
        except:
            break

try:
    workbook2.close()
    print('excel文件【结果.xlsx】保存成功')
except:
    print('文件可能被占用,保存失败!!!')




实现思路

1、使用xlrd循环读取excel文件,本python程序默认最大读取26列数据,excel的 行数不限。

2、在循环读取excel文件的过程中使用xlsxwriter将读取到的每一个单元格内容复制到新的excel表格中

3、在复制过程中进行判断,如果该单元格的值是个可访问的网络地址,则使用requests进行下载,将该excel单元格的图片或附件url超链接下载到本地

4、使用PIL的Image模块判断刚才下载到本地的文件是不是图片,如果是图片则使用xlsxwriter进行图片插入,插入的时候设置该单元格的列宽与行高(通过使用图片的宽高比与单元格的宽高比做比较判断该图片相对excel单元格是偏宽还是偏高并进行响应的比例调整,确保图片等比例缩放不变形),方便后期查看。

5、保存excel文件。

更新提示: 我使用set_column进行列宽设置时发现好像不起作用,或者说达不到想要的效果,如果有知道是什么原因的朋友望留言 告知!

基于互联网精神,在注明出处的前提下本站文章可自由转载!

本文链接:https://ranjuan.cn/python-excel-pic-url-save/

赞赏

微信赞赏支付宝赞赏

发表评论