从Excel图片URL获取图片并插入Word/PDF表格的技术实现求助
解决python-docx插入网络图片失败问题 & 完整实现Excel图片URL转Word/PDF表格
你碰到的问题根源在于:python-docx的add_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




