当前位置: 首页 > 编程日记 > 正文

从数百个Excel中查找数据,一分钟用Python搞定




作者 | 陈熹

来源 | 早起Python

今天分享一个真实的办公自动化需求,大家一定要仔细阅读需求说明,在理解需求之后即可体会Python的强大。

需求说明

首先我们来看下今天的需求,有一份档案记录总表的Excel工作簿, 每天会根据当天日期建立新表,每天的表格内包含所有档案信息,同时也有可能会添加新的档案名。同个年度的总表在年末可能会有两、三百个工作表,同时每个表中可能也存在千余份档案信息。表格形式如下(为了直观呈现本例以7个工作表和十余份档案的形式呈现)

需要完成的操作:为了方便审查特定档案信息,需要给出档案名后生成一份新表,该表包含指定档案在所有日期(即所有工作表)中的记录。最终结果如下(以档案x003为例):

也就是老板说:给我把这几百个表格中所有包含档案x003的相关数据全部找到并整理个新的表格给我。

步骤分析

正式写代码前可以把需求分析清楚,将复杂问题简单化。

说白了,这个需求要求把所有日期工作表中的特定行都提取出来整合成一个新表。那么我们可以遍历每一张表,然后遍历第一列(名称列,也可以看作A列)每一个有数据的单元格,如果单元格中的文字为我们需要的档案名,就把这一行提取出来放到新的表格中,进一步梳理步骤为

  • 建立一个新的EXCEL工作簿

  • 新表的表头和档案记录Excel中的一样,也是名称配置提交日期

  • 遍历档案记录Excel的每一张工作表sheet,再遍历第一列每一个有数据的单元格,对内容进行判断

  • 找到符合条件的单元格后获取行号,根据行号将当前表中的特定行提取出来,并将行追加新创建的表中

分析清楚就可以着手写代码了。

Python实现

首先导入需要的库本例中涉及旧表的打开和新表的创建,因此需要从openpyxl导入load_workbookWorkbook(如果是ppt和word用到的模块就更智能了,一个方法就能搞定)

from openpyxl import load_workbook, Workbook

接着导入旧表及创建新表

# 从桌面上获取总表
filepath = r'C:\Users\chenx\Desktop\台账.xlsm' # 根据实际情况进行修改
workbook = load_workbook(filepath)
# 创建新的Excel工作簿获取到工作表
new_workbook = Workbook()
new_sheet = new_workbook.active# 给新表写入表头
new_headers = ['名称', '配置', '提交日期', '受限操作', '操作时间', '状态', '存储位置']
new_sheet.append(new_headers)

现在是核心步骤:多次遍历,可以用workbook.sheetnames获取工作簿所有工作表名称的列表,然后遍历即可。

for i in workbook.sheetnames:sheet = workbook[i]# 获取档案名称所在列names = sheet['A']

按照前面的分析,需要遍历名称列,判断每一个单元格的值是不是需要的档案名。这里应注意,如果已经循环到需要的单元格,就可以停止循环了,但一定要把符合单元格的行号传递给一个变量做记录,不然一旦break出循环就没有记忆了。

flag = 0
for cell in names:
if cell.value == keyword: # 这里的keyword就是档案名,可以以 档案x003 为例flag = cell.rowbreak

获得到符合条件的行号后用sheet[flag]就可以拿到符合行了。openpyxl不支持旧表的一整行写入新表,因此应对策略就是将这一行的所有单元格具体值组装成一个列表,用sheet.append(列表)的方法写入新表,遍历部分的完整代码如下:

    for i in workbook.sheetnames:sheet = workbook[i]names = sheet['A']flag = 0for cell in names:if cell.value == keyword:flag = cell.rowbreakif flag:   # 如果flag没有被修改则不需要顺序进行下列代码data_lst = []for cell in sheet[flag]:# 这里加上一个对内容的判断,是让无内容的行直接放空,而不是写入一个 noneif cell.value:  data_lst.append(str(cell.value))else:data_lst.append(' ')new_sheet.append(data_lst)

最后记得保存

new_workbook.save(r'C:\Users\chenx\Desktop\台账查询.xlsx')


小结

这是经过一定改编的真实案例,可见Python自动化办公确实能够帮助我们解放自己的双手,不过在写自动化脚本之前也要先拆分任务,明确思路再进行,如果对本文的代码和数据感兴趣可以在后台回复自动化获取。最后还是希望大家能够理解Python办公自动化的一个核心就是批量操作-解放双手,让复杂的工作自动化。

推荐阅读

  • 算法实现太难了?机器学习也需要开源软件

  • TikTok算法背后是抖音用户数据?想多了

  • 维度爆炸?Python实现数据压缩如此简单

  • 马小峰:金融科技界的区块链博士

  • Java 二十五载,正在 Kotlin 化

相关文章:

namenode如何存储复本?

2019独角兽企业重金招聘Python工程师标准>>> namenode如何选择在哪个datanode存储复本?这里需要对可靠性,写入带宽和读取带宽进行权衡。例如,把所有复本都存储在一个节点损失的写入带宽最小,因为复制管线都是在同一节点…

EBS-使用 fnd_user_pkg API 创建用户,添加职责,修改用户

比如有一个外围支持系统,用户需要在外围系统登录之后点个link就可以登录到Oracle ERP系统中,那么我们需要先把外围系统的用户创建在Oracle ERP中,并且分配职责给他。 DECLARE a BOOLEAN; BEGIN---------------------------------------------…

万字长文总结机器学习的模型评估与调参 | 附代码下载

作者 | Sebastian Raschka翻译&整理 | Sam来源 | SAMshare目录一、认识管道流1.1 数据导入1.2 使用管道创建工作流二、K折交叉验证2.1 K折交叉验证原理2.2 K折交叉验证实现三、曲线调参3.1 模型准确度3.2 绘制学习曲线得到样本数与准确率的关系3.3 绘制验证曲线得到超参和准…

[百万级]通用存储过程.分页存储过程

/* 名称:spAll_ReturnRows 输入: 输出: 调用: EXEC spAll_ReturnRows SELECT * FROM 表名, 页号, 返回记录数, 主键, 排序字段 spAll_ReturnRows SELECT * FROM all_Categories,2,10,[ID],[ID] 说明:[百万级]通用存储过程.分页存储过程..返回指定返回条数、指定页数的记录 …

Unsupported major.minor version (jdk版本错误)解决方案

2019独角兽企业重金招聘Python工程师标准>>> 如果你遇到了 Unsupported major.minor version ,请认真看一下,说不定会有帮助。 我花两个小时总结的经验,你可能10分钟就得到了。 ^**^ 一、错误现象: 当改变了jdk版本时…

The key of C# 学习笔记I-II

作者 :Kemins booootLog http://blog.csdn.net/keminlau/ Sunday, October 3, 2004 微软提出的CLS(Common Language Specification, 通用语言标准)对能被用来编写dotNET程序的语言的最小功能集做出了规定。 就拿C#来说,它是目前程序设计语言“以效率换安…

分布式平台下的HS(High-Security) --Apache Shiro API(介绍)

在尝试保护你的应用时,你是否有过挫败感?是否觉得现有的Java安全解决方案难以使用,只会让你更糊涂?本文介绍的Apache Shiro,是一个不同寻常的Java安全框架,为保护应用提供了简单而强大的方法。本文还解释了Apache Shiro的项目目…

豪赌 ARM 梦碎:63 岁孙正义的「花甲历险记」

来源 | HyperAI超神经这几天,传出 NVIDIA 将以 400 亿 英镑的价格收购 ARM 的消息,不少媒体在争相报道收购进度的同时,也将整起交易的幕后推手 —— 孙正义,放到了聚光灯下。软银 CEO,传奇投资人,冒险家&am…

Java 集合 — HashMap

HashMap 无序(每次resize的时候都会变)非线程安全key和value都看可以为null使用数组和链表实现查找元素的时候速度快几个重要属性: loadFactor:用来计算thresholdthreshold:决定map是否需要扩容,threshold …

赠书 | 人工智能识万物:卷积神经网络的前世今生

来源 |《Python人工智能开发从入门到精通》作者 | 杨柳、郭坦、鲁银芝责编 | 晋兆雨深度学习在技术与应用上的突破引发了第三次人工智能浪潮,获得了空前成功。在前述章节的基础上,本章将主要介绍训练卷积神经网络和深度神经网络的重要方法与技巧&#xf…

通过WMI获得硬盘和CPU的物理序列号(VB.net)

作者:iwebsms获得硬盘序列号Dim cmicWmi As New System.Management.ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive")Dim Uint32 As UInt32For Each cmicWmiObj As ManagementObject In cmicWmi.GetUint32 cmicWmiObj("signature")…

[转] Zend studio中开发常用

转载自: http://www.cnblogs.com/iphper/archive/2012/03/21/2409397.html 、快捷键设置 在zendstudio中开发的过程中,我们应专注与代码的逻辑中,而不是把一大半的时间都浪费在编辑器的操作以及鼠标的点击中,经常使用快捷键进行操作会达到事半…

程序员新手 0年份等级 指导(一) 开发人员IT架构总览

程序员新手 0年份等级 指导(一) 开发人员IT架构总览 程序员新手 0年份等级 指导(一) 开发人员相关IT架构总览之职能分解 开发人员IT架构总览一、职能分解 软件项目的主要组成大体上按照一个项目的生命周期流程分为: 需…

磁盘配额的wmi版本(C#)

作者&#xff1a;iwebsmsusing System;using System.Management;namespace DiskQuota{/// <summary>/// Class1 的摘要说明。/// </summary>class Class1{/// <summary>/// 应用程序的主入口点。/// </summary>[STAThread]static void Main(string[] a…

Smarty的配置与高级缓存技术

前言 Smarty 是一个出色的PHP模板引擎&#xff0c;它分离了逻辑代码和user interface。 学习和使用Smarty&#xff0c;没有应用到它的缓存技术是一个很大的损失&#xff0c;它可以将用户最终看到的HMTL文件缓存成一个静态的HTML页&#xff0c;当设定Smarty的cache属性为true时&…

Get了!用Python制作数据预测集成工具 | 附代码

作者 | 李秋键责编 | 晋兆雨大数据预测是大数据最核心的应用&#xff0c;是它将传统意义的预测拓展到“现测”。大数据预测的优势体现在&#xff0c;它把一个非常困难的预测问题&#xff0c;转化为一个相对简单的描述问题&#xff0c;而这是传统小数据集根本无法企及的。从预测…

方差,标准差,协方差、期望值

方差&#xff1a;方差是变量与其平均值的平方和的算术平均值&#xff0c;例如&#xff1a; 有一组数据{4,5,6,7}, 平均值为&#xff1a;(4567)/422/45.5 其方差为&#xff1a;[(4-5.5)2(5-5.5)2(6-5.5)2(7-5.5)2]/4 标准差&#xff1a;方差的开2次方 例如上面那组数据的标准差为…

简单代码的性能差异

《.net 框架程序设计》里的几句代码&#xff0c;我重新整理了一下&#xff0c;写成函数&#xff0c;这样下面的反编译代码看起来更方便点&#xff1a;dahuzizyd的专栏 http://blog.csdn.net/dahuzizyd/publicvoidBoxing() { Int32 v 5; Conso…

求助贴:人工智能offer,阿里or腾讯,选哪个?

笔者曾在脉脉上看到一条网友求助帖&#xff1a;拿到两个offer&#xff0c;一个腾讯&#xff0c;一个阿里&#xff0c;选哪个&#xff1f;抛开“柠檬”这件事不说&#xff0c;笔者观察到另一件事&#xff1a;那就是他的offer都是视觉岗。前一阵刚巧也看到一份报告&#xff1a;人…

EIGRP注入默认路由

实验TOP&#xff1a; 三、实验要求: R1,R2,R3运行EIGRP,用ip default-network 命令使EIGRP向EIGRP域内传递缺省路由,各路由器的各环回口之间路由可达。 四:实验过程: 1、 基本接口的配置.(见图) 1(config)#int e0/0 R1(config-if)#ip add 12.0.0.1 255.255.255.0 R1(config-if)…

Python OpenCV学习笔记之:图像读取,显示及保存

为什么80%的码农都做不了架构师&#xff1f;>>> #-*- coding: utf-8 -*- # 读取&#xff0c;保存&#xff0c;显示图片 import cv2 as cv# 读取为灰度图片 img cv.imread("../../datas/images/fish.jpg",0)# 保存图片 cv.imwrite("../../datas/ima…

简单的特征值梯度剪枝,CPU和ARM上带来4-5倍的训练加速 | ECCV 2020

作者 | VincentLee来源 | 晓飞的算法工程笔记在训练过程中&#xff0c;特征值梯度的回传和权值梯度的计算占了大部分的计算消耗。由于这两个操作都是以特征值梯度作为输入&#xff0c;而且零梯度不会占用计算资源&#xff0c;所以稀疏化特征值梯度可以降低回传阶段的计算消耗以…

获得汉字字符串拼音首字母

作者&#xff1a;iwebsms的专栏 返回给定字符串的首字母Function IndexCode(ByVal IndexTxt As String) As StringDim i As IntegerFor i 1 To IndexTxt.LengthIndexCode IndexCode & GetOneIndex(Mid(IndexTxt, i, 1))NextEnd Function得到单个字符的首字母Private Func…

使用HTTP模块扩展 ASP.NET 处理

HTTP 模块是一个通过实现实现 IHttpModule 接口和处理事件&#xff0c;在每次针对应用程序发出请求时调用的程序集。HTTP 模块作为 ASP.NET 请求管线的一部分调用&#xff0c;能够在整个请求过程中访问生命周期事件。因此&#xff0c;HTTP 模块使我们有机会检查传入和传出的请求…

angular指令ng-class巧用

什么是ng-class ng-class最大的妙用就是可以根据你的逻辑表达式。来添加或移除对应的class ng-class是angular.js里面内置的一个指令。 项目中&#xff0c;有时候&#xff0c;我们需要根据需求来切换不同的class function bb($scope){$scope.ss"className"; } <…

小冰拉开人生第二幕:AI时代的“Office”问世,你的虚拟男友“复活”了

作者 | Just出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;2014年&#xff0c;小冰正式推出第一代产品&#xff0c;以对话式聊天机器人形式迅速积累训练数据。2020年8月20日&#xff0c;已从微软独立分拆的小冰团队宣布&#xff0c;第八代小冰“出炉”了。小冰团队表…

如何复制一个目录里面的所有目录和文件

作者&#xff1a; cuike519的专栏 http://blog.csdn.net/cuike519/本文介绍如何将一个目录里面的所有文件复制到目标目录里面。 下面介绍几个我们在该例程中将要使用的类&#xff1a; 1、Directory&#xff1a;Exposes static methods for creating, moving, and enumeratin…

ArcGIS问题:如何定义坐标系

一般情况下&#xff0c;我们在利用ArcCatalog建立shp文件的时候就会把相应的坐标系定义好。 具体做法就是鼠标右键单击选择属性&#xff0c;即可编辑其坐标系了&#xff08;方法在&#xff1a;http://gisman.blog.163.com/blog/static/3449338820096134452166/ 投影坐标的定…

Unity3D 材料

为什么80%的码农都做不了架构师&#xff1f;>>> http://docs.unity3d.com/Manual/index.html http://www.maiziedu.com/course/u3d/ http://pan.baidu.com/share/home?uk2217874598#category/type0 http://www.devsiki.com/2015/10/08/indiegamedeveloper.html ht…

12 种方式轻松实现 Ruby 调用

作者 | Gregory Witek译者 | 弯月&#xff0c;责编 | 王晓曼头图 | CSDN 下载自东方IC出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;以下为译文&#xff1a;最近&#xff0c;与同事聊天的时候&#xff0c;我们谈到了有关 Python 编程的某些方面。我们开玩笑说 Py…