其实整个过程比较简单,利用xlrd读取excel文件,再把读取到的数据转换为dict即可。
pip install xlrd
导入的excel表格的格式是这样的:
解析后的格式为
[{'编号': 1, '时间': '1988-07-21 00:00:00', '年龄': 1, '分数': 63.2, '总分': 1},
{'编号': 2, '时间': '1988-07-21 00:00:00', '年龄': 1, '分数': 63.2, '总分': 1},
{'编号': 3, '时间': '1988-07-21 00:00:00', '年龄': 1, '分数': 63.2, '总分': 1},
{'编号': 4, '时间': '1988-07-21 00:00:00', '年龄': 1, '分数': 63.2, '总分': 1},
{'编号': 5, '时间': '1988-07-21 00:00:00', '年龄': 1, '分数': 63.2, '总分': 1},
{'编号': 6, '时间': '1988-07-21 00:00:00', '年龄': 1, '分数': 63.2, '总分': 1}
]
这里只写出主要的代码段
# excel转dict
def excel_to_dict(self, *args, **kwargs):
"""
excel转dict
1.传来的文件可以是文件路径,也可以是二进制文件
2.传来的可以是二进制文件,这里以django接收前端传来文件为例:
接收用 request.FILES.get("fileName", None) 传入 my_file 即可
kwargs接收的参数有:
_sheet索引,0代表第一个表,1代表第二个表,默认0
_max表格最大的行数,默认2000行
_min表格最小的行数,默认1行
"""
# excel 文件
excel_file = self.__mark
# sheet 索引
_sheet = kwargs.get("sheet", 0)
# max 最大条数
_max = kwargs.get("max", 2000)
# min 最小条数
_min = kwargs.get("min", 0)
# 判断是否为文件路径
if os.path.exists(excel_file):
workbook = xlrd.open_workbook(excel_file)
else:
# 上传的文件不保存,直接在内存中读取文件
workbook = xlrd.open_workbook(filename=excel_file.name, file_contents=excel_file.read())
# 根据sheet索引或者名称获取sheet内容
data_sheet = workbook.sheets()[_sheet]
# 获取sheet名称,行数,列数据
sheet_name = data_sheet.name
sheet_nrows = data_sheet.nrows
sheet_ncols = data_sheet.ncols
# 文件记录不得大于2000条
if sheet_nrows > _max:
return {"code": "0001", "msg": "文件记录大于{}条,请联系管理员上传".format(_max), "data": None}
# 判断是否为空数据
if sheet_nrows <= _min:
return {"code": "0001", "msg": "空数据表格,停止导入", "data": None}
# excel转dict
get_data = []
for i in range(1, sheet_nrows):
# 定义一个空字典
sheet_data = {}
for j in range(sheet_ncols):
# 获取单元格数据类型
c_type = data_sheet.cell(i, j).ctype
# 获取单元格数据
c_cell = data_sheet.cell_value(i, j)
if c_type == 2 and c_cell % 1 == 0: # 如果是整形
c_cell = int(c_cell)
elif c_type == 3:
# 转成datetime对象
c_cell = datetime(*xlrd.xldate_as_tuple(c_cell, 0)).strftime('%Y-%m-%d %H:%M:%S')
elif c_type == 4:
c_cell = True if c_cell == 1 else False
sheet_data[data_sheet.row_values(0)[j]] = c_cell
# 循环每一个有效的单元格,将字段与值对应存储到字典中
# 字典的key就是excel表中每列第一行的字段
# sheet_data[self.keys[j]] = self.table.row_values(i)[j]
# 再将字典追加到列表中
get_data.append(sheet_data)
# 返回从excel中获取到的数据:以列表存字典的形式返回
return get_data
pip install xToolkit -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
xToolkit库是我自己封装的python内置库的一个扩展库.把python的datetime,string,list,dist,xthread等数据结构进行了功能的扩展。里面好用的功能比较多,可以前往 https://blog.csdn.net/qq_22409661/article/details/108531485 查看具体用法。
xfile.read("./result/t_excel.xls").excel_to_dict()
导入的excel表格的格式是这样的:
# excel转dict
# 1.传来的文件可以是文件路径,也可以是二进制文件
# 2.传来的可以是二进制文件,这里以django接收前端传来文件为例:
# 接收用 request.FILES.get("fileName", None) 传入 my_file 即可
# kwargs接收的参数有:
# _sheet索引,0代表第一个表,1代表第二个表,默认0
# _max表格最大的行数,默认2000行
# _min表格最小的行数,默认1行
xfile.read("./result/t_excel.xls").excel_to_dict()
>> [{'编号': 1, '时间': '1988-07-21 00:00:00', '年龄': 1, '分数': 63.2, '总分': 1},
{'编号': 2, '时间': '1988-07-21 00:00:00', '年龄': 1, '分数': 63.2, '总分': 1},
{'编号': 3, '时间': '1988-07-21 00:00:00', '年龄': 1, '分数': 63.2, '总分': 1},
{'编号': 4, '时间': '1988-07-21 00:00:00', '年龄': 1, '分数': 63.2, '总分': 1},
{'编号': 5, '时间': '1988-07-21 00:00:00', '年龄': 1, '分数': 63.2, '总分': 1},
{'编号': 6, '时间': '1988-07-21 00:00:00', '年龄': 1, '分数': 63.2, '总分': 1}
]