Python处理excel文件
这里只介绍几种常用的库。对于2003以前的excel版本,即.xls文件,只能用xlrd和xlwt库来处理;对于2003及以后的excel文件,即.xlsx文件,需要使用openpyxl库来处理,这里着重介绍这三个第三方库。
注:Workbook是对工作簿(excel)的抽象,Worksheet是对表格(sheet)的抽象,Cell是对单元格的抽象
Python处理.xlsx文件
-
导入模块
import openpyxl
-
读入一个已有的excel
# 当前路径下 r_wb = openpyxl.load_workbook('test-openpyxl.xlsx') # 指定路径下 r_wb = openpyxl.load_workbook(r'C:\Users\y84107470\PycharmProjects\excel-fun\test-openpyxl.xlsx')
-
新建一个excel
# 无论是导入的还是新建的excel,后面对Wb(Workbook),ws(worksheet)和cell的操作是一样的 w_wb = openpyxl.Workbook()
-
sheet的属性与操作
-
获取所有sheet的名称
r_sheetnames = r_wb.get_sheet_names()# 目前已弃用,不会报错,但是又警告,建议用下面的方法 r_sheetnames = r_wb.sheetnames
-
获取某个sheet的三种方法
# 按索引,获取第一个sheet r_ws = r_wb.get_sheet_by_name(r_sheetnames[0]) # 按名称,获取指定名称的sheet r_ws = r_wb.get_sheet_by_name('Sheet1') # 目前已弃用,不会报错,但是又警告,建议用下面的方法 r_ws = r_wb['Sheet1'] # 调用正在运行的sheet r_ws = r_wb.active
-
新建删除sheet
# 新建sheet,不加index参数默认插在最后 ws1 = r_wb.create_sheet(title = "page1", index = 0) # 删除sheet r_wb.remove_sheet(ws1)
-
常用sheet属性
- title:表格的标题
- dimensions:表格的大小,这里的大小是指含有数据的表格的大小,即:左上角的坐标:右下角的坐标
- max_row:表格的最大行
- min_row:表格的最小行
- max_column:表格的最大列
- min_column:表格的最小列
- rows:按行获取单元格(Cell对象) - 生成器
- columns:按列获取单元格(Cell对象) - 生成器
- freeze_panes:冻结窗格
- values:按行获取表格的内容(数据) - 生成器
-
获取或修改属性
扫描二维码关注公众号,回复: 4258247 查看本文章# 修改标题 ws1.title = "Changed" # 打印表格大小 print('dimensions:', r_ws.dimensions) #输出:A1:C4 # 获取表格的最小行(最大行,最大最小列同理) min_r = r_ws.min_row #冻结第一行标题行 ws.freeze_panes = 'A2'
-
-
cell的属性与操作
-
获取cell
# 直接根据单元格的索引获取,坐标从(1, 1)开始 d = ws.cell(row = 4, column = 2) #通过行列读
-
cell常用属性
- row:单元格所在的行
- column:单元格坐在的列
- coordinate:单元格的坐标
- value:单元格的值
-
获取或修改属性
# 打印 print('row:', r_ws.cell(row=2, column=2).row) print('column:', r_ws.cell(row=2, column=2).column) print('coordinate:', r_ws.cell(row=2, column=2).coordinate) print('value:', r_ws.cell(row=2, column=2).value) # 修改 r_ws.cell(row=2, column=2).value = '连海平' r_ws.cell(row=2, column=2, value = '共潮生')
-
-
遍历表格数据
-
使用迭代器
# 按行操作 for row in r_ws.iter_rows('A1:C3'): # 两种方式作用是一样的 for cell in row: print('cell-value:', cell.value) for i in range(len(row)): print('row[i]:', row[i].value)
-
按行列操作
# 用行数列数 for row in range(1, 4): for col in range(1, 4): w_ws.cell(row= row, column= col, value= 'test') print('row:', row, 'col:', col, 'value:', w_ws.cell(row= row, column= col).value)
-
-
利用公式
-
求和
r_ws['C5'] = "=SUM(C2:C4)"
-
除法
r_ws['C6'] = "=SUM(C2:C3)/C4"
-
-
实例
例子说明:读入一个excel,内容如下:
将其按得分排序后,在第一列插入一列排名,结果如下:
代码如下:#!/usr/bin/env python # -*- coding:utf-8 -*- import openpyxl # 读入已有的excel(修改为自己文件的路径) r_wb = openpyxl.load_workbook(r'C:\Users\69540\Desktop\test-openpyxl.xlsx') # 获取r_wb的sheet1 r_ws = r_wb.get_sheet_by_name('Sheet1') # 获取读入的数据 title = [] data = [] data_line = [] for n_row in range(r_ws.min_row, r_ws.max_row + 1): for n_col in range(r_ws.min_column, r_ws.max_column + 1): # 获取标题行 if n_row == r_ws.min_row: title.append(r_ws.cell(row= n_row, column= n_col).value) # 获取一行数据 else: data_line.append(r_ws.cell(row= n_row, column= n_col).value) # 将一行数据保存至data列表,并清零data_line if data_line: data.append(data_line) data_line = [] # 处理数据 title_out = title data_out = data # 标题行第一列添加字符串‘排名’ title_out.insert(0, '排名') # 数据部分按第三列的得分排序,降序排列 data_out.sort(key= lambda elem:elem[2], reverse= True) for i in range(len(data_out)): data_out[i].insert(0, i + 1) #将title的合并进data_out列表中 data_out.insert(0, title_out) # 新建excel及sheet,sheet命名为rank,将数据写入 w_wb = openpyxl.Workbook() w_ws = w_wb.create_sheet(title = 'rank', index= 0) n_max_row = len(data_out) n_max_col = len(data_out[1]) for row in range(n_max_row): for col in range(n_max_col): # 写入数据 w_ws.cell(row=row + 1, column=col + 1, value=data_out[row][col]) #将新建的excel以指定的名称保存在指定的路径下(修改为自己文件的路径) w_wb.save(r'C:\Users\69540\Desktop\rank.xlsx')
Python处理.xls文件
读excel:使用xlrd库
import xlrd
# 打开一个已有的excel(当前路径下,指定路径下)
# workbook = xlrd.open_workbook('test-xlrd.xls')
workbook = xlrd.open_workbook(r'C:\Users\y84107470\PycharmProjects\excel-fun\test-xlrd.xls')
# sheet的操作
# 抓取所有sheet页的名称并打印
worksheets_name = workbook.sheet_names()
print('worksheets are:', worksheets_name)
# 定位到sheet: 1. 指定名称获取
#worksheet1 = workbook.sheet_by_name(u'Sheet1')
# 2.1 通过索引顺序获取
#worksheet1 = workbook.sheets()[0]
# 2.2 通过索引顺序获取
worksheet1 = workbook.sheet_by_index(0)
# 打印sheet的名称,行数,列数
print('sheet_attr:', worksheet1.name, worksheet1.nrows, worksheet1.ncols)
# 读取表值
# 遍历sheet1中所有行row
num_rows = worksheet1.nrows
for curr_row in range(num_rows):
row_val = worksheet1.row_values(curr_row)
print('row%s is %s' % (curr_row, row_val))
# 遍历sheet1中所有列col
num_cols = worksheet1.ncols
for curr_col in range(num_cols):
col_val = worksheet1.col_values(curr_col)
print('col%s is %s' % (curr_col, col_val))
# 遍历sheet1中所有单元格cell
for rown in range(num_rows):
for coln in range(num_cols):
cell_val = worksheet1.cell_value(rown, coln)
print(cell_val)
#获取单元格内容的数据类型(说明:ctype : 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error)
print('(1, 0)的类型为:', worksheet1.cell(1, 0).ctype) #第2行第1列:张三 为string类型
print('(1, 1)的类型为:', worksheet1.cell(1, 1).ctype) #第2行第2列:15 为number类型
写excel:使用xlwt库
#新建excel文件并写入数据,xlwt
import xlwt
#创建workbook和sheet对象
workbook = xlwt.Workbook() #注意Workbook的开头W要大写
sheet1 = workbook.add_sheet('sheet1', cell_overwrite_ok=True)
sheet2 = workbook.add_sheet('sheet2', cell_overwrite_ok=True)
#向sheet页中写入数据
name = ('李老栓', '张得帅', '曾牛逼')
score = ('22', '33', '44')
sheet1.write(0, 0, '姓名')
sheet1.write(0, 1, '得分')
for i in range(len(name)):
sheet1.write(i + 1, 0, name[i])
for i in range(len(score)):
sheet1.write(i + 1, 1, score[i])
#保存该excel文件,有同名文件时直接覆盖(保存在当前文件夹下)
workbook.save('test-xlwt.xls')
#保存该excel文件,有同名文件时直接覆盖(保存在指定文件夹下)
#workbook.save(r'C:\Users\y84107470\Desktop\test-xlwt.xls')
print('创建excel文件完成!')
补充:写excel的库xlutils
import xlrd
import xlutils.copy
#打开一个workbook
rb = xlrd.open_workbook('test.xls')
wb = xlutils.copy.copy(rb)
#获取sheet对象,通过sheet_by_index()获取的sheet对象没有write()方法
ws = wb.get_sheet(0)
#写入数据
ws.write(1, 1, 'changed!')
#添加sheet页
wb.add_sheet('sheetnnn2', cell_overwrite_ok=True)
#利用保存时同名覆盖达到修改excel文件的目的,注意未被修改的内容保持不变
wb.save('test.xls')
参考: