• 周报数据采集之生存图片(execl方法)


    https://blog.csdn.net/Luzaofa/article/details/81675364

    Python之Excel chart另存为图片
    大家好,好久没有更新博客了,这一段时间有点忙,公司接触到了大量的excel文件处理,现将自己在工作中积累的经验分享大家,供大家参考学习。
    业务说明:这段时间我主要做的工作有:
    解析excel,将目标字段写入数据库(涉及加密、html转excel文件);
    数据库获取数据,写入excel,绘制图片,将图片另存为;
    将生成的图片和计算出的其他数据字段填补到word模板,形成报告文档;
    需求一:解析excel,将目标字段写入数据库(涉及加密、html转excel文件)大家可以参考我以前的博客,里面有详细的说明介绍
    接下来我将主要为大家介绍业务需求二,如何将数据写入excel,然后复制图片,将图片另存为;因为实际业务需求,找了好多资料博客,最终才算找到了一个好的解决办法,相信学习中的你也可能会遇到我这样的问题,当你遇到问题时,希望我的小分享对你有所帮助。
    逻辑实现过程:
    第一步:(新建一个data.xlsx文件,插入图片,作为我们的模板文件,数据字段如图)


    第二步:将B2到B8单元格数据更改为【20,30,20,30,40,50,35】,可根据自己需求随意更改。
    第三步:将D1:I12区域复制为图片,将图片移动到K1,效果如下:


    第四步:图片直接另存为


    第五步:将文件另存为copy.xlsx,文件夹数据


    完整代码:(第一版)
    import win32com.client as win32 # 打开excel文件
    from PIL import ImageGrab   #用于获取复制的图片

    root_path = "XXX"

    excel = win32.Dispatch('Excel.Application') #获取Excel
    wb = excel.Workbooks.Open(root_path+'data.xlsx') # 打开excel文件
    ws = wb.Worksheets('Sheet1')        # 获取Sheet1

    score = [20,30,20,30,40,50,35]      # 需要写入excel的成绩数据
    # 遍历excel将数据写入单元格
    for i in range(2, len(score)+2):
        Range = 'B' + str(i)    # B2到B8单元格
        ws.Range(Range).Value = score[i-2]  # 写入值
    ws.Range('D1:I12').CopyPicture()    # 复制D1:I12图片区域
    ws.Paste(ws.Range('K1'))    # 将图片移动到K1
    ws.Shapes('Picture 1').Copy()    # 复制移动的图片Picture 1
    img = ImageGrab.grabclipboard()  # 获取图片数据
    img.save(root_path+'Picture 1.png') # 图片另存为

    wb.SaveAs(root_path+'copy.xlsx') # excel文件另存为copy.xlsx
    wb.Close()

    特别说明:代码运行到ws.Shapes(‘Picture 1’).Copy()时可能会报未找到定义的图片错误,我一开始想着通过方法函数更改我们复制后的图片名称,然后再复制图片,但经过一番挣扎没有找到合适的方法,若有大神知道,留言告知,感激不尽。
    但最终有一个解决窍门仅供参考,我们先注释掉如下几句代码
    ws.Shapes('Picture 1').Copy()    # 复制移动的图片Picture 1
    img = ImageGrab.grabclipboard()  # 获取图片数据
    img.save(root_path+'Picture 1.png') # 图片另存为
    接下来运行代码,运行成功后将会成功生成一个copy.xlsx文件,我们双击打开文件,鼠标点击我们复制成功的图片,左上角将会显示我们生成图片的名称即:Picture 1;名称不同的版本可能会不一样,所以在遇到错误时,可以根据此过程操作,更改图片名称即可。


    完整代码:(终极版)
    完善复制图片bug,只需将我们选中的区域重命名即可(感谢@vhills分享)
    import win32com.client as win32 # 打开excel文件
    from PIL import ImageGrab   #用于获取复制的图片

    root_path = "D:\Luzaofa_Class\"

    excel = win32.Dispatch('Excel.Application') #获取Excel
    wb = excel.Workbooks.Open(root_path+'data.xlsx') # 打开excel文件
    ws = wb.Worksheets('Sheet1')        # 获取Sheet1

    score = [20,30,20,30,40,50,35]      # 需要写入excel的成绩数据
    # 遍历excel将数据写入单元格
    for i in range(2, len(score)+2):
        Range = 'B' + str(i)    # B2到B8单元格
        ws.Range(Range).Value = score[i-2]  # 写入值
    ws.Range('D1:I12').CopyPicture()    # 复制D1:I12图片区域
    ws.Paste(ws.Range('K1'))    # 将图片移动到K1

    new_shape_name = 'luzaofa'
    ***excel.Selection.ShapeRange.Name = new_shape_name***    # 选择区域重命名

    ws.Shapes(new_shape_name).Copy()    # 复制移动的图片Picture 1
    img = ImageGrab.grabclipboard()  # 获取图片数据
    img.save(root_path + new_shape_name + '.png') # 图片另存为

    wb.SaveAs(root_path + 'copy.xlsx') # excel文件另存为copy.xlsx
    wb.Close()


    作者:Luzaofa
    来源:CSDN
    原文:https://blog.csdn.net/Luzaofa/article/details/81675364

  • 相关阅读:
    面条代码 vs. 馄沌代码
    GraphQL 到底怎么用?看看这个例子就知道了
    程序员难逃二八法则,如何晋升为头部 20% 玩家?
    正则匹配负正数和负小数
    js、Jquery处理自动计算的输入框事件
    mobile easyui兼容实体数据(tree插件为例)
    framework7中一行的字如果过多就省略号显示的CSS写法
    PHP获取系统时间不对的解决办法(转载)
    BZOJ 3156: 防御准备
    P4098 [HEOI2013]ALO
  • 原文地址:https://www.cnblogs.com/luo30zhao/p/10558292.html
Copyright © 2020-2023  润新知