将Excel中的图片URL地址转成图片文件

本文介绍了一种使用VB脚本将Excel中的图片URL转换为实际图片的方法。通过编写特定的宏,可以批量处理包含图片链接的数据,使得业务人员能够在Excel中直接查看图片,而无需手动下载或调整。
该文章已生成可运行项目,

前阵子从数据库中导出数据给业务,但是图片是个URL,业务需要在 Excel 中直接显示图片,因此在网上爬了很多VB脚本尝试修改,最终将Excel中的图片URL转换成了图片。

VB脚本 LoadImage.bas :

' charset GB2312 . Excel 中的图片链接转为图片文件

Attribute VB_Name = "LoadImage加载图片"
Sub LoadImage()
Dim HLK As Hyperlink, Rng As Range
For Each HLK In ActiveSheet.Hyperlinks  '循环活动工作表中的各个超链接
    If UCase(HLK.Address) Like "*.JPG" Or UCase(HLK.Address) Like "*.JPEG" Or UCase(HLK.Address) Like "*.PNG" Or UCase(HLK.Address) Like "*.GIF" Then  '如果链接的位置是jpg或gif图片(此处仅针对此两种图片类型,更多类型可以通过建立数组或字典或正则来判断)
        Set Rng = HLK.Parent.Offset(, 0)  '设定插入目标图片的位置
        With ActiveSheet.Pictures.Insert(HLK.Address)  '插入链接地址中的图片
            If .Height / .Width > Rng.Height / Rng.Width Then  '判断图片纵横比与单元格纵横比的比值以确定针对单元格缩放的比例
                .Top = Rng.Top
                .Left = Rng.Left + (Rng.Width - .Width * Rng.Height / .Height) / 2
                .Width = .Width * Rng.Height / .Height
                .Height = Rng.Height
            Else
                .Left = Rng.Left
                .Top = Rng.Top + (Rng.Height - .Height * Rng.Width / .Width) / 2
                .Height = .Height * Rng.Width / .Width
                .Width = Rng.Width
            End If
        End With
        HLK.Parent.Value = ""   '删除单元格的图片链接
    End If
Next
End Sub

打开Excel后在查看“宏”里新建一个宏会弹出VB编辑器(或直接打开VB编辑器),然后将这个 LoadImage.bas 文件导入,运行

如果数据较大可能会比较慢


Link: http://www.exceltip.net/thread-22321-1-1.html

本文章已经生成可运行项目
<think>我们继续解决用户的问题:如何将Excel中的多个URL链接换为图片并插入到Excel中。根据之前的讨论和引用[1],我们需要完成以下步骤: 1. 读取Excel文件中的URL链接(假设在A列)。 2. 遍历每个URL,下载图片并调整大小(按比例缩放,最大边长为200像素)。 3. 将调整后的图片插入到Excel的对应行(例如B列)。 4. 保存Excel文件。 注意:引用[1]中提到了一个按比例裁剪的函数,我们将使用类似逻辑,但注意引用[1]中的函数是返回调整后的宽高,而我们这里直接使用PIL调整图片大小。 此外,我们需要考虑: - 错误处理(无效URL、下载失败等) - 调整Excel的行高和列宽以适应图片 - 避免临时文件(如果可能)或清理临时文件 但是,由于openpyxl在插入图片时需要文件路径,因此我们不得不保存临时图片文件。在循环结束后,我们可以删除这些临时文件。 另外,用户提到“将换后的图片直接嵌入单元格而非浮动对象”,但是openpyxl插入的图片是浮动对象,无法直接嵌入单元格。不过,我们可以通过调整图片位置和单元格的尺寸来模拟嵌入效果。 下面是完整的代码实现: </think>### 使用Python将Excel中的多个URL换为图片的方法 以下是完整的解决方案,通过Python将Excel中多个URL链接换为图片并插入Excel: #### 核心步骤 1. **读取Excel中的URL** 使用`pandas`读取包含URL的列(假设为A列): ```python import pandas as pd df = pd.read_excel('input.xlsx', usecols=['A']) urls = df['A'].dropna().tolist() # 过滤空值 ``` 2. **下载图片并按比例调整尺寸** 参考引用[1]的尺寸调整逻辑: ```python from PIL import Image import requests from io import BytesIO def download_and_resize(url, max_size=200): response = requests.get(url, timeout=10) img = Image.open(BytesIO(response.content)) w, h = img.size # 计算缩放比例保持宽高比[^1] ratio = min(max_size/w, max_size/h) return img.resize((int(w*ratio), int(h*ratio))) ``` 3. **将图片插入Excel** 使用`openpyxl`精确控制图片位置: ```python from openpyxl import load_workbook from openpyxl.drawing.image import Image as ExcelImage from openpyxl.utils import get_column_letter wb = load_workbook('input.xlsx') ws = wb.active for i, url in enumerate(urls, start=2): # 从第2行开始 try: # 下载调整图片 img = download_and_resize(url) img_path = f'temp_{i}.png' img.save(img_path) # 插入Excel并调整单元格尺寸 ws.column_dimensions['B'].width = 30 # 设置列宽 ws.row_dimensions[i].height = 150 # 设置行高 excel_img = ExcelImage(img_path) excel_img.anchor = f'B{i}' # 锚定到B列对应行 ws.add_image(excel_img) except Exception as e: print(f"行 {i} 错误: {str(e)}") wb.save('output_with_images.xlsx') ``` #### 完整代码 ```python import pandas as pd from PIL import Image import requests from io import BytesIO from openpyxl import load_workbook from openpyxl.drawing.image import Image as ExcelImage import os # 1. 读取URL df = pd.read_excel('input.xlsx', usecols=['A']) urls = df['A'].dropna().tolist() # 2. 图片处理函数 def download_and_resize(url, max_size=200): response = requests.get(url, timeout=10) img = Image.open(BytesIO(response.content)) w, h = img.size # 按比例缩放公式 $ratio = \min\left(\frac{max\_size}{w}, \frac{max\_size}{h}\right)$ ratio = min(max_size/w, max_size/h) return img.resize((int(w*ratio), int(h*ratio))) # 3. 插入Excel wb = load_workbook('input.xlsx') ws = wb.active temp_files = [] for idx, url in enumerate(urls, start=2): try: # 下载处理图片 img = download_and_resize(url) img_path = f'temp_{idx}.png' img.save(img_path) temp_files.append(img_path) # 设置单元格尺寸 col_letter = get_column_letter(2) # B列 ws.column_dimensions[col_letter].width = 30 ws.row_dimensions[idx].height = 150 # 插入图片 excel_img = ExcelImage(img_path) excel_img.anchor = f'{col_letter}{idx}' ws.add_image(excel_img) except Exception as e: print(f"行 {idx} 处理失败: {str(e)}") # 保存并清理 wb.save('output.xlsx') for file in temp_files: os.remove(file) # 删除临时文件 ``` #### 关键说明 1. **尺寸控制原理** 使用公式 $$ratio = \min\left(\frac{max\_size}{w}, \frac{max\_size}{h}\right)$$ 保持图片宽高比缩放[^1] 2. **安装依赖**: ```bash pip install pandas pillow openpyxl requests ``` 3. **优化技巧**: - 通过`ws.row_dimensions`和`ws.column_dimensions`精确控制单元格尺寸 - 使用`ExcelImage.anchor`属性准确定位图片 - 自动清理生成的临时图片文件 #### 注意事项 1. **单元格防变形**:预先设置行高列宽,确保单元格尺寸匹配图片尺寸 2. **格式支持**:PIL库支持JPG/PNG/WEBP等主流格式,保存时修改文件后缀即可 3. **性能优化**:对于大量URL,建议添加`timeout`参数并启用多线程 ---
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值