用python读写excel需要导入xlrd(读),xlwd(写)模块:
前提准备:
1.先pip安装xlrd : >>pip install xlrd
pip安装xlwt : >>pip install xlwt
安装方法二:
豆瓣源安装pip install -i https://pypi.douban.com/simple xlwt
xlrd:
2.xlrd :下面是我写的一个读取excel的类
excel表:
image.png
运行结果:
image.png
import xlrd
import os
class ExcelReade(object):
def __init__(self, excel_name, sheet_name):
"""
# 我把excel放在工程包的data文件夹中:
# 1.需要先获取到工程文件的地址
# 2.再找到excel的文件地址(比写死的绝对路径灵活)
os.path.relpath(__file__)
1.根据系统获取绝对路径
2.会根据电脑系统自动匹配路径:mac路径用/,windows路径用\
3.直接使用__file__方法是不会自动适配环境的
"""
# 获取当前.py文件所在文件夹层
dir_path = os.path.dirname(os.path.realpath(__file__))
# 再次向上获取工程的文件夹层
project_path = os.path.dirname(dir_path)
# 获取excel所在文件目录
self.excel_path = os.path.join(project_path, "data", excel_name)
# 打开指定的excel文件
self.date = xlrd.open_workbook(self.excel_path)
# 找到指定的sheet页
self.table = self.date.sheet_by_name(sheet_name)
self.rows = self.table.nrows # 获取总行数
self.cols = self.table.ncols # 获取总列数
def data_dict(self):
if self.rows <= 1:
print("总行数小于等于1,路径:", end='')
print(self.excel_path)
return False
else:
# 将列表的第一行设置为字典的key值
keys = self.table.row_values(0)
# 定义一个数组
data = []
# 从第二行开始读取数据,循环rows(总行数)-1次
for i in range(1, self.rows):
# 循环内定义一个字典,每次循环都会清空
dict = {}
# 从第一列开始读取数据,循环cols(总列数)次
for j in range(0, self.cols):
# 将value值关联同一列的key值
dict[keys[j]] = self.table.row_values(i)[j]
# 将关联后的字典放到数组里
data.append(dict)
return data
if __name__ == '__main__':
start = ExcelReade('student_data.xls', u'Sheet1')
data = start.data_dict()
for i in range(len(data)):
print(data[i])
- 还有一些能用到的方法:
获取单元格
date = xlrd.open_workbook(excel_path)
table = date.sheet_by_name(sheet_name)
value = table.cell(1, 2).value # 获取第二行第三列单元格的值
我们填写excel时可能会带有一些肉眼难以发现的空格之类的,可以使用strip() 方法,用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。
- 语法:str.strip([chars])
- 参数:chars -- 移除字符串头尾指定的字符序列。
[✔] 注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。
xlwt:
xlwt:下面是我写的一个覆盖写入的类:
import xlwt
import os
# excel的存放路径
excel_path = r'C:\Users\zd\Desktop\test.xls'
class ExcelWrite(object):
def __init__(self):
self.excel = xlwt.Workbook() # 创建一个工作簿
self.sheet = self.excel.add_sheet('Sheet1') # 创建一个工作表
# 写入单个值
def write_value(self, cell, value):
'''
- cell: 传入一个单元格坐标参数,例如:cell=(0,0),表示修改第一行第一列
'''
self.sheet.write(*cell, value)
# (覆盖写入)要先用remove(),移动到指定路径,不然第二次在同一个路径保存会报错
os.remove(excel_path)
self.excel.save(excel_path)
# 写入多个值
def write_values(self, cells, values):
'''
- cells: 传入一个单元格坐标参数的list,
- values: 传入一个修改值的list,
例如:cells = [(0, 0), (0, 1)],values = ('a', 'b')
表示将列表第一行第一列和第一行第二列,分别修改为 a 和 b
'''
# 判断坐标参数和写入值的数量是否相等
if len(cells) == len(values):
for i in range(len(values)):
self.write_value(cells[i], values[i])
else:
print("传参错误,单元格:%i个,写入值:%i个" % (len(cells), len(values)))
if __name__ == '__main__':
start = ExcelWrite()
cells1 = [(0, 0), (0, 1)]
values1 = ('飞猪', '哈哈')
start.write_values(cells1, values1)
运行结果:
image.png