一、Python处理Excel的模块大概有以下几个:
XlsxWrite、openpyxl、xlrd&xlwt、Microsoft Excel,其差异大致如下:
二、前一篇文章处理过将数据写入Excel文件,使用的是XlsxWrite模块,
现在介绍一下,python如何读取Excel内容,将其中的数据写入数据库中
1、说明:
此次项目有个需求是前端页面上传一份Excel文件,后端这边将其内容读取到,并存入数据库中
2、做法:
大概有两个点,接收上传的文件,读取Excel内容,存入数据库中
2.1 Flask有个处理接收到的文件的方法,request.files 方法,即可获取到前端上传过来的文件,读取Excel使用的是 XlsxWriter==1.1.0
pip install xlsxwrite 即可
具体的代码实现如下
# 导入Excel数据
@blue_pro.route('/importExcel', methods=['POST'])
def importExcel():
if request.files.has_key('file'):
file = request.files['file']
allow_file = '.' in file.filename and file.filename.rsplit('.', 1)[1] in ['xlsx']
if file and allow_file:
# 解析文件内容
workbook = load_workbook(file)
sheet = workbook.active
max_row = sheet.max_row
# 验证合同号是否重复
contId_list = db.session.query(ProjectUnique.contractId).all()
clo_id_list = []
for col in sheet.iter_cols(min_row=2, max_row=max_row, min_col=4, max_col=4):
for cell in col:
clo_id_list.append((cell.value,))
# 求交集,已存在的合同号
exist_list = list(set(clo_id_list).intersection(set(contId_list)))
if exist_list:
# 合同号存在,不处理
existIds_list = map(lambda x: x[0], exist_list)
return resp_json(402, u'导入失败,合同号已存在', existIds_list, None, 1)
else:
# 处理数据
for rows in range(max_row - 1):
row_info_list = []
for row in list(sheet.rows)[1 + rows]:
row_info_list.append(row.value)
del row_info_list[0]
# 日期处理
start_time = None
end_time = None
if row_info_list[3]:
try:
row_info_list[3] = str(row_info_list[3])
start_time = row_info_list[3].split('/')[0]
end_time = row_info_list[3].split('/')[1]
start_time = datetime.strptime(start_time, '%Y-%m-%d').date()
end_time = datetime.strptime(end_time, '%Y-%m-%d').date()
except:
return resp_json(402, u'日期时间不符', None, None, 1)
if row_info_list[5]:
try:
row_info_list[5] = row_info_list[5] * 10000
except:
return resp_json(402, u'预算金额不符', None, None, 1)
if row_info_list[6]:
try:
row_info_list[6] = row_info_list[6] * 10000
except:
return resp_json(402, u'采购金额不符', None, None, 1)
del row_info_list[3]
row_info_list.append(start_time)
row_info_list.append(end_time)
# 项目信息表添加
pinfo_obj = ProjectInfo()
pinfo_obj.read_excel(row_info_list)
db.session.add(pinfo_obj)
try:
db.session.commit()
except:
db.session.rollback()
return resp_json(501, u'信息处理失败', None, None, 1)
# 2.项目唯一表
punique_obj = ProjectUnique(contractId=row_info_list[2], proinfoId=pinfo_obj.id)
db.session.add(punique_obj)
try:
db.session.commit()
except:
db.session.rollback()
return resp_json(501, u'信息添加失败', None, None, 1)
return resp_json(200, u'数据处理成功,已入库', None, None, 0)
else:
return resp_json(401, u'上传失败,文件名后缀不符', None, None, 1)
else:
return resp_json(400, u'上传失败', None, None, 1)