最近工作中接触excel比较多,很多重复性的工作搞得我非常不爽,于是想先学习一下excel处理,方便在后面的工作中用脚本取代手工处理,这样又可以多出几个小时用来摸鱼。
至于为什么要用python去处理而不是java,说实话python写起来确实要比java简洁很多,说到底还是为了省事,哈哈哈哈哈。
我们简单说一下python能处理excel的三方类库,通过下面表格可以看出各个类库适配的不同内容。根据我的需求,我选择了opepyxl。
openpyxl是一个用于读取/编写Excel 2010 xlsx/xlsm/xltx/xltm文件的Python库。它是由于缺乏从Python中读取/编写Office Open XML格式的现有库而诞生的。所有这些都归功于PHPExcel团队,因为openpyxl最初是基于PHPExcel的。
学习东西,笔者一般是本着用多少学多少得原则,坚决不学毫无用处得东西,因此介绍时,笔者也会从实战得角度去介绍一些常用得api,其他内容请移步官方文档进行资料查询。
pip install openpyxl
import openpyxl
from openpyxl.workbook import Workbook
这里面我们不需要在文件系统中创建一个workbook,直接引入就可以使用。还有一种常用的方式就是读取一个文件。
# 引入wb
wb = Workbook()
# 读取一个文件
wb = openpyxl.load_workbook(excel_url)
# insert at the end (default)
ws1 = wb.create_sheet("Mysheet")
# insert at first position
ws2 = wb.create_sheet("Mysheet", 0)
# insert at the penultimate position
ws3 = wb.create_sheet("Mysheet", -1)
# 同样我们可以读取已经存在的工作簿
ws = wb['Sheet1']
# 我们还能对工作簿名称进行设置
ws.title = "Sheet999"
# 获取sheet页最大行数
ws.max_row
# 获取sheet页最大列数
ws.max_column
# 获取A4单元格
c = ws['A4']
# 直接给A4单元格赋值
ws['A4'] = 4
# 还可以通过行列索引去设置对应单元格的值
ws.cell(row=4, column=2, value=10)
# 通过起始行 最大行 最大列 遍历
for row in ws.iter_rows(min_row=1, max_col=3, max_row=2):
for cell in row:
print(cell)
# 通过最大行数去逐行遍历
for row in max_row:
# 通过最大列数去逐列遍历
for cell in max_column:
wb.save('~/tmp/excel.xlsx')
我们通过一个简单得例子来运用上面学到的方法去操作excel,进行excel的读写。
我们有个字典表格sheet2,里面标明了编号对应的部门,另外一个表格sheet1中第一列列出了很多的编号,我想通过脚本把sheet1表中编号对应的部门进行补全。表格如下图
import openpyxl
from openpyxl.workbook import Workbook
from openpyxl.worksheet import worksheet
def read_excel(excel_url):
return openpyxl.load_workbook(excel_url)
# 获取sheet页最大行数
def get_max_row(ws):
return ws.max_row
# 获取sheet页最大列数
def get_max_columns(ws):
return ws.max_column
def rows_all(ws):
return ws.rows
def cols_all(ws):
return ws.columns
if __name__ == '__main__':
wb = read_excel("/Users/scott/tmp/test.xlsx")
s1 = wb['Sheet1']
s2 = wb['Sheet2']
s1_cols = s1['A']
all_rows_s1 = rows_all(s1)
# 将sheet2中对应关系进行key value存储
dict_map = {}
s2_all_rows = rows_all(s2)
for row in s2_all_rows:
cell_a = row[0]
value_a = cell_a.value
cell_b = row[1]
value_b = cell_b.value
dict_map[value_a] = value_b
s1_max_col = 2
s1_max_row_num = get_max_row(s1)+1
# 遍历sheet1 通过编号取出对应部门然后依次写入
for row_index in range(1, s1_max_row_num):
col1_val = s1.cell(row=row_index, column=1).value
value = dict_map.get(col1_val)
s1.cell(row=row_index, column=s1_max_col, value=value)
# 保存工作簿
wb.save("/Users/scott/tmp/test.xlsx")
可以看到,我们通过字典对应关系,已经在sheet1中将编号对应的部门全部填充完毕。
讲到这里,关于openpyxl类库的实战就告一段落了,一些基础的excel操作基本都能通过这些api实现。想要深入学习还需要自行去官网挖掘。感谢各位大佬观看!
点赞收藏,富婆包养✋✋