python读取excel图片
原理都是通过rar模式获取excel的资源文件,如:
将“奥圣2021-04-10((1).xls” 重命名为“奥圣2021-04-10((1).rar”
图片目录都在\media下
图片和excel行的对应关系是 drawing1.xml,总的来说 如果这个excel文件的数据不是 那么规范的话,处理还是有点麻烦的
用IE浏览器打开drawing1.xml
那么接下来的问题就是 读取这个xml,并找到对应关系,进行相应的重命名或存储了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | #excel变成压缩包后,图片是在media目录下面,但文件名是顺序递增的序号 #其中 <a:blip r:embed="rId52"/> 节点对应图片序号 #<xdr:cNvPr descr="机滤AO62121" name="Picture 251" id="3784784"/> 对应图片描述 #<xdr:row>141</xdr:row> 对应excel行号 def zipXmlRead(zipfile_path,image_path): dir_path = os.path.dirname(zipfile_path) # 获取文件所在目录 file_name = os.path.basename(zipfile_path) # 获取文件名 unzip_dir = os.path.join(dir_path, str (file_name.split( '.' )[ 0 ])) xml_name = 'xl' + os.sep + 'drawing1' + os.sep + 'drawing1.xml' # excel变成压缩包后,再解压,drawing1对应就是sheet1的说明 xml_name = 'xl/drawings/drawing1.xml' ns = { 'i' : 'http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing' , 'a' : 'http://schemas.openxmlformats.org/drawingml/2006/main' , 'r' : 'http://schemas.openxmlformats.org/drawingml/2006/relationships' } fz = zipfile.ZipFile(zipfile_path, 'r' ) xml_string = fz.read(xml_name).decode() xml = ET.fromstring(xml_string) nodes = xml.findall( './/i:from/i:row' , ns) #test:找行号 for node in nodes: #print(node) 测试 continue nodes = xml.findall( ".//i:pic/i:blipFill/a:blip" ,ns) #test:找图片节点 for node in nodes: #print(node.attrib) 测试 continue nodes = xml.findall( './/i:twoCellAnchor' ,ns) #找到父节点,再遍历子节点 for node in nodes: row = node.find( './/i:from/i:row' , ns) #获取行号 rowNum = row.text descr = '' descrNode = node.find( './/i:nvPicPr/i:cNvPr' ,ns) #获取描述 if 'descr' in descrNode.attrib: descr = descrNode.attrib[ 'descr' ] rid = node.find( './/i:blipFill/a:blip' ,ns).attrib[ '{http://schemas.openxmlformats.org/officeDocument/2006/relationships}embed' ] #获取图片资源序号 print ( '行号:' + str (rowNum) + ' 描述:' + descr + ' 图片顺序:' + rid) imgId = str (rid).replace( 'rId' ,'') # proCode = MSSQL().getCodeById( int (rowNum)) picName = rowNum + '.png' newPicName = str (proCode) try : os.rename(image_path + '\\image' + picName,image_path + '\\'+newPicName+' .png') except IOError as e: print (e) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)