0、前言

因产品的同学试着用python统计Excel表格,但百度的程序又一直有各种问题, 所以叫我帮用python实现一个统计Excel表格程序;我之前也没有写过python操作Excel表格的程序,快速搜索实现了一下,还是发现一些问题,所以分享一下。

1、需求

我们使用TAPD管理项目,这里从TAPD导出的原Excel报表,统计后再生成的新Excel表。
        原Excel报表是任务(标题)的信息列表,需要按需求分类分别统计各处理人的预估工时,如下(图1原始Excel表格有200多行、图2统计生成的新Excel表格):

原始Excel表格

统计生成的新Excel表格

2、python操作excel表格说明

python操作excel表格有不少组件,如:xlwt、openpyxl、pandas、xlrd、xlwings
        
        一些组件在使用时有问题,如下:
                https://blog.csdn.net/weixin_42555985/article/details/102872781
                https://www.jianshu.com/p/8640abf11297
        
        这里选用xlwings,xlwings使用接近VBA的语法从Python自动与Excel交互,注意是使用到Excel软件;
        官方文档及一些参考如下:
                https://docs.xlwings.org/en/stable/index.html
                https://blog.csdn.net/whalefall/article/details/102665002
                http://www.dszhp.com/xlwings-range.html
                https://www.cnblogs.com/cyanrose/p/12059040.html
                https://blog.csdn.net/lh_hebine/article/details/104559382
        
        当然xlwing使用中也发现一个问题,range().expand()选择表格范围时无法识别一行/一列中的空值,遇到空值默认读取终止:
                https://blog.csdn.net/weixin_44781801/article/details/88692982
        下面程序会跳过一行/一列的范围选择问题。

3、python xlwings操作excel表格程序

目录下有111.py脚本、原始excel表格222.xls和生成的excel表格333.xls;

直接运行程序: $ python 111.py
        即可实现222.xls --统计、生成--> 333.xls,效果如前面的excel表格图片;
        下面是python 111.py脚本程序,可在python2.7运行:

# -*- coding: utf-8 -*-
import xlwings as xw
import sysclass Story(object):def __init__(self, handler, workingHours, demandClassification):self.handler = handlerself.workingHours = workingHoursself.demandClassification = demandClassificationdef get_handler(self):return self.handlerdef get_workingHours(self):return self.workingHoursdef get_demandClassification(self):return self.demandClassificationdef __str__(self):return "处理人:" + self.handler + ", 预估工时:" + str(self.workingHours) + ", 需求分类:" + self.demandClassificationfilePath = r'222.xls'
newFilePath = r'333.xls'reload(sys)
sys.setdefaultencoding('utf8')app = None
wb = None
wbNew = None
appNew = None
try:app = xw.App(visible=False, add_book=False)app.display_alerts = Falseapp.screen_updating = Falsewb = app.books.open(filePath)sht = wb.sheets.active# shtName=sht.name# print(shtName)rowCount = sht.range('A1').expand('table').rows.count# print(rowCount)data = sht.range('A3:G' + str(rowCount)).value# print(data)storyList = list()for i in range(len(data)):# print(data[i])# for j in range(len(data[i])):# print(data[i][j])handler = data[i][1]workingHours = data[i][4]demandClassification = data[i][5]if handler is None:handler = "未安排处理人"if workingHours is None:workingHours = 0if demandClassification is None:demandClassification = "未知需求分类"story = Story(str(handler), int(str(workingHours)),str(demandClassification))storyList.append(story)# print(str(story))if len(storyList) > 0:handlerSet = set()demandClassificationSet = set()workingHoursMap = dict()for story in storyList:handlerSet.add(story.get_handler())demandClassificationSet.add(story.get_demandClassification())key = str(story.get_handler() + story.get_demandClassification())if workingHoursMap.get(key) is None:workingHoursMap[key] = 0workingHoursMap[key] = workingHoursMap.get(key) + story.get_workingHours()handlerList = list(handlerSet)demandClassificationList = list(demandClassificationSet)workingHoursList = []handlerGbkList = []demandClassificationGbkList = []change = Falsefor j in range(len(demandClassificationList)):workingHoursList.append([])for k in range(len(handlerList)):key = str(handlerList[k] + demandClassificationList[j])workingHoursList[j].append(workingHoursMap.get(key))if change is False:handlerGbkList.append(handlerList[k].encode("gbk"))change = TruedemandClassificationGbkList.append(demandClassificationList[j].encode("gbk"))try:appNew = xw.App(visible=False, add_book=False)appNew.display_alerts = FalseappNew.screen_updating = FalsewbNew = appNew.books.add()shtNew = wbNew.sheets['sheet1']shtNew.range('A2').options(transpose=True).value = demandClassificationGbkListshtNew.range('B1').value = handlerGbkListshtNew.range('B2').value = workingHoursListwbNew.save(newFilePath)finally:if wbNew is not None:wbNew.close()if appNew is not None:appNew.quit()
finally:if wb is not None:wb.close()if app is not None:app.quit()

python操作统计excel表格,生成新excel表格相关推荐

  1. Python 操作Word文档插入图片和表格实例演示

    Python 操作Word文档插入图片和表格实例演示 效果图 实现过程 ① python-docx 库安装 ② word 文档插入图片演示 ③ word 文档插入表格演示 [ 文章推荐 ] Pytho ...

  2. php怎么在表格里插图片,Python操作word文档插入图片和表格的实例演示

    今天带来Python操作word文档插入图片和表格的实例演示教程详解 前言 图片是Word的一种特殊内容,这篇文章主要介绍了关于Python操作word文档,向里面插入图片和表格的相关内容,下面话不多 ...

  3. POI操作word模板并生成新的word.docx

    XWPFDocument对象 POI是apache提供的可以操作word文档的第三方jar.POI能操作word是使用XWPFDocument对象. XWPFDocument对象可以解析docx文件, ...

  4. python 原理 pdf_利用Python处理PDF——裁剪和生成新的PDF

    安装 在cmd中输入这一句: pip install -U pdfminer3k -i https://pypi.tuna.tsinghua.edu.cn/simple --user 注意:这里安装的 ...

  5. wps表格生成html,wps表格如何生成多个文件夹

    您可能感兴趣的话题: wps表格 生成 多个 文件夹 核心提示:wps表格如何生成多个文件夹 wps表格生成多个文件夹的方法: 首先,建立一个WPS表格.打开WPS表格,在第一行第一列输入" ...

  6. Java操作Excel 并 保存新Excel

    /** * like12 add,20180306,申请表Excel * @param parameter * @return */ public String generateStudentAppl ...

  7. kettle批量读取清洗excel文件,并分别生成新excel

    本参考以下链接,特此感谢 zKettle实战100篇 第19篇 转换核心对象Microsoft Excel输出组件 - 八一菜刀 kettle遍历目录_yzp950311的博客-CSDN博客 [Ket ...

  8. python 生成数组1:1:20_英特尔“演化算法”新框架:29个Python代码块,自动生成新算法...

    点击上方 "码农真经" 关注,星标或者置顶 22点24分准时推送,第一时间送达 来源:公众号 新智元 | 编辑:真经君 码农真经(ID:coder_experience)第 133 ...

  9. 实用脚本!Python 提取 PDF 指定内容生成新文件!

    很多时候,我们并不会预知希望提取的页号,而是希望将包含指定内容的页面提取合并为新PDF,本文就以两个真实需求为例进行讲解. 01 需求描述 数据是一份有286页的上市公司公开年报PDF,大致如下 现在 ...

最新文章

  1. php5.3.28安装,安装php-5.3.28 时问题
  2. 【Dual-Path-RNN-Pytorch源码分析】loss函数:SI-SNR
  3. 有三AILab成立 | 寻找合适的你
  4. Win7删除休眠文件
  5. 大数据先行 传统金融转型需从体制上创新
  6. springboot2 多线程写入数据_解决SpringBoot项目使用多线程处理任务时无法通过@Autowired注入bean问题...
  7. 常用Jquery前端操作
  8. javascript:typeof与instanceof区别
  9. 还原数据库时不能独占访问
  10. 稳定币usda是哪个发行的_usdt稳定币是谁发行的?
  11. 开会坐在后面,意思是不感兴趣
  12. java_web tomcat服务器的安装与配置
  13. 计算机四级要学多长时间,过计算机四级要多长时间哦?
  14. 手机里android文件夹是什么文件夹,安卓手机里的.androidlmage test是什么文件夹?...
  15. 思科计算机网络(1)计算机网络概述
  16. vue使用组件化思想实现一个简单的购物车页面
  17. Python — 词汇表(一)
  18. 透视HTTP协议(一) —— HTTP是什么
  19. html ajax实现ntlm,jquery – 在一个页面上通过AJAX POST获取NTLM挑战
  20. 计算机科学导论考试A卷试题,计算机科学导论试题a1.doc

热门文章

  1. 4.app是怎么炼成的
  2. php开发工程师前景如何
  3. 是该回到正确的道路上了
  4. 九九乘法表口诀python-python的乘法
  5. 【转】Java面试资源----百度Java面试题前200页大汇总
  6. PowerPoint 2010 设置演讲者模式
  7. pdf可以转换成ppt格式吗,怎么转?
  8. (2)右上角菜单栏——添加好友(非通信部分)
  9. 合并、撤站、裁团,社区团购的“诸神黄昏”降临?
  10. C#运用ajax实现updatepanel控件更新及弹窗