会python的哥们给我看一段程序
- 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() - Tobar我艹,第一次知道,python竟然是靠缩进来关闭代码块的
牛逼,和yml一个鸟德行,瞎眼程序员的噩梦 - lvcha你自己加点print不行么?
- lydeimg = ImageGrab.grabclipboard() 这句应该是从剪贴板获取图像,我的问题应该是剪贴板没有更新?
反正移动图像都成功了,保存也都保存成了不同的图像名,但是图像都是第一张。 - dirlee用excel 自己vba不行么 , python的excel 解析库成不成熟?
- somesunpython代码你在编辑器截个图把
这样子没法看
python就靠缩进的 - zenodante直接pandas写处理脚本matplotlib作图多好 为何要用往excel里倒数据作图再copy出图这么扭曲的方法
- asj你需要把后面多张的代码贴出来。
所谓bug就是你以为正常工作的代码其实不工作。
所以少贴一段“只是换了xxx”但又不工作的代码,只能确保别人看不到问题在哪?
从你贴出来的代码里,觉得有怀疑的地方是
ws.Shapes('Picture 1').Copy()
这个Picture 1是excel自动命名的吗?多sheet时名字你是怎么确定的? - lyde我打算是做好excel,然后直接生成分析报告,图表插入word,转成图片好插一点。
- lyderoot_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,只是名字不一样。
我第二张图移动复制到剪贴板明明是第二段坐标的了啊。 - aaafffei楼主错误代码是啥
- asj你把那两句copy去掉是什么效果?
- lyde运行完美,没有错误,我怀疑是剪贴板没有清空?
- lydecopy去掉就是img获得不了数据,就存不了图片文件。
不过我在网上又找了一段代码,是不断循环开关excel文件进行考图,虽然可以用,但是太粗暴了。 - VEVAN写入图片后加个time.sleep(10)试试。。。
- asj原因可能是改excel.Selection.ShapeRange.Name
这里。首先没看到有selection改变的操作,另外ShapeRange的名字未必等于里面shape的名字。
可以试试这两句去掉。是否还是存出同一张图。
另一个思路是,如果文件里不存在其它图片,可以在所有图片贴完后,循环shapes里所有的图形,copy,转存 - 无心而死+1
LZ就用这个吧,重写一段比找BUG快 - lyde我要用excel过度,我实际上有几十个excel文件。。。
- para那么大括号后面换不换行?
- Lucifer6E我都是直接用Excel做报表的
- Lucifer6E你的问题就在这句
excel.Selection.ShapeRange.Name = new_shape_name
你的selection从来没变过
Range.Copy不会改变Selection - clockworkjian隔行如隔山啊。。。。。
- lyde是这样的,我即使第二段把selection也考在同一个位置,截出来也是一样。
这两段代码单独执行都正常。
这个只是把当前选区改名而已。new_shape_name 我重命名了1、2、3这些。 - lydeexcel直接生成word吗?我们是需要word文件的报告,数据和图表用excel。
这个问题我用另外一段代码解决了。
还有个把excel改成zip解出来直接可以拷出图片。
这段代码我自己也不是太清楚,就放弃算了。