上次课我们讲到了 Excel 文档公式、图表以及单元格的操作。 image.png 本次课我们来讲下工作簿和工作表的拆分和合并。在工作中,我们时常会遇到工作簿或者工作表的拆分。当工作簿或者工作表的内容较少时,手动拆分勉强可以接受。当工作簿或者工作表的内容较多时,手动拆分简直就是噩梦,不但耗时,而且容易出错,做这样的工作也没有任何的成就感。像这种重复机械的工作便是自动化办公的用武之地,不但高效,而且不会出错。大大提高了我们的工作效率,下面我们通过几个例子来感受下自动化办公在提高工作效率方面的威力。

# 1.将一个工作表的内容拆分到多个工作簿中

要拆分的工作表的内容如下图所示: image.png 工作表总共有 11 行,其中包括标题 1 行,数据 10 行。现在我们要做的是将这 10 行数据拆分到 10 个工作表中,拆分后的工作表包含标题 1 行和数据 1 行。完成上述拆分的代码如下:

import openpyxl
import os


wb = openpyxl.load_workbook('employees.xlsx')
ws = wb.active

# 获取工作表的数据标题
title = []

for row in ws.iter_rows(min_row=1, max_row=1):
    title = [cell.value for cell in row]

i = 1
# 从第二行开始遍历工作表的每一行
for row in ws.iter_rows(min_row=2):
    wb_new = openpyxl.Workbook()
    ws_new = wb_new.active
    ws_new.append(title)

    # 获取每一行的内容并添加到工作簿
    values = [cell.value for cell in row]
    ws_new.append(values)
    ws_new.title = 'employee' + str(values[0])

    wb_new.save(os.getcwd() + '/employee/employee' + str(values[0]) + '.xlsx')

    i += 1

wb_new.close()
wb.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

在上面的代码中:

1.打开文档并获取当前活跃的工作表。 2.获取工作表的数据标题。 3.从数据开始的第二行开始遍历,遍历时首先新建一个工作簿并获取当前活跃的工作表,将数据内容添加到新的工作表中并对新工作簿进行保存。

执行完上述代码之后,一个工作簿被拆分成了 10 工作簿,如下图所示: image.png 每个工作簿的内容(只是内容不同,形式是一样的)如下所示: image.png

# 2.将一个工作簿的多个工作表拆分到多个工作簿中

上面讲的是将一个工作表的内容拆分到多个工作簿中,下面我们来讲将一个工作簿的多个工作表拆分到多个工作簿中。要拆分的工作簿的内容如下图所示: image.png 上面工作簿中总共有 10 张工作表,每个工作表包含一行数据标题和一行数据。下面我们要做的是将这 10 张工作表拆分到 10 个工作簿中。完成上述拆分的代码如下:

import openpyxl
import os


wb = openpyxl.load_workbook('merge.xlsx')

for ws in wb.worksheets:
    wb_new = openpyxl.Workbook()
    ws_new = wb_new.active
    for row_data in ws.iter_rows():
        for row_cell in row_data:
            ws_new[row_cell.coordinate].value = row_cell.value
    ws_new.title = ws.title

    wb_new.save(os.getcwd() + "/employee/" + ws.title + ".xlsx")

wb_new.close()
wb.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

在上面的代码中:

1.打开工作簿。 2.遍历工作簿中的每一个工作表,并把工作表的内容写到一个新的工作簿中。

执行完上述代码之后,工作簿中的工作表被拆分到了 10 工作簿,如下图所示: image.png 每个工作簿的内容(只是内容不同,形式是一样的)如下所示: image.png

# 3.将多个工作簿内容合并到一个工作表中

上面两个例子讲的是工作簿的拆分,下面讲下工作簿的合并。要合并的工作簿如下图所示: image.png 我们要将上面 10 个工作簿的内容合并到一个工作簿的工作表中。每个工作簿的内容(只是内容不同,形式是一样的)如下所示: image.png 完成上述合并的代码如下:

import os
import glob
import openpyxl


# 获取指定目录下所有的 xlsx 文件
xlsx_files = glob.glob(os.path.join(os.getcwd()+'/employee', '*.xlsx'))

# 创建一个新的工作簿
wb_new = openpyxl.Workbook()
ws_new = wb_new.active
ws_new.title = 'merge'
is_first_file = True

# 遍历所有的Excel文件
for filename in xlsx_files:
    print(filename)
    wb = openpyxl.load_workbook(filename)
    # 获取每个Excel文件中活跃的工作表
    ws = wb.active
    # 按行获取所有单元格
    if is_first_file:
        for row in ws.iter_rows(min_row=1):
            values = []
            for cell in row:
                values.append(cell.value)
            # values = [cell.value for cell in row]
            # 向表格末尾添加数据
            ws_new.append(values)
            is_first_file = False
    else:
        for row in ws.iter_rows(min_row=2):
            values = []
            for cell in row:
                values.append(cell.value)
            # values = [cell.value for cell in row]
            # 向表格末尾添加数据
            ws_new.append(values)

wb_new.save('merge.xlsx')
wb_new.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

在上面的代码中:

1.获取指定目录下所有的 xlsx 文件,这里便是我们要合并的 10 个工作簿。 2.创建一个新的工作簿,用来容纳要合并的内容。 3.遍历所有的工作簿,获取工作簿的内容并添加到新的工作簿中并对新的工作簿进行保存。

合并后的工作簿的内容如下图所示: image.png

# 4.将多个工作簿内容合并到一个工作簿的多个工作表中

上面讲到的是将多个工作簿内容合并到一个工作表中,下面来讲下将多个工作簿内容合并到一个工作簿的多个工作表中。要合并的工作簿如下图所示: image.png 我们要将上面 10 个工作簿的内容合并到一个工作簿的 10 个工作表中。每个工作簿的内容(只是内容不同,形式是一样的)如下所示: image.png 完成上述合并的代码如下:

import os
import glob
import openpyxl


# 创建一个新的工作簿
wb_new = openpyxl.Workbook()

xlsx_files = glob.glob(os.path.join(os.getcwd()+'/employee', '*.xlsx'))

# 遍历所有的Excel文件
for filename in xlsx_files:
    # 新建一个工作表
    ws_new = wb_new.create_sheet()
    wb = openpyxl.load_workbook(filename)
    # 获取每个Excel文件中活跃的工作表
    ws = wb.active
    # 按行获取所有单元格
    for row in ws.iter_rows(min_row=1):
        values = [cell.value for cell in row]
        # 向表格末尾添加数据
        ws_new.append(values)
        ws_new.title = ws.title
        print(ws.title)

wb_new.remove(wb_new['Sheet'])
wb_new.save('merge2.xlsx')
wb_new.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

在上面的代码中:

1.获取指定目录下所有的 xlsx 文件,这里便是我们要合并的 10 个工作簿。 2.遍历所有的 xlsx 文件,每遍历一个文件,新建一个工作表,将文件的内容写入到新的工作表中。 3.保存合并后的工作簿。

合并后的工作簿的内容如下图所示: image.png

# 5.小结

image.png

更新于: 12/30/2021, 2:46:39 AM