会python的哥们给我看一段程序

  • l
    lyde
    我的需求是从Excel里把图表截图,并导出图片。
    程序可以实现截一个图表并导出一张图,但是多张的话,也一直截到第一张,谁帮我解决下问题。
    截一张的代码如下,截多张我就是把坐标换一下。
    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()
  • T
    Tobar
    我艹,第一次知道,python竟然是靠缩进来关闭代码块的

    牛逼,和yml一个鸟德行,瞎眼程序员的噩梦
  • l
    lvcha
    你自己加点print不行么?
  • l
    lyde
    img = ImageGrab.grabclipboard() 这句应该是从剪贴板获取图像,我的问题应该是剪贴板没有更新?
    反正移动图像都成功了,保存也都保存成了不同的图像名,但是图像都是第一张。
  • d
    dirlee
    用excel 自己vba不行么 , python的excel 解析库成不成熟?
  • s
    somesun
    python代码你在编辑器截个图把

    这样子没法看

    python就靠缩进的
  • z
    zenodante
    直接pandas写处理脚本matplotlib作图多好 为何要用往excel里倒数据作图再copy出图这么扭曲的方法
  • a
    asj
    你需要把后面多张的代码贴出来。
    所谓bug就是你以为正常工作的代码其实不工作。
    所以少贴一段“只是换了xxx”但又不工作的代码,只能确保别人看不到问题在哪?
    从你贴出来的代码里,觉得有怀疑的地方是
    ws.Shapes('Picture 1').Copy()
    这个Picture 1是excel自动命名的吗?多sheet时名字你是怎么确定的?
  • l
    lyde
    我打算是做好excel,然后直接生成分析报告,图表插入word,转成图片好插一点。
  • l
    lyde
    root_path = root
    excel = win32.Dispatch('Excel.Application')
    wb = excel.Workbooks.Open(root_path+r'\报表.xlsx')
    ws = wb.Worksheets('Sheet4')
    ws.Range('D1:N21').CopyPicture()
    ws.Paste(ws.Range('P1'))
    new_shape_name = '1'
    excel.Selection.ShapeRange.Name = new_shape_name
    ws.Shapes(new_shape_name).Copy()
    img = ImageGrab.grabclipboard()
    img.save(root_path+r'\\' + new_shape_name + '.png')
    ws.Range('D23:N43').CopyPicture()
    ws.Paste(ws.Range('P23'))
    new_shape_name = '2'
    excel.Selection.ShapeRange.Name = new_shape_name
    ws.Shapes(new_shape_name).Copy()
    img = ImageGrab.grabclipboard()
    img.save(root_path+r'\\' + new_shape_name + '.png')

    这样就会生成1.png和2.png
    但是两张图其实都是1.png,只是名字不一样。
    我第二张图移动复制到剪贴板明明是第二段坐标的了啊。
  • a
    aaafffei
    楼主错误代码是啥
  • a
    asj
    你把那两句copy去掉是什么效果?
  • l
    lyde
    运行完美,没有错误,我怀疑是剪贴板没有清空?
  • l
    lyde
    copy去掉就是img获得不了数据,就存不了图片文件。

    不过我在网上又找了一段代码,是不断循环开关excel文件进行考图,虽然可以用,但是太粗暴了。
  • V
    VEVAN
    写入图片后加个time.sleep(10)试试。。。
  • a
    asj
    原因可能是改excel.Selection.ShapeRange.Name
    这里。首先没看到有selection改变的操作,另外ShapeRange的名字未必等于里面shape的名字。
    可以试试这两句去掉。是否还是存出同一张图。
    另一个思路是,如果文件里不存在其它图片,可以在所有图片贴完后,循环shapes里所有的图形,copy,转存
  • 无心而死
    +1
    LZ就用这个吧,重写一段比找BUG快
  • l
    lyde
    我要用excel过度,我实际上有几十个excel文件。。。
  • p
    para
    那么大括号后面换不换行?
  • L
    Lucifer6E
    我都是直接用Excel做报表的
  • L
    Lucifer6E
    你的问题就在这句
    excel.Selection.ShapeRange.Name = new_shape_name
    你的selection从来没变过
    Range.Copy不会改变Selection
  • c
    clockworkjian
    隔行如隔山啊。。。。。
  • l
    lyde
    是这样的,我即使第二段把selection也考在同一个位置,截出来也是一样。
    这两段代码单独执行都正常。
    这个只是把当前选区改名而已。new_shape_name 我重命名了1、2、3这些。
  • l
    lyde
    excel直接生成word吗?我们是需要word文件的报告,数据和图表用excel。
    这个问题我用另外一段代码解决了。
    还有个把excel改成zip解出来直接可以拷出图片。
    这段代码我自己也不是太清楚,就放弃算了。