> 技术文档 > python办自动化--利用vba或者python按需求读取excel文件指定列,更改列名后,按照要求将列排序,最后填充空白单元格

python办自动化--利用vba或者python按需求读取excel文件指定列,更改列名后,按照要求将列排序,最后填充空白单元格


系列文章目录

python办公自动化数据可视化(pandas+matplotlib)–生成条形图和饼状图
python办公自动化–数据可视化(pandas+matplotlib)–生成折线图
python办公自动化–数据可视化(pandas读取excel文件,matplotlib生成可视化图表)
python办公自动化-openpyxl学习-工资表生成工资条
python办公自动化–使用将csv大文件分割为xlsx小文件
python办公自动化----使用pandas和os合并多个订单
三种方法批量填充订单表中的空白单元格–python,excel vba,excel
python办自动化–批量发送带附件的变量邮件(示例:给员工发送工资条)
python办自动化–读取邮箱中特定的邮件,并下载特定的附件

文章目录

  • 系列文章目录
  • 前言
  • 一、需求简介
  • 二、使用VBA
    • 1.基本设置
    • 2.编写vba代码
    • 3.代合整合
    • 4.运行vba
  • 三、使用python
  • 总结

前言

小伙伴们大家好,今天我们继续学习办公自动化的相关内容。前段时间笔者所在的部门出现了这样一个难题,由于系统更新,大家从后台导出的数据表格和原先有了很大的变化,同事们基于之前的字段名以及字段排列顺序已经形成了一套比较完备的工作流程,现在更新后每次都需要一步步地将数据表调整为以前的格式,这非常耽误时间。
笔者最开始想的是用python来帮助大家一键完成这份工作,可是后来一想,python的运行需要安装特定的环境,笔者不可能给每个同事的电脑上都安装一套python运行的环境,考虑再三,笔者决定采用vba来编写小脚本,由于vba的运行环境就是大家常用的wps和office,因此大家很快就熟悉了小工具的使用。
那么今天我们就用vba和oython这两种方法来实现这个问题。

一、需求简介

如图所示,我们在如图所示路径有一个文件:订单表.csv
在这里插入图片描述
文件内容如下:
在这里插入图片描述
我们需要做的工作步骤如下:
1.提取出“订单号”,“姓名”,“居住城市”,“产品名称”和“产品数量”这几列,
2.新建一个文件“提取后.xlsx”,将上面提取的五列数据按照“姓名”,“产品名称”,“产品数量”,“姓名”,“居住城市”这样的顺序从做到右写入新建的表格
3.将列标题“姓名”改为“客户姓名”,“居住城市”改为“订单地址”
4.将“客户姓名”和“订单地址”这两列进行前向填充
5.将“提取后.xlsx”这个文件放在“订单表.csv”的路径下

完成上面工作后的“提取后.xlsx”文件内容如下:
在这里插入图片描述

下面我们就分别使用vba和python这两种方法来介绍如何实现上面的需求

二、使用VBA

1.基本设置

vba和c语言.java语言以及python语言一样,都是计算机编程语言,只是它的运行环境是我们常用的wps以及office办公软件,也就是说我们不需要再去为运行代码而配置其它的东西。
这里我们以大家用的比较多的wps为例,首先我们打开新建一个excel文件:“工具.xlsx”,通过wps打开后点击文件–选项–自定义功能区–工具
我们将工具勾选上,如下图所示
在这里插入图片描述
接着我们在主页点击工具,打开vb编辑器
在这里插入图片描述
然后我们选择一个工作表(这里以sheet1为例),插入模块编写代码
在这里插入图片描述

2.编写vba代码

1.首先我们建立整体框架,定义变量

Sub shuju1()Dim xinjian As WorksheetDim mubiao As WorksheetDim zuihou As IntegerDim laiyuan As StringDim baocun As StringEnd Sub

这里的xinjian和mubiao是两个工作表类型的变量,用来提取数据
zuihou这个变量用于框定数据范围
laiyuan和baocun这两个变量分别是我们要读取的“订单表.csv”的路径,以及我们完成所有工作后,将新表格保存到的路径
2.接着我们按照各个变量的作用,给这些变量赋予实际意义

laiyuan = \"E:\\python办公自动化\\数据提取\\订单表.csv\"baocun = \"E:\\python办公自动化\\数据提取\\提取后的数据.xlsx\"Set mubiao = Workbooks.Add.Sheets(1)Set xinjian = Workbooks.Open(laiyuan).Sheets(1)zuihou = xinjian.Cells(xinjian.Rows.Count, 1).End(xlUp).Row

3.接下来我们按照字段之间的对应关系来提取数据,同时更改字段名

xinjian.Range(\"A1:A\" & zuihou).Copy Destination:=mubiao.Range(\"A1\")xinjian.Range(\"E1:E\" & zuihou).Copy Destination:=mubiao.Range(\"B1\")xinjian.Range(\"G1:G\" & zuihou).Copy Destination:=mubiao.Range(\"C1\")xinjian.Range(\"B1:B\" & zuihou).Copy Destination:=mubiao.Range(\"D1\")xinjian.Range(\"D1:D\" & zuihou).Copy Destination:=mubiao.Range(\"E1\")mubiao.Cells(1, 4).Value = \"客户姓名\"mubiao.Cells(1, 5).Value = \"订单地址\"

根据上面我们给出的对应关系可知
\"订单表.csv\"的A列对应\"提取后的数据.xlsx\"的 A列
\"订单表.csv\"的 E列对应\"提取后的数据.xlsx\"的 B列
\"订单表.csv\"的G列对应\"提取后的数据.xlsx\"的 C列
\"订单表.csv\"的 B列对应\"提取后的数据.xlsx\"的 D列
\"订单表.csv\"的C列对应\"提取后的数据.xlsx\"的 E列

提取后我们更改行标题
第四列的“姓名”改为“用户姓名”
第五列的“居住城市”改为订单地址”

5.前向填充空白单元格

Dim rng2 As RangeSet rng2 = mubiao.UsedRangeDim cell As Range For Each cell In rng2 If IsEmpty(cell.Value) Then cell.Value = cell.Offset(-1, 0).Value End If Next 

5.保存生成的表格

 mubiao.Parent.SaveAs Filename:=baocun mubiao.Parent.Close SaveChanges:=True

3.代合整合

Sub shuju1()Dim xinjian As WorksheetDim mubiao As WorksheetDim zuihou As IntegerDim laiyuan As StringDim baocun As Stringlaiyuan = \"E:\\python办公自动化\\数据提取\\订单表.csv\"baocun = \"E:\\python办公自动化\\数据提取\\提取后的数据.xlsx\"Set mubiao = Workbooks.Add.Sheets(1)Set xinjian = Workbooks.Open(laiyuan).Sheets(1)zuihou = xinjian.Cells(xinjian.Rows.Count, 1).End(xlUp).Rowxinjian.Range(\"A1:A\" & zuihou).Copy Destination:=mubiao.Range(\"A1\")xinjian.Range(\"E1:E\" & zuihou).Copy Destination:=mubiao.Range(\"B1\")xinjian.Range(\"G1:G\" & zuihou).Copy Destination:=mubiao.Range(\"C1\")xinjian.Range(\"B1:B\" & zuihou).Copy Destination:=mubiao.Range(\"D1\")xinjian.Range(\"D1:D\" & zuihou).Copy Destination:=mubiao.Range(\"E1\")mubiao.Cells(1, 4).Value = \"客户姓名\"mubiao.Cells(1, 5).Value = \"订单地址\" Dim rng2 As RangeSet rng2 = mubiao.UsedRangeDim cell As Range For Each cell In rng2 If IsEmpty(cell.Value) Then cell.Value = cell.Offset(-1, 0).Value End If Next mubiao.Parent.SaveAs Filename:=baocunmubiao.Parent.Close SaveChanges:=TrueEnd Sub

4.运行vba

我们在代码编辑窗口点击运行
或者回到主界面,点击工具,运行宏,然后选择我们定义的宏:shuju1,点击运行
在这里插入图片描述
然后我们会发现在我们的订单表.csv所在的文件夹多了一个表格:提取后的数据.xlsx
打开后就可以看到我们的数据成功提取完毕
在这里插入图片描述

三、使用python

import pandas as pdfilepath=r\"E:\\python办公自动化\\数据提取\\订单表.csv\"savepath=r\"E:\\python办公自动化\\数据提取\\python提取数据.xlsx\"LIST1=[\"订单号\",\"姓名\",\"居住城市\",\"产品名称\",\"产品数量\"]df1=pd.read_csv(filepath,encoding=\"gbk\",usecols=LIST1)new_order=[\"订单号\",\"产品名称\",\"产品数量\",\"姓名\",\"居住城市\"]df1=df1[new_order]df1[\"姓名\"]=df1[\"姓名\"].ffill()df1[\"居住城市\"]=df1[\"居住城市\"].ffill()df1.rename(columns={\"姓名\":\"客户姓名\",\"居住城市\":\"居住地\"},inplace=True)df1.to_excel(savepath,encoding=\"gbk\",index=False)

python实现这个功能就太简单了,有种高射炮打蚊子的感觉。
我们前面已经更新了很多python实现办公自动化的文章,相对于前几篇文章来说,这期的内容就过于简单了。
具体细节相信大家一看就懂了,我们运行上面的python代码后,在我们的E:\\python办公自动化\\数据提取这个路径会生成一个文件:python提取数据.xlsx

打开这个文件,你会发现和上面使用vba达到的效果是一样的。

总结

今天我们学习了使用vba和python对表格的数据进行列方向上的提取,当然,我们还可以根据不同的条件对行进行提取,比如提取订单地址为武汉的,或者性别为女的,等等功能通过vba或者python都可以实现。
相对于vba,python的功能要强大很多很多,并且微软已经停止了对vba的更新,可是pythond的生态圈却一直在发展壮大,因此要想做自动化,python无疑是更好的选择。
其实从今天的问题来看,对于一些简单的场景,vba依旧有着不错的使用价值,因为它是依赖于office办公软件而存在的,因此也更加地亲近于大众。
好啦,今天的学习就到这里了,大家如果还有其它什么想学的,或者想通过python/vba来将日常重复的工作进行自动化的,都可以私信我或者在评论区留言哟。
最后,希望大家可以点个免费的关注或者赞赞,爱你们哟!!!!!

说说控