'''Open_Excel是根据每个excel里的每个租客租金详情,生成房租信息send_info 以及对应的表格图片过程:Open_Excel(月份) 输入月份实例化get_send_info() 运行get_all_info    获取当月所有租户具体租金---get_excel_info(file) 打开每个excel获取所有房租信息 (运用了openpyxl)---month_info   存放 目的房租信息save_img()     将房租信息处理成图片,并把对应信息放入send_info   (运用了win32com)-循环所有租户:---change_sheet()   #根据不同住户 改变截图xlsx 里的 每个项目的金额---snapshot()#截图,保存---send_info 保存格式:{住户A:[租户名,合计租金,图片名称],住户B....}'''
class Open_Excel():'''打开当前文件夹所有xlsx文件'''def __init__(self,month):self.all_info=OrderedDict()# 每个住户对应其数据组成的dict,格式{住户A:{X月份:{电费:xx,合计:xx},y月份:....},住户B....}self.month=month  #tkinter上选择的月份#def file_list(self):'''获取当前文件夹内所有出租房的xlsx文件 组成list,(不是xlsx文件、截图文件、打开状态的excel文件)'''file_list=[]for file in os.listdir('.'):if os.path.splitext(file)[1]=='.xlsx' and file!='截图.xlsx' and '~$'not in file:file_list.append(file)return file_listdef get_excel_info(self, file):'''循环每个excel文件里的sheet,获取每个住户对应的所有租金详情'''wb = openpyxl.load_workbook(file,data_only=True) #打开excel,data_only取excel显示的值而不是公式# 循环每个sheetfor sheet in wb.worksheets:sheet_value =list(sheet.values)  # 当前sheet的所有valuekeys = sheet_value[0] # ['电表', '水表', '用电量', '用水量', '电费', '水费', '房租', '垃圾费', '其他', '合计']sheet_dict = {}  # 存放每个sheet里的数据,键为每个月# 循环每行(每个月)for month_value in sheet_value[1:]:if month_value[11] == None: continue  # 合计为空的跳过month_dict = {}  # 每个月里的每一项组成的dict# 循环每个项目,放进每个月的数据dictfor i in range(len(month_value)):key=keys[i]value = month_value[i]  # 每个项目里的数据month_dict[key] = valuethe_month = '%s-%s' % (month_value[0], month_value[1])sheet_dict[the_month] = month_dict  # 每个月对应的详细 租金the_zuhu = os.path.splitext(file)[0] + '-' + sheet.title  # 住户名由 房子名+房号self.all_info[the_zuhu] = sheet_dict  # 所有 住户 组成的dictwb.close()      # 关闭Excel文件,不保存del wb#删除工作簿gc.collect()#内存释放#def save_img(self,file,month_info,send_info):'''根据每个住户对应的租金,在截图xlsx文件修改数值,然后截图保存:param file: 截图.xlsx:param month_info: 所有住户此月的租金信息dict:param send_info: 全部住户的租金信息(用于微信发送):return:'''file_name = os.path.abspath(file)  # 把相对路径转成绝对路径pythoncom.CoInitialize()  # 开启多线程excel = DispatchEx('excel.application')# 创建Excel对象excel.visible = False         # 不显示Excelexcel.DisplayAlerts = 0     # 关闭系统警告(保存时不会弹出窗口)workbook = excel.workbooks.Open(file_name)# 打开截图.xlsxwSheet = workbook.worksheets['截图']# 循环每个住户的数据,根据 所选月份,得到具体数据,然后再截图xlxs上改变数字,截图保存,添加到send_infofor the_zuhu,the_month_data in month_info.items():#该住户此月的租金信息不为空if type(the_month_data)!=int:img_name = self.month + ':' + the_zuhu  #该住户此月的截图名self.change_sheet(wSheet, the_month_data)   #根据不同住户 改变截图xlsx 里的 每个项目的金额self.snapshot(excel, wSheet, img_name)#截图,保存send_info[the_zuhu] = [the_month_data['租户'],the_month_data['合计'], img_name + '.png'] #格式:{住户A:[租户名,合计租金,图片名称],住户B....}else:send_info[the_zuhu]=0workbook.Close(False)  # 关闭Excel文件,不保存excel.Quit()  # 退出Excelpythoncom.CoUninitialize()  # 关闭多线程def change_sheet(self,sheet,data):'''根据不同住户 改变截图xlsx  每个项目的金额'''the_key = data.keys()  # [月份、租户,'电表', '水表', '用电量', '用水量', '电费', '水费', '房租', '垃圾费', '其他', '合计']all_range = itertools.chain(sheet.usedrange)  # 合并所有单元格元素# 循环所有单元格,如果是电费、水费等项目,就修改其对应的单元格数值for one in all_range:if one.value in the_key:one.offset(1, 2).value = data[one.value]def snapshot(self,excel,sheet,img_name):''':param excel: win32 的excel对象:param sheet: 截图sheet:param img_name: 月份+住户:return:'''# 选定截图区域,保存img文件sheet.UsedRange.CopyPicture()  # 复制有内容的单元格区域sheet.Paste()  # 粘贴excel.Selection.ShapeRange.Name = img_name  # 将刚刚选择的Shape重命名,避免与已有图片混淆sheet.Shapes(img_name).Copy()  # 选择图片img = ImageGrab.grabclipboard()  # 获取剪贴板的图片数据img.save(img_name + ".png")def get_all_info(self,):'''获取所有住户的全部租金信息,放到self.all_info根据选取的月份,筛选后添加到month_info返回'''#循环当前文件夹的所有excel文件,获取每个住户对应的所有具体租金,存放到self.all_infofor file in self.file_list():self.get_excel_info(file)month_info=OrderedDict()#循环所有住户、所有月份的 dictfor the_zuhu,sheet_dict in self.all_info.items():the_month_data=sheet_dict.get(self.month)    #提取tk上所选月份 的具体租金dict#该住户有此月份的 租金信息,那么就添加到 month_info,否则为0if the_month_data:the_month_data['月份']=self.monthmonth_info[the_zuhu]=the_month_dataelse:month_info[the_zuhu] = 0return month_infodef get_send_info(self):time1=time.time()month_info=self.get_all_info()  #获取所有 租户 所选月份对应的所有具体租金print(time.time()-time1) #1.443082571029663send_info = OrderedDict()  # 在微信发送的dict,格式:{住户A:[租户名,合计租金,图片名称],住户B....}time1 = time.time()self.save_img('截图.xlsx', month_info,send_info) #将房租信息处理成图片,并把对应信息放入send_infoprint(time.time() - time1) #3.7622151374816895print(send_info)return send_info

生成的每个租客房租信息截图:

获取excel内容以及生成截取图片部分我已经写得很详尽了,相信大家能看得懂,后面tkinter部分才头疼呢 

python tkinter编写界面,使用win32com操作excel获取数据生成截图后,wxpy登录微信,给租客发送房租(二)相关推荐

  1. python tkinter编写界面,使用win32com操作excel获取数据生成截图后,wxpy登录微信,给租客发送房租(三)

    tkinter界面: 这部分很大坨,不过跟上部分一样,代码里备注得很完整了,慢慢消化就能看得懂了!! 操作步骤: 运行程序后, 1.先点击"获取房租信息"按钮,所有租客该月的房租信 ...

  2. python tkinter编写界面,使用win32com操作excel获取数据生成截图后,wxpy登录微信,给租客发送房租(一)

    家里有几个单间出租,可是每到月头收房租就是件麻烦事,挨个挨个去收,对方有时候不在,或者说还没出粮,过几天再给,又或者没到时间,太麻烦了,而且还得写收据,学了python这么久,自己来写个GUI,用ex ...

  3. python自动化表格截图_python自动化操作——excel刷新数据并截图发送微信

    1 importos2 importwin32gui, win32api, win32con, win32com3 from win32com.client importDispatch4 from ...

  4. python自动化操作——excel刷新数据并截图发送微信

    我真的是服了,一堆复制党到处粘贴,也太肆无忌惮了吧,麻烦尊尊下版权好吗,好歹这也是我辛辛苦苦写出来的......   原封不动的抄,错了的也不知道.真的是搞笑!   1 import os2 impo ...

  5. python win32com 操作excel (tcy)

    本篇主要讲述win32com操作excel的读写的基本语法及用途实例. 并在easyExcel类的基础上封装了一个简单的excel VBA python操作.(90%变更)特点: 1)能够多个工作薄多 ...

  6. 包无法安装_详细教程 | 安装Python编程环境以及使用OpenpyXl操作Excel

    详细教程 | 安装Python编程环境以及使用OpenpyXl操作Excel 注意:下列教程为 Windows7 64位:Windows 10有部分步骤有差异,请参考使用! 01 下载Python程序 ...

  7. python调用百度OCR识别证件+操作excel表格

    python调用百度OCR识别证件+操作excel表格 如果要操作文件的话最好让程序知道文件存不存在,因为做了GUI界面,报错不会直接弹出来,异常捕获就用得比较频繁 因为面向对象没学好,GUI是用工具 ...

  8. python界面不同按钮实现不同功能-python tkinter实现界面切换的示例代码

    跳转实现思路 主程序相当于桌子: import tkinter as tk root = tk.Tk() 而不同的Frame相当于不同的桌布: face1 = tk.Frame(root) face2 ...

  9. Python入门到实战(五)自动化办公、pandas操作Excel、数据可视化、绘制柱状图、操作Word、数据报表生成、pip install国内镜像下载

    Python入门到实战(五)conda使用.pandas操作Excel.数据可视化.绘制柱状图.操作Word.数据报表生成.pip install国内镜像下载 conda使用 常用操作 配置VS+Co ...

最新文章

  1. 关于网站下拉导航的设置
  2. 12月份最后一期天下足球
  3. 周赛 Hd2270+总结改进
  4. 【万字长文】创业公司就应该技术选型 Spring Cloud Alibaba , 开箱即用
  5. Fei Labs:FIP-5提案已通过
  6. wsimport命令讲解
  7. 服务器端配置nodejs环境(使用pm2进程管理运行)
  8. 帆软删除行操作提示并确认 js:FR.Msg.confirm
  9. Struts2.0 + Spring2.5 + Hibernate3.3开发环境的配置(1)
  10. 如何开发一个App(Android),Android开发技巧
  11. 学会可视化大屏布局技巧,让领导都赞不绝口
  12. 华硕主板如何设置开机自启_教你华硕主板bios怎么设置硬盘启动
  13. 霍金实在论中的实践论
  14. Ubuntu Server 18.04配置无线Wifi网卡
  15. Layim 聊天功能
  16. 19.React Native动画Animated效果三种动画类型二;
  17. 【C++】栈的应用:逆波兰式的实现
  18. testlink mysql配置_testlink安装及配置
  19. 柠檬桉叶油和deet_驱蚊液评测 | 这种驱蚊液宝宝慎用,毒性太大!
  20. 2017 云+未来峰会——上海站开发者专场即将开讲(30元电话充值卡等你拿)

热门文章

  1. 使用多张图片做帧动画的性能优化
  2. 设置Linux服务器登录密码过期时长
  3. 远程控制电脑会不会泄露隐私
  4. Navigation框架介绍
  5. GeoServer + openlayers
  6. 开关电源学习——基本元件之电容
  7. 【AE模板】扁平化MG动画卡通人物解说角色场景元素包
  8. 关于数据库中FK的简单理解以及应用
  9. 计算机配置高低怎么看,怎么看电脑配置高低
  10. 【网络工程师】<软考中级>局域网与城域网