如何快速地批量处理内容相似的Excel?

系列文章目录

python自动化办公


文章目录

  • 系列文章目录
  • 前言
  • 一、如何用 Python 操作一个 Excel 文件呢?
  • 二、操作步骤
    • 覆盖
    • 以追加方式写入:合并
    • 具体代码实现
    • 拆分


前言

Excel 是我们在工作中用到的最频繁的软件之一,它有着强大的计算能力和便捷的图表功能。如果我们要在同一个 Excel 文件中进行操作,手工进行也很方便,但问题是,如果我们需要同时操作多个 Excel 文件,就是一件非常耗时的事情了。

在工作场景中,需要同时操作多个 Excel 的情况主要有 2 种:批量合并和批量拆分。我来带你看 2 个场景。

批量合并。假设你需要对某些工作内容进行问卷调查,这时你用 Excel 做了调查问卷模版。我想你会这样做:先把 Excel 通过工作群分发给所有员工,再把群里收集到的反馈附件汇总成一个文件。

批量拆分。假设你是公司的财务人员,你需要使用 Excel 对员工工资进行核算,之后再打印出来。但是公司要求员工薪水保密,所以每个员工的工资需要拆分成一个独立的文件,最后还需要打印出来。


一、如何用 Python 操作一个 Excel 文件呢?

要想使用python去操作excel文件,那么python首先要支持读写功能。在 Python 中,要想实现对某一个功能的支持,就需要安装扩展库。

支持 Excel 读取的扩展库叫做 xlrd 库,支持 Excel 写入的扩展库叫做 xlwt 库。我们可以使用下面的命令行进行安装:

pip3 install xlrd

pip3 install xlwt

二、操作步骤

1.引入库

代码如下(示例):

import xlwt

import xlrd

2.读入数据

代码如下(示例):

file = 'E:/python自动化办公/自动化办公文件/拆分与合并/a.xlsx'
data = xlrd.open_workbook(file)
table = data.sheets()[0]
value = table.cell_value(rowx=2, colx=2)
dst_file = 'E:/python自动化办公/自动化办公文件/拆分与合并/写入.xlsx'
workbook = xlwt.Workbook(encoding='utf-8')
xlsheet = workbook.add_sheet("统计结果")

# 写入内容,假设取出的内容是value
xlsheet.write(0, 0, value)


# 保存文件workbook.save(dst_file)
workbook.save(dst_file)

 

如何快速地批量处理内容相似的Excel?_第1张图片

从表格我们可以看到我们取到了李四第二题的结果。

可以看到,写入文件的时候,我们使用了一个叫做 write 的函数。它的前两个参数代表的写入位置, 分别是指定写入的行和列坐标。无需多言,这个写入位置非常重要。如果按照上面的代码方式写入,也就是前两个参数均指定为 0, 就会覆盖这个 Excel 文件中的现有内容了。所以,你如果想完成合并操作的话,就要实现对现有 Excel 内容进行追加写入。 通常我们会先获取现有的内容一共有多少行、多少列,然后向后移动一个位置,再进行写入。这种追加写入的方式, 在我们的工作场景中非常常见。接下来,我们就看看怎么用追加写入的方式,实现多个 Excel 文件的合并吧。

以追加方式写入:合并

重要的一个功能就是:循环

核心代码如下:

from pathlib import Path, PurePath

# 指定要合并excel的路径
src_path = 'E:/python自动化办公/自动化办公文件/拆分与合并'

# 取得该目录下所有的xlsx格式文件
p = Path(src_path)files = [x for x in p.iterdir() if PurePath(x).match('*.xlsx')]

在这段代码中,我使用了 for 语句,实现了 Python 的循环功能。通过这样的功能,我可以依次获取 src_path 变量指向的路径下所有的文件。同时,为了避免这个目录里的文件类型过多,我使用一个 if 语句用于条件判断,只提取.xlsx 结尾的文件。

现在,用 Excel 实现调查问卷自动化的主要功能已经都实现了。接下来,我们看看怎样实现整个工作过程。我把它们的工作流程定义为三个步骤:

  1. 找到整个工作过程当中重复操作的部分;
  2. 将重复操作的部分需要哪些手工操作找出来,使用 Python 编写程序代替手工操作的部分;
  3. 对重复的部分,使用循环语句进行批量处理。

 通过时序图来直观的体现这些步骤

如何快速地批量处理内容相似的Excel?_第2张图片

回到我们的 Excel 做调查问卷的场景。当我们回收了调查问卷之后,每份问卷的格式是完全相同的,刚好可以利用上面提到的循环功能处理每份问卷。而问卷的选项则是我们需要提取出来用于汇总的,所以我们要使用 Python 实现读取 Excel 调查问卷的功能,最后再写入到一个新的 Excel 中。

具体代码实现 

# 导入excel和文件操作库
import xlrd
import xlwt
from pathlib import Path, PurePath

# 指定要合并excel的路径
src_path = 'E:/python自动化办公/自动化办公文件/拆分与合并/调查问卷'
# 指定合并完成的路径
dst_file = 'E:/python自动化办公/自动化办公文件/拆分与合并/写入.xls'
# 取得该目录下所有的xlsx格式文件
p = Path(src_path)
files = [x for x in p.iterdir() if PurePath(x).match('*.xls')]

# 准备一个列表存放读取结果
content = []
# 对每一个文件进行重复处理
for file in files:
    # 用文件名作为每个用户的标识
    username = file.stem
    data = xlrd.open_workbook(file)
    table = data.sheets()[0]
    # 取得每一项的结果
    answer1 = table.cell_value(rowx=1, colx=1)
    answer2 = table.cell_value(rowx=1, colx=2)
    temp = f'{username},{answer1},{answer2}'
    # 合并为一行先存储起来
    content.append(temp.split(','))
    print(temp)
    # 输出
    # 张三,D,B
    # 李四,D,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)


如何快速地批量处理内容相似的Excel?_第3张图片

 最终就将两个表格合并成了一个,以追加的方式

如何实现拆分呢

如何实现拆分呢 对于批量操作 Excel,还有一种情况是批量拆分。比如很多公司会用 Excel 记录和统计员工的薪水、记录货物信息、记录客户情况等数据。 这些数据越来越多之后,文件会越来越大,打开文件和查找速度就会变得很慢, 最后只好按照某些列进行 Excel 的拆分。接下来,我就为你讲解一下如何进行 Excel 的批量拆分。 让我们来看一个工资条的案例。例如我在一个 Excel 中存放了工资信息, 需要把第一行的表头和员工工资拆分成一个以员工名字命名的 Excel 文件。我来带你看下具体该怎么操作:

 如果把拆分工作也画成时序图,就会发现,逐行读取可以使用循环功能批量操作,对每一行的内容处理, 如果能使用 Python 进行自动化的话,一个 Excel 拆分的工作就全部能使用 Python 自动化实现了。 所以,我打算设计一个 for 循环语句用于遍历所有的行,在 for 循环语句当中实现对每一行具体内容的处理

代码实现

import xlrd
import xlwt
from pathlib import Path, PurePath

# 指定要拆分excel的路径
salary_file = 'E:/python自动化办公/自动化办公文件/拆分与合并/薪水表/薪水.xls'
# 指定拆分保存完成的路径
dst_path = 'E:/python自动化办公/自动化办公文件/拆分与合并/薪水表'

data = xlrd.open_workbook(salary_file)
table = data.sheets()[0]
# 取得表头
salary_header = table.row_values(rowx=0, start_colx=0, end_colx=None)


# 定义写入文件的函数
def write_to_file(filename, cnt):
    ''' 
    filename : 写入的文件名
    cnt      : 写入的内容
    '''
    workbook = xlwt.Workbook(encoding='utf-8')
    xlsheet = workbook.add_sheet("本月工资")

    row = 0
    for line in cnt:
        col = 0
        for cell in line:
            xlsheet.write(row, col, cell)
            col += 1
        row += 1

    workbook.save(PurePath(dst_path).with_name(filename).with_suffix('.xlsx'))


# 取得员工数量
employee_number = table.nrows
# 取得每一行,并用第二个单元格作为新的文件名
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?_第4张图片

 这样就完成了拆分 在这段代码的第一行,我使用了一个 range 函数,它会生成从 1 到员工总数的数字范围。你可能会问, 为什么没有直接写出 Excel 中总员工的数量,而是使用 employee_number 这样一个变量呢? 这是因为,如果直接写出员工数量,一旦遇到员工入职或员工离职等情况,你就需要根据 Excel 中的行数重新编写 Python 代码, 而我现在使用的方式是每次打开 Excel 文件,会自动统计员工的数量(即行数),这种编写代码的方式能够让你的程序有更好的扩展性, 一般这种方式用于处理文件内容经常变动的情况。文件的批量拆分也是通过循环来实现逐行处理的功能的, 但是你需要注意拆分以后的要保存的文件名称不要重复,不然很容易导致 Excel 中只有最后一次循环写入的内容。

你可能感兴趣的:(python自动化办公,python,自动化)