openpyxl 保存文档后格式图片丢失

问题和背景:
当前使用openpyxl对excel进行操作,文件后缀是xlsx。具体是将excel1的数据插入到excel2的数据中,当插入完成后保存excel2后发现excel2文件中没有操作过的数据格式发生了变化,同时原来的图片也没有保存下来,请问openpyxl是无法完成这个动作么,有没有其他的python库可以实现这个功能。谢谢。

img

引用 皆我百晓生 小程序回复内容作答:
openpyxl库是用来操作Excel文件的,它不支持保存图片。如果你想要保留图片或者其他格式的信息,可以考虑使用其他的Python库,例如xlwings、pywin32等。

使用xlwings库可以在Excel中直接操作数据和格式,包括插入图片。下面是一个简单的示例代码:

import xlwings as xw

# 打开Excel文件
wb1 = xw.Book('excel1.xlsx')
wb2 = xw.Book('excel2.xlsx')

# 获取Sheet对象
sheet1 = wb1.sheets['Sheet1']
sheet2 = wb2.sheets['Sheet2']

# 将数据从excel1复制到excel2
rng1 = sheet1.range('A1:C10')
rng2 = sheet2.range('A1')
rng2.options(index=False).value = rng1.value

# 将图片从excel1复制到excel2
pic1 = sheet1.pictures[0]
pic1.api.CopyPicture()
sheet2.paste(rng2)

# 保存并关闭Excel文件
wb2.save()
wb2.close()
wb1.close()

在这个示例中,我们使用xlwings库打开excel1.xlsx和excel2.xlsx文件,并且获取到Sheet1和Sheet2的对象。然后,我们将数据从excel1复制到excel2,并且将图片从excel1复制到excel2。最后,保存并关闭excel2文件。

希望这个示例能够帮助到你。

【以下回答由 GPT 生成】

首先,openpyxl库本身是不支持保存Excel中的图片的,所以当使用openpyxl保存Excel时,图片会丢失。然而,我们可以借助于其他的Python库来保存Excel中的图片。

解决方案如下: 1. 使用openpyxl库读取Excel1中的数据和图片。 2. 使用openpyxl库将Excel1中的数据插入到Excel2的数据中。 3. 使用openpyxl库保存Excel2的数据。 4. 使用Pillow库将Excel1中的图片保存到Excel2中。

下面是具体的代码实现:

from openpyxl import Workbook, load_workbook
from openpyxl.drawing.image import Image
from PIL import Image as PILImage

# 加载Excel1
wb1 = load_workbook("Excel1.xlsx")
ws1 = wb1.active

# 加载Excel2
wb2 = load_workbook("Excel2.xlsx")
ws2 = wb2.active

# 将Excel1中的数据插入到Excel2中
for row in ws1.iter_rows():
    for cell in row:
        ws2[cell.coordinate].value = cell.value

# 保存Excel2
wb2.save("Excel2.xlsx")

# 保存Excel1中的图片到Excel2
for img in ws1._images:
    img_data = img.image
    img_path = img.path

    # 加载图片
    pil_img = PILImage.open(img_path)

    # 将图片保存到Excel2
    img = Image(img_data)
    ws2.add_image(img)

# 保存包含图片的Excel2
wb2.save("Excel2_with_images.xlsx")

注意:上述代码使用了openpyxl和Pillow库,请确保已经安装了它们。

这样,我们就可以通过上述代码将Excel1中的数据插入到Excel2中,并且保留了Excel1中的图片。最终保存的Excel2_with_images.xlsx中将包含数据和图片。

希望能够帮助到你,如果还有其他问题,请随时提问。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^