You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

从Excel图片URL获取图片并插入Word/PDF表格的技术实现求助

解决python-docx插入网络图片失败问题 & 完整实现Excel图片URL转Word/PDF表格

你碰到的问题根源在于:python-docxadd_picture()方法需要的是支持随机访问(具备seek()方法)的类文件对象,但urllib.request.urlopen()返回的HTTPResponse是流式对象,只能单向读取,不满足要求。下面是完整的解决方案,覆盖从Excel读取数据、插入网络图片到Word表格,再导出为PDF的全流程:

一、核心修复思路

把网络图片的二进制内容读取到io.BytesIO内存对象中,这个对象模拟了文件的随机访问特性,能被add_picture()正确识别。

二、完整可运行代码

import pandas as pd
import urllib.request
from io import BytesIO
from docx import Document
from docx.shared import Inches
from docx.enum.table import WD_ALIGN_VERTICAL

# 1. 读取Excel数据源
df = pd.read_excel('data.xlsx')

# 2. 初始化Word文档并创建表格
doc = Document()
doc.add_heading('图片URL映射表格', level=1)

# 创建3列表格:ID、URL1对应图片、URL2对应图片
table = doc.add_table(rows=1, cols=3)
table.style = 'Table Grid'  # 启用网格线样式

# 设置表头
header_cells = table.rows[0].cells
header_cells[0].text = 'ID'
header_cells[1].text = 'URL1 图片'
header_cells[2].text = 'URL2 图片'

# 3. 遍历每行数据,填充表格
for _, row in df.iterrows():
    current_row = table.add_row().cells
    
    # 填充ID列,设置垂直居中
    current_row[0].text = str(row['id'])
    current_row[0].vertical_alignment = WD_ALIGN_VERTICAL.CENTER
    
    # 处理URL1图片
    try:
        # 读取网络图片到BytesIO
        with urllib.request.urlopen(row['url1']) as resp:
            img_bytes = resp.read()
            img_stream = BytesIO(img_bytes)
            # 在单元格中插入图片,设置宽度为2英寸(可自定义)
            run = current_row[1].paragraphs[0].add_run()
            run.add_picture(img_stream, width=Inches(2))
            current_row[1].vertical_alignment = WD_ALIGN_VERTICAL.CENTER
    except Exception as e:
        # 加载失败时显示错误信息
        current_row[1].text = f'加载失败: {str(e)}'
    
    # 处理URL2图片,逻辑同URL1
    try:
        with urllib.request.urlopen(row['url2']) as resp:
            img_bytes = resp.read()
            img_stream = BytesIO(img_bytes)
            run = current_row[2].paragraphs[0].add_run()
            run.add_picture(img_stream, width=Inches(2))
            current_row[2].vertical_alignment = WD_ALIGN_VERTICAL.CENTER
    except Exception as e:
        current_row[2].text = f'加载失败: {str(e)}'

# 4. 保存Word文档
doc.save('图片映射表格.docx')

# 5. 可选:将Word转为PDF(需先安装docx2pdf)
# 安装命令:pip install docx2pdf
from docx2pdf import convert
convert('图片映射表格.docx', '图片映射表格.pdf')

三、关键细节说明

  • BytesIO的作用:把网络图片的二进制数据临时存放在内存中,模拟本地文件的行为,完美适配add_picture()的要求。
  • 异常处理:添加try-except块避免单个图片加载失败导致程序崩溃,同时直观显示错误原因。
  • 表格美化:设置了网格样式和单元格垂直居中,让生成的表格更规整。
  • PDF转换注意事项docx2pdf在Windows上依赖Microsoft Office,Linux/macOS需要安装LibreOffice才能正常工作。

四、特殊场景处理(HTTPS证书问题)

如果遇到HTTPS URL因证书验证失败无法访问,可以临时关闭证书验证(仅测试环境使用,生产环境建议配置合法证书):

import ssl
ssl._create_default_https_context = ssl._create_unverified_context

内容的提问来源于stack exchange,提问作者Chan

火山引擎 最新活动