python比较excel表格内容并提取_利用python提取多张excel表数据并汇总到同一张新表中...

接上篇文章《如何用python实现excel中的vlookup功能?》,上篇说到,最近我在做一个小项目,也是用python操作excel解决财务审计工作上的一些问题,以便提高工作效率及其准确性。

最终目的,刀哥是想做应收账款账龄分析,不知最终能否实现,请大家持续关注。

这篇文章要做的事情,如标题所述,就是提取多张excel表上的数据或信息,合并汇总到一张新表上,这是我们工作中经常会遇到的事情。

比如将每月销售情况汇总到一张表上进行销售情况分析,比如将各月发票信息汇总到一张表上进行统计分析,还比如将每月工资表上的某些信息汇总到一张表上进行工资成本分析等等。

这次,刀哥是要将2017年1-12月、2018年1-12月、2019年1-12月及2020年1-6月各期科目余额表中,所有应收账款的信息,包括科目编码、科目名称、期初余额、借贷方发生额及期末余额,全部提取出来汇总到同一张新表上,并以科目编码升序排列,客户名称及金额与科目编码做到一一对应。

具体看表即为:

各期科目余额表截图

最后得到的新表为:

要实现上述目标,可以分如下四步进行。

1.

获取各科目余额表文件路径

将2017年1-12月、2018年1-12月、2019年1-12月及2020年1-6月各期科目余额表放在同一文件夹下,要读取多少个文件,就把多少个文件全部放在同一个文件夹下,如下图。

然后读取所有文件的路径,代码如下。

1dir_xls = []

2def get_file(folder_path): #获取同一文件夹下所有科目余额表各自的文件路径

3 dir_file = os.listdir(folder_path)

4 #print(dir_file)

5 for path in dir_file:

6 if path[-4:] == 'xlsx' or path[-3:] == 'xls':

7 whole_path = r'd:/F:学习/python/账龄分析/科目余额表/{}'.format(path)

8 dir_xls.append(whole_path)

9 return dir_xls

2.

获取各科目余额表中应收账款一级科目编码所在的行列

比如在2017年科目余额表中,应收账款一级科目编码为“1122”,其所在的单元格为C12,也即为第12行第3列,这里的行号12、列号3,即为其定位。

其余科目余额表同理,均为获取一级科目编码“1122”的行号和列号,获取代码如下。

1dict_row_col = {}

2def get_row_col(dir_xls): #获取每一张表中应收账款一级科目编码所在的行号和列号

3 for i in dir_xls:

4 #print(i)

5 account_balance_sheet_data = pd.DataFrame(pd.read_excel(i))

6 for a in account_balance_sheet_data.index:

7 for b in range(len(account_balance_sheet_data.loc[a].values)):

8 if account_balance_sheet_data.loc[a].values[b] == '1122':

9 row = a+1

10 col = b+1

11 dict_row_col[i] = [row,col]

12 return dict_row_col

3.

获取各科目余额表中应收账款所有二级科目编码

根据获取到的应收账款一级科目编码行号和列号,即根据其定位,再获取每一张表中应收账款所有二级科目编码,并将其不重复且升序排列添加到一张新表中,代码如下。

1def get_ar_code(dict_row_col):

2 i = 0

3 ar_list1 = []

4 ar_list2 = []

5 for key in dict_row_col.keys():

6 workbook = xlrd.open_workbook(key)

7 balance_sheet = workbook.sheet_by_index(0)

8 row = dict_row_col[key][0]

9 col = dict_row_col[key][1]

10 while True:

11 if '1122' in balance_sheet.cell_value(row+1,col-1):

12 ar_code = balance_sheet.cell_value(row+1,col-1)

13 if ar_code not in ar_list1:

14 ar_list1.append(ar_code)

15 else:

16 pass

17 row = row+1

18 else:

19 break

20 ar_list1.append('科目编码')

21 ar_list1.sort(reverse=False) #科目编码列表升序排列

22 #将“科目编码”从最后一个元素整体移动到第一个元素

23 ar_list2.append(ar_list1[len(ar_list1)-1])

24 for i in range(1,len(ar_list1)):

25 ar_list2.append(ar_list1[i-1])

26 #将所有元素写入到excel表中

27 for i in range(len(ar_list2)):

28 ar_sheet.write(i,0,ar_list2[i])

得到的新表内容如下。

由上可看出,2017年至2020年1-6月,四张科目余额表,应收账款共有617个二级科目,对应着617个不同的客户。

4.

根据二级科目索引获取全部所需信息

此步的操作过程,即上一篇《如何用python实现excel中的vlookup功能?》所分享的过程,这里就不再详述了,代码如下。

1def get_ar_info(dict_row_col):

2 #读取导入目标表

3 file_target = r'd:\F:学习\python\账龄分析\AR.xls'

4 list_ar_code = []

5 workbook = xlrd.open_workbook(file_target)

6 balance_sheet = workbook.sheet_by_index(0)

7 rows = balance_sheet.nrows

8 for i in range(1,rows):

9 list_ar_code.append(balance_sheet.cell_value(i,0))

10 #print(list_ar_code)

11 data = {'科目编码':list_ar_code}

12 df_target = pd.DataFrame(data)

13

14 for key in dict_row_col.keys():

15 #读取原始数据来源表

16 file_source = key

17 df_source = pd.read_excel(file_source)

18 #将原始数据来源表及导入目标表信息合并到同一表上

19 dfneed = df_source[['科目编码','科目名称','期初借方','期初贷方','本期发生借方','本期发生贷方','期末借方','期末贷方']]

20 df_target = pd.merge(df_target,dfneed,how='left',on='科目编码')

21 df_target.to_excel(file_target,index=False)

5.

最终目标实现

前四步即为封装的四个函数,每个函数为其中一个步骤,最终汇总可以实现此文总体目标,调用代码及运行代码如下。

1import os

2import pandas as pd

3import xlrd,xlwt

4

5folder_path = r'd:\F:学习\python\账龄分析\科目余额表'

6f = xlwt.Workbook()

7ar_sheet = f.add_sheet(u'ar_sheet',cell_overwrite_ok=True)

8dir_xls = get_file(folder_path)

9dict_row_col = get_row_col(dir_xls)

10get_ar_code(dict_row_col)

11f.save(r'd:\F:学习\python\账龄分析\AR.xls')

12get_ar_info(dict_row_col)

运行后生成的表格如下。

再经过简单整理后,便可得出上文最终表格,至此实现了从多张excel表中提取所需数据或信息并汇总到同一张新表上的目的。

写的很匆忙,不知道表述清楚没有,如有疑问,请找刀哥交流。

如何实现账龄分析目标,那就是刀哥下次要分享的内容了,敬请期待,记得点个赞同和收藏哦。

学习python,刀哥正在路上,你要一起来吗?欢迎加入刀哥python学习交流群,来一起撸代码吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333776.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿帕奇跨域_阿帕奇齿轮泵

阿帕奇跨域Apache Gearpump是一个实时大数据流引擎。 它于2014年中期在GitHub上作为一个开源项目在英特尔构想,并于2016年3月8日进入Apache孵化。Gearpump的名称是对工程术语“齿轮泵”的指称,它是一个超级简单的泵,由以下组成只有两个齿轮&a…

正则表达式之 NFA 引擎匹配原理详解

文章目录一、为什么要了解引擎匹配原理二、正则表达式引擎三、预备知识(一)字符串组成(二)占有字符和零宽度(三)控制权和传动四、正则表达式简单匹本过程(一)基础匹配过程&#xff0…

阿帕奇跨域_阿帕奇光束

阿帕奇跨域Apache Beam是一个开放源代码统一模型,用于定义批处理和流数据并行处理管道。 使用一种开源的Beam SDK,您可以构建一个定义管道的程序。 然后,该管道由Beam支持的分布式处理后端之一执行,这些后端包括Apache Apex &…

unity 启动相机_Unity3D研究院之打开照相机与本地相册进行裁剪显示(三十三)...

最近做项目需要用到这个功能,就是在Unity中调用Android本地相册或直接打开摄像机拍照并且裁剪一部分用于用户头像,今天研究了一下,那么研究出成果了MOMO一定要分享给大家。Unity与Android的交互还有谁不会?? 如果有不会…

深度学习pytorch--MNIST数据集

图像分类数据集(Fashion-MNIST) 在介绍softmax回归的实现前我们先引入一个多类图像分类数据集。它将在后面的章节中被多次使用,以方便我们观察比较算法之间在模型精度和计算效率上的区别。图像分类数据集中最常用的是手写数字识别数据集MNIS…

html 元素的属性

全局属性 全局属性是可与所有 HTML 元素一起使用的属性。 事件属性 用来定义某个事件的操作的属性叫事件属性,例如,οnclick“script”,元素上发生鼠标点击时触发 click 事件,click 事件被触发就会执行对应的脚本代码。事件属性…

nosql和rdnms_用于SaaS和NoSQL的Jdbi

nosql和rdnms一个自然的接口,用于与CRM,ERP,会计,营销自动化,NoSQL,平面文件等基于Java的数据集成 Jdbi是用于JavaSQL便利库,它为JDBC提供更自然的Java数据库接口,该接口易于绑定到…

matlab 功率谱密度 汉宁窗_如何理解随机振动的功率谱密度?

一、随机信号和正太分布有什么关系? 二、时域、频域之间功率守恒? 三、自相关又是个什么玩意?作为一个工程师,很多人对随机振动看着熟悉,却又实际陌生。熟悉是因为几乎每个产品在出厂时都要求要做随机振动试验&#xf…

深度学习pytorch--softmax回归(二)

softmax回归的从零开始实现实验前思考获取和读取数据获取数据集查看数据集查看下载后的.pt文件查看mnist_train和mnist_test读取数据集查看数据迭代器内容初始化模型参数定义softmax函数定义模型定义损失函数计算分类准确率模型评价--准确率开始训练可视化总结完整代码实验前思…

HTML块级元素/块标签/块元素

文章目录块元素的特点块元素清单block level element. 块级元素想在同一行显示需浮动或者 display:inline。 块元素的特点 每个块级元素都是独自占一行,其后的元素也只能另起一行,并不能两个元素共用一行; 元素的高度、宽度、行高、顶边距、…

物联卡查询流量_电信物联卡官网是多少?如何快速查询流量信息?

高速率设备的使用场景需要用到5G,中速率LET-Cat1应用范围更广,而低速率则要靠窄带物联网NB-IOT去维护了。这三种网络制式全都与物联网息息相关,这就能知道为什么国家层面对物联网基础设施建设这么重视了。电信物联卡在智能化硬件中有优秀表现…

java8日期转时间戳_Java 8日期和时间

java8日期转时间戳如今,一些应用程序仍在使用java.util.Date和java.util.Calendar API,包括使我们的生活更轻松地使用这些类型的库,例如JodaTime。 但是,Java 8引入了新的API来处理日期和时间,这使我们可以对日期和时间…

HTML行内元素/行级元素/内联元素/行标签/内联标签/行内标签/行元素

文章目录行内元素的特点行内元素清单可变元素列表inline element. 也叫行级元素、内联元素。行内元素默认设置宽度是不起作用,需设置 display:inline-block 或者 block 才行。 行内元素的特点 可以和其他元素处于一行,不用必须另起一行; 元…

深度学习pytorch--softmax回归(三)

softmax回归的简洁实现获取和读取数据定义和初始化模型softmax和交叉熵损失函数定义优化算法模型评价训练模型小结完整代码前两篇链接: 深度学习pytorch–softmax回归(一) 深度学习pytorch–softmax回归(二) 本文使用框架来实现模型。 获取和读取数据 我们仍然使用Fashion-M…

正则表达式的分类

文章目录一、正则表达式引擎二、正则表达式分类三、正则表达式比较四、Linux/OS X 下常用命令与正则表达式的关系一、正则表达式引擎 正则引擎大体上可分为不同的两类:DFA 和 NFA,而 NFA 又基本上可以分为传统型 NFA 和 POSIX NFA。 DFA(Deterministic …

spock测试_使用Spock测试您的代码

spock测试Spock是针对Java和Groovy应用程序的测试和规范框架。 Spock是: 极富表现力 简化测试的“给定/何时/然后” 语法 与大多数IDE和CI服务器兼容。 听起来不错? 通过快速访问Spock Web控制台,您可以非常快速地开始使用Spock。 当您有…

深度学习pytorch--多层感知机(一)

多层感知机隐藏层激活函数ReLU函数sigmoid函数tanh函数多层感知机小结我们已经介绍了包括线性回归和softmax回归在内的单层神经网络。然而深度学习主要关注多层模型。在本节中,我们将以多层感知机(multilayer perceptron,MLP)为例…

太阳能板如何串联_光伏板清洁专用的清洁毛刷

光伏发电是利用半导体界面的光生伏特效应将光能直接转变为电能的一种技术。主要由太阳电池板(组件)、控制器和逆变器三大部分组成。主要部件由电子元器件构成。太阳能电池经过串联后进行封装保护可形成大面积的太阳电池组件,再配合上功率控制…

java 异步等待_Java中的异步等待

java 异步等待编写异步代码很困难。 试图了解异步代码应该做什么的难度更大。 承诺是尝试描述延迟执行流程的一种常见方式:首先做一件事,然后再做另一件事,以防万一出错时再做其他事情。 在许多语言中,承诺已成为协调异步行为的实…

cass生成曲线要素_干货在线 | CASS入门指南——道路断面计算土方

CASS操作指南——道路断面计算土方法小伙伴们赶紧学起来!道路类的土方工程,主要用CASS的断面法土方计算之道路断面来计算。整个计算过程主要分为以下四步:菜单截图第一步:绘制道路中心线道路的中心线,一般由直线段和缓…