开发版本:python2.7
@resource_manage.route("/batch_import_data", methods=["POST"]) # 接口形式
@auth_decorator.requires_auth # 验证用户信息
def batch_import_data():
"""
批量导入
* file: 文件
* mode: is_device/is_station
:return:
"""
the_file = request.files.get("file")
mode = request.args.get('mode')
result = attribute_element_manager.batch_import_data(mode, the_file)
return make_response(jsonify(utility.convert_to_json(result)), 200)
将文件中的文字解读成dict形式
def batch_import_data(mode, the_file):
"""
批量导入
:param mode: is_device/is_station
:param the_file:
:return:
"""
if the_file:
f = the_file.read()
data = xlrd.open_workbook(file_contents=f)
names = data.sheet_names() # 返回表格中所有工作表的名字
for sheet_name in names:
status = data.sheet_loaded(sheet_name) # 检查sheet1是否导入完毕
if status is True:
table = data.sheet_by_name(sheet_name)
try:
keys = table.row_values(0) # 第一行作为key值
except Exception as e:
logging.error(e) # 表格中存在空sheet,或者第一行没数据
continue
if keys:
rowNum = table.nrows # 获取该sheet中的有效行数
colNum = table.ncols # 获取该sheet中的有效列数
if rowNum == 0 or colNum == 0:
continue
else:
result = [] # 列表L存放取出的数据
for i in range(1, rowNum): # 从第二行(数据行)开始取数据
sheet_data = {} # 定义一个字典用来存放对应数据
for j in range(colNum): # j对应列值
sheet_data[keys[j]] = table.row_values(i)[
j] # 把第i行第j列的值取出赋给第j列的键值,构成字典
result.append(sheet_data) # 一行值取完之后(一个字典),追加到L列表中
batch_import_data_translate_and_update(mode, result) # 这个方法就是拿到数据后的操作了
message = "success"
else:
message = "failed"
return message
开发期间遇到了一个问题,这个功能使用的是form-data格式传输的文件,所以前端认为content-type应该写上这个类型,于是就出现后端接口获取不到file,file返回None,后来把前端的这个去掉后就可以接收数据了。
下面这个是网上的一个参考代码: