设为首页 收藏本站
查看: 787|回复: 0

[经验分享] Python 操作 EXCEL 2(ZT)

[复制链接]

尚未签到

发表于 2017-4-27 07:02:42 | 显示全部楼层 |阅读模式
17:22http://www.cnblogs.com/Jedimaster/archive/2007/02/28/660209.html
朋友的家人做生意,每日从各地分店处收集报表,然后回去汇总。由于不想用那种复杂的管理软件,就叫他写一个小工具。于是他找到了我,让我想想办法。

  Python是个令人惊奇的工具,而不仅仅是一种语言。对比老牌的Perl,看似Python不是那么的精通 —— 对比Perl超快的文本处理速度和广泛应用于Cgi程序的编写历史,以及目前大红大紫的Ruby在Web开发上的病毒式蔓延,而比起静态语言比如C\C++,虚拟机Java和C#来说,速度又成了问题。但是Python的实力可不容小视,NASA都用Python可不是吹的,况且,Python的学习难度比Perl小多了,刚学时让我找到了以前QBASIC的感觉。
  
  此程序具体要求如下:每日产生副表若干(如副表文件)。程序先核对附表的日期和销售点。如果销售点不同日期相同,便把不同副表的相同产品号的 “销售数量”栏相加,填入总表“销售数量”栏。将副表的“总利润”栏相加填入总表的“总利润”栏。其他副表信息复制到总表(备注除外,由用户自行处理)。表头的样式如下:



  啊哈,很简单的表头。其中需要操作的是“销售数量”和“总利润”,也就是把相同时间的报表相加。但是这样有个严重问题!

必须要求,相同报表的产品名称、货号的顺序不能出错,各地要绝对统一,否则全部这样照样拷贝就会出错!

  让我们分析一下思路:时间是关键。时间决定了哪些报表需要分门别类,生成哪一天的统计总表。数据结构上,用什么呢?简单的list?不行,我尝试过。应该使用map容器,把日期作为key,储存的Value是个列表。程序先扫描所有的Excel文件获取日期,然后把相同日期报表的COM文档接口储存起来,实现了分门别类。最后遍历这个map容器,计算,生成每日的统计总表。代码如下,经过测试正常。


1import os;
2import sys;
3import time;
4import datetime;
5#请先安装对应着你自己的Python版本的PythonWin32
6import win32com.client;
7
8
9mapper = {};
10
11app = win32com.client.Dispatch("Excel.Application");
12PipeOut = os.popen("dir *.xls /B");
13FileList = PipeOut.readlines();
14PipeOut = os.popen("cd");
15CurDic = PipeOut.readline();
16CurDic = CurDic[:-1] + "\\";#去处末尾的\n
17print "当前工作目录为"+CurDic;
18
19    #读取每个文件的时间和储存相应的COM接口
20
21for filename in FileList:
22     filename = CurDic+filename[:-1];
23    print filename;
24     Doc = app.Workbooks.Open(filename);
25     Sheet = Doc.Sheets(1);
26     Time = Sheet.Cells(2,5);
27    print type(Time);
28     TimeKey = str(Time);
29    print TimeKey;
30    if mapper.has_key(TimeKey):
31         mapper[TimeKey].append(Sheet);
32    else :
33         mapper[TimeKey] = [];
34         mapper[TimeKey].append(Sheet);
35    #print mapper;
36
37
38    #生成新的统计总表
39   
40    #开始处理mapper 每次从一个自表中读取2x20个数据,然后和总表相加
41print "-------------------------------------";
42Protetype = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
43a = 0;
44b = 0;
45c = 0;
46
47for k,v in mapper.items():
48    print "//////////////////////////////////"
49     a+=1;
50     Count = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
51     Benefit = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
52     Name = [u"",u"",u"",u"",u"",u"",u"",u"",u"",u"",u"",u"",u"",u"",u"",u"",u"",u"",u"",u""];
53    #print Count;
54    #print Benefit;
55        #Total = app.Workbooks.Open(CurDic+"Template\\TotalTemplate.xls");
56    print "How manu Sheets in this List ? ",len(v);
57    for sht in v:
58         b+=1;
59         _Count = sht.Range("C4:C23").Value;
60         _Benefit = sht.Range("F4:F23").Value;
61         _Name = sht.Range("B4:B23").Value;
62        #print _Count;
63        #print _Benefit;
64        assert(len(_Count) == len(_Benefit));
65        for i in range(0,len(_Count)):
66             c+=1;
67             Count = _Count[0] + Count;
68             Benefit = _Benefit[0] + Benefit;
69             Name = _Name[0];
70        #以上作为储存总表项的数据
71     Total = app.Workbooks.Open(CurDic+"Template\\TotalTemplate.xls");
72     TotalSheet = Total.Sheets(1);
73     _Time = k[:k.find(" ")];
74     _Time = _Time.replace("/","-");
75    print _Time;
76    print Count;
77    print Benefit;
78        #TotalSheet.Cells(2,2).Value = _Time;
79    for i in range(0,len(Count)):
80         TotalSheet.Cells(4+i,3).Value = Count;#填充数量
81         TotalSheet.Cells(4+i,6).Value = Benefit;#填充利润
82         TotalSheet.Cells(4+i,2).Value = Name;#填充货物名称
83
84    #保存总表
85     Total.SaveAs(CurDic+_Time+"统计总表.xls");
86    del Count,Benefit;
87print "++++++++++++++++++++++++++++"
88print a,b,c;
89app.Quit();
90app = None;
91
  使用方法,先安装Python 2.4和PythonWin For 2.4。然后把这个脚本拷贝到分表的文件夹下,然后运行(调试),自动生成与日期相关的总表。效果图如下:

最终解决思路的提示:其实这种方法只能在规模比较小的时候,因为这种脱离于总系统的处理效率实在非常低,而且Excel二进制文件,空表的占用就达15k,在未来有大量业务数据处理的话将是无法忍受的噩梦。所以,我建议这位商务人士分析一下他所使用的处理系统,用便宜的网络线路构建从各地中心服务器系统,使用XML作为数据交换得媒介,在自己的服务器上您只需要使用简单的SQL处理过程就可以了,而且数据的可靠度比平面Excel文档高得多。

数据在这里下载,为了保险起见请不要使用中文的文件夹目录。



**************************************************************************************************



如何使用python取得excel的数据呢?
这两天看了点python,这两天不怎么忙突然想如果用python来读取会如何?(这些天一直使用java来读取excel),多说那就是浪费时间了,废话少说,始めましょう:#导入该模块import win32com.client#指定是应用程序是Excel.Application并得到cel.Application")对象
xlsApp = win32com.client.Dispatch("Excel.Application")#得到Workbooks
xlsBook   = xlsApp.Workbooks.Open("c:\\test\\a.xls")#得到SheetName的Sheet对象
xlsSheet = xlsBook.Sheets("SheetName")#得到有数据的行,这里要注意UsedRange的使用,不使用它也可以但是你会得到所有的整个sheet的单元格了,不是我们需要的。#这里浪费了我很多时间,由于此前我并没写过类似宏的东东。rs = xlsSheet.UsedRange.Rows#最后当然类似读数组那样把它读取出来,具体如何使用我想就看个人什么用途以及喜好了。这里只是打印出来看看for r in rs:      print r打印内容类似如下((1.0, u'20040207', u'1'),)
((2.0, 20040207.0, u'1'),)这样就把excel的数据读取出来了。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-369657-1-1.html 上篇帖子: Python 代码调试技巧 下篇帖子: ZT---VIM as Python IDE
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表