前言
Excel 是我们在工作和日常中使用频率很高,平时,我们对一个 Excel 文件中进行操作,手工进行很方便,但问题是,如果我们遇见需要同时操作多个 Excel 文件,就是一件非常耗时的事情了。你可能对每一个 Excel 文件都进行“打开 - 复制粘贴 - 保存”循环的机械工作。是不是感觉很枯燥和乏味呢?
今天我带大家学习下,如何用 Python 操作Excel进行批量合并和拆分。想了解快速的使用Python进行批量合并和拆分,那我们首先要知道如何用Python操作Excel文件,
如何用 Python 手工操作一个 Excel 文件?
一、导入excel表格文件处理函数
import xlwt
注意,这里的xlwt是python的第三方模块,需要下载安装才能使用。(python第三方库的安装也非常简单,打开命令行,输入pip install xxx就可以了
pip install xlrd
pip install xlwt
其中,xlrd 库支持 Excel 读取,xlwt 库支持 Excel 写入。
二、创建excel表格类型文件
book = xlwt.Workbook(encoding='utf-8')
调用xlwt模块中的Workbook方法来创建一个excel表格类型文件,其中的第一个参数是设置数据的编码格式,这里是’utf-8’的形式。
三、在excel表格类型文件中建立一张sheet表单
sheet = book.add_sheet('豆瓣电影Top250',cell_overwrite_ok=True)
用book对象调用add_sheet方法来建立一张sheet表,这里面的第一个参数很明显就是设置sheet表格的名称,第二个参数cell_overwrite_ok用于确认同一个cell单元是否可以重设值,这里赋值为True就表示可重设值。
四、自定义列名
col = ('电影详情链接','图片链接','影片中文名','影片外国名','评分','评价数','概况','相关信息')
用一个元组col自定义列的数量以及各列的属性名,比如我这里是8列,列属性名有“电影详情链接”,“图片链接”等。
五、将列属性元组col写进sheet表单中
for i in range(0,8):
sheet.write(0,i,col[i])
很简单,用一个for循环将col元组的元组值(也就是列属性名)写入到sheet表单中。这里调用的是write方法,该方法的第一个参数是行、第二个参数是列、第三个当然就是col元组值。因为这里写进去的是列名,所以都是在第一行。
六、将数据写进sheet表单中
datalist = [['www','www图片','西游记','xiyouji','100分','0人','很好','超级棒'],['www2','www图片2','西游记2','xiyouji2','1000分','1人','很棒','一级棒']]
for i in range(0,2):
data = datalist[i]
for j in range(0,8):
sheet.write(i+1,j,data[j])
把数据写进sheet表单里也很简单,先用一个for进行每行写入,在每一行中用第二个for循环把每一行当中的列值写进去。
七、保存excel文件
savepath = 'excel表格.xls'
book.save(savepath)
只需要调用save方法即可保存到自定义的路径下面。
完整代码:
import xlwt
# 创建excel表格类型文件
book = xlwt.Workbook(encoding='utf-8')
# 在excel表格类型文件中建立一张sheet表单
sheet = book.add_sheet('豆瓣电影Top250',cell_overwrite_ok=True)
# 自定义列名
col = ('电影详情链接','图片链接','影片中文名','影片外国名','评分','评价数','概况','相关信息')
# 将列属性元组col写进sheet表单中
for i in range(0,8):
sheet.write(0,i,col[i])
# 将数据写进sheet表单中
datalist = [['www','www图片','西游记','xiyouji','100分','0人','很好','超级棒'],['www2','www图片2','西游记2','xiyouji2','1000分','1人','很棒','一级棒']]
for i in range(0,2):
data = datalist[i]
for j in range(0,8):
sheet.write(i+1,j,data[j])
# 保存excel文件
savepath = 'excel表格.xls'
book.save(savepath)
运行截图
批量合并:怎样实现 Excel 的合并?
假设你需要对某些工作内容进行问卷调查,一般是先把 Excel 通过工作群分发给所有员工,再把群里收集到的反馈附件汇总成一个文件。
每个员工上交的Excel如下:
名字 | 第一题 | 第二题 |
小红 | D | B |
名字 | 第一题 | 第二题 |
小方 | A | C |
你要做的工作是汇总,
名字 | 第一题 | 第二题 |
小红 | D | B |
小方 | A | C |
如果是员工人数不多,操作起来还是很方便的。但是当员工数量几万个人时,这将是一件非常费时的事情。
我想你可能会想,有没有什么好的方法呢?那是必然的,可以用Python和相关的第三库实现。我们来看看具体实现过程:
首先,根据上面Excel数据生成过程,我们创建2张Excel表:
import xlwt
# 创建excel表格类型文件
table = xlwt.Workbook(encoding='utf-8')
# 在excel表格类型文件中建立一张sheet表单
sheet = table.add_sheet('sheet1',cell_overwrite_ok=True)
# 自定义列名
col = ('名字','第一题','第二题')
# 将列属性元组col写进sheet表单中
for i in range(0,3):
sheet.write(0,i,col[i])
# 将数据写进sheet表单中
data = ['小方','A','C']
for j in range(0,3):
sheet.write(1,j,data[j])
# 保存excel文件
savepath = 'excel1.xls'
table.save(savepath)
import xlwt
# 创建excel表格类型文件
table = xlwt.Workbook(encoding='utf-8')
# 在excel表格类型文件中建立一张sheet表单
sheet = table.add_sheet('sheet1',cell_overwrite_ok=True)
# 自定义列名
col = ('名字','第一题','第二题')
# 将列属性元组col写进sheet表单中
for i in range(0,3):
sheet.write(0,i,col[i])
# 将数据写进sheet表单中
data = ['小红','D','B']
for j in range(0,3):
sheet.write(1,j,data[j])
# 保存excel文件
savepath = 'excel2.xls'
table.save(savepath)
好了,我们数据已经准备好了,接下来,看看如何汇总吧!
其工作流程定义为三个步骤:
1. 找到整个工作过程当中重复操作的部分;
2.将重复操作的部分需要哪些手工操作找出来,使用 Python 编写程序代替手工操作的部
分;
3. 对重复的部分,使用循环语句进行批量处理。
import xlrd
import xlwt
from pathlib import Path, PurePath
# 导入excel和文件操作库
# 指定要合并excel的路径
src_path = '/content'
# 指定合并完成的路径
dst_file = '结果.xlsx'
# 取得该目录下所有的xlsx格式文件
p = Path(src_path)
files = [x for x in p.iterdir() if PurePath(x).match('*.xls')]
print(files)
# 准备一个列表存放读取结果
content = []
# 对每一个文件进行重复处理
for file in files:
data = xlrd.open_workbook(file)
table = data.sheets()[0]
# 取得每一项的结果
answer0 = table.cell_value(rowx=1, colx=0)
answer1 = table.cell_value(rowx=1, colx=1)
answer2 = table.cell_value(rowx=1, colx=2)
temp = f'{answer0},{answer1},{answer2}'
# 合并为一行先存储起来
content.append(temp.split(','))
print(temp)
# 输出
# 小红,D,B
# 小方,A,C
# 准备写入文件的表头
table_header = ['名字', '第一题', '第二题']
workbook = xlwt.Workbook(encoding='utf-8')
xlsheet = workbook.add_sheet("统计结果")
# 写入表头
row = 0
col = 0
for cell_header in table_header:
xlsheet.write(row, col, cell_header)
col += 1
# 向下移动一行
row += 1
# 取出每一行内容
for line in content:
col = 0
# 取出每个单元格内容
for cell in line:
# 写入内容
xlsheet.write(row, col, cell)
# 向右移动一个单元格
col += 1
# 向下移动一行
row += 1
# 保存最终结果
workbook.save(dst_file)
我使用了 for 语句依次获取 src_path 变量指向的路径下所有的文件。同时,为了避免这个目录里的文件类型过多,我使用一个 if 语句用于条件判断,只提取 .xls 结尾的文件。
合并后的效果如下图:
名字 | 第一题 | 第二题 |
小红 | D | B |
小方 | A | C |
批量拆分:怎样实现 Excel 的拆分?
对于批量操作 Excel,还有一种情况是批量拆分。比如很多公司会用 Excel 记录和统计员工的薪水、记录货物信息、记录客户情况等数据。这些数据越来越多之后,文件会越来越大,打开文件和查找速度就会变得很慢,最后只好按照某些列进行 Excel 的拆分。
核心代码如下
for line in range(1,employee_number):
content = table.row_values(rowx=line, start_colx=0, end_colx=None)
# 将表头和员工数量重新组成一个新的文件
new_content = []
# 增加表头到要写入的内容中
new_content.append(salary_header)
# 增加员工工资到要写入的内容中
new_content.append(content)
# 调用自定义函数write_to_file()写入新的文件
write_to_file(filename = content[1], cnt = new_content)
文件的批量拆分也是通过循环来实现逐行处理的功能的,但是你需要注意拆分以后的要保存的文件名称不要重复,不然很容易导致 Excel 中只有最后一次循环写入的内容。