前些天,一个朋友咨询我说是否擅长操作 Excel,并且把两个 Excel 的文档发给我了。认真的听了下他的诉求,大致是需要把 A 文档的数据匹配到 B 文档,并且补充到 B 文档里,两个表格加起来共有 5 万多行的记录,这如果人肉操作怎么着也需要好几个小时。于是我开始着手 Google 看下 python 对于 excel 如果进行操作,现学现卖,最后完工。接下来就记录下这愉快的过程。

需求分析

先来看看下这两个表格的内容,A 表格有 4.5w 行,有 40 多列数据, B 表格有 6000 多行,30 多列的数据,需求是 B 表格中有一列 贷款目前状态 的数据来自 A 表,并且会涉及到重复,条件为以身份证筛选,再以姓名为基准做匹配。接下来我会脱敏举例一个 demo 进行说明。
A 表格:

序号 姓名 性别 身份证 地址 是否失信 担保人 经放人 借款方式 贷款状态
0 张三 xxxxx xxx xxx xxxxx xxx xxx 核销
1 李四 xxxxx xxx xxx xxxxx xxx xxx 置换
2 王五 xxxxx xxx xxx xxxxx xxx xxx 核销

B 表格:

序号 姓名 性别 身份证 地址 是否失信 贷款状态
0 赵六 xxxxx xxx xxx ???
1 张三 xxxxx xxx xxx ???
2 李四 xxxxx xxx xxx ???

根据以上模拟的 Excel 表格,我们需要根据名称把表格 A 的贷款状态(10列)输入到表格 B 的最后一列的贷款状态。

Python 操作 Excel 方案介绍

当 Google 一下,你会发现 Python 操作 Excel 还是有几种方法的,这里我只介绍使用 xlrdxlwt,我的电脑环境为 macOS - Version 10.15.3 (19D76),Python 版本为 Python 2.7.10 (default, Jul 30 2019, 21:28:59)。接下来是依赖库的说明。

首先介绍下 xlrd 库,它主要是用来读取 Excel 的内容,可以通过执行 pip install xlrd 来进行安装,然后在 python 脚本里通过执行 >>> import xlrd>>> help(xlrd) 可以看到 xlrd 的帮助信息,里面有 xlrd 包中的一些模块以及一些成员变量、常量、函数。具体的 xlrd API 使用说明,这个文档里都有

其次介绍下 xlwt,它主要是用来对 Excel 进行编辑的,可以通过执行 pip install xlwt 来安装,同样这个文档里也都有包含 xlwt 的 API 使用说明。

注意:

xlrd 模块:可读取 .xls 和 .xlsx 后缀表格

xlwt 模块:可写入 .xls 表格,但不支持对 .xlsx 文件的写入操作

基本 API

读取工作表:

workbook.sheets():工作表实例构成的 list,可通过索引读取工作表
workbook.save():保存修改的工作表
worksheet = workbook.sheet_by_name(‘xxx’) :通过名字打开工作簿
worksheet = workbook.sheet_by_index(i) :通过编号为 i(索引从 0 开始)的工作簿打开工作表

读取单元格内容:

注意 xlrd 库对于读取 Excel 工作簿的行和列索引都是从 0 开始
row = worksheet.row_values(i) :读取第 i 行中的所有内容,返回一个 list
col = worksheet.col_values(k) :读取第 k 列中的内容,返回一个 list
cell= worksheet.cell_value(r, c):读取第 i 行第 k 列单元格内容
workbook.get_sheet(0).write(i, k, source):获取 i 行,k 列的内容,并将内容替换为 source

代码编写

example
  • python
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import fileinput
import sys
import os
import xlrd # 读 excel
import xlwt # 写 excel
import json
from xlutils.copy import copy # 文件 copy

reload(sys)
sys.setdefaultencoding('utf8') # 解决中文字符串输出问题

START_ROW = 3 # 从 0 开始计数,前 4 行有标题和说明,真正的数据从第四行开始

# 元数据表 A
a_workbook = xlrd.open_workbook("a_table.xls")
a_sheet = a_workbook.sheet_by_index(0)
print "元数据表行数:" + str(a_sheet.nrows)
print "元数据表列数:" + str(a_sheet.ncols)

# 目标编辑表 B
b_workbook = xlrd.open_workbook("b_table.xls")
b_sheet = b_workbook.sheet_by_index(0)
print "目标数据表行数:" + str(b_sheet.nrows)
print "目标数据表列数:" + str(b_sheet.ncols)

# 复制一下表格 B 文件,作为最后的编辑表
final_workbook = copy(xlrd.open_workbook('b_table.xls'))

# 根据名称从 A 表里找出匹配的内容
def match_from_table_a(name):
source = "****************"
for index in range(START_ROW, a_sheet.nrows):
onerow = a_sheet.row_values(index)
if name == onerow[1]: # 姓名匹配
# print str(onerow[1]) +"---"+ str(onerow[10])
source = onerow[10]
break;
return source

# 循环便利目标表 B
def loop_target_xls():
for b_index in range(START_ROW, b_sheet.nrows):
one_row = b_sheet.row_values(b_index)
# string2 = json.dumps(one_row, ensure_ascii=False)
# print str(b_index)+" row : "+ (string2)
target_name = one_row[1]
print str(b_index) + ":" +target_name

# 找寻字符串
source = match_from_table_a(target_name)
final_workbook.get_sheet(0).write(b_index, 6, source)
final_workbook.save('c_table.xls') # 保存为新的 C 表格

if __name__ == '__main__':
loop_target_xls()

当以上文件和代码执行完毕后,会得到一个新文件:

C 表格:

序号 姓名 性别 身份证 地址 是否失信 贷款状态
0 赵六 xxxxx xxx xxx ???
1 张三 xxxxx xxx xxx 核销
2 李四 xxxxx xxx xxx 置换

以上内容就是 Ptyhon 库 xlrdxlwt 对 Excel 文件编写的简单内容,Enjoy, 😄