关于这个问题,网上大部分讲解只注重效果而忽略了很多细节导致不少网页制作爱好的朋友陷入泥潭。博主这里采用的是Python3的Openpyxl库来利用Flask的文件选择框将选中的EXCEL文件导入到网页中并以table的形式显示。步骤如下:
- html中建立一个form,包含文件选择框,注意后面的属性**“multipart/form-data”**,而且这里只需EXCEL文件,因而需要设置一个文件过滤器——accept=".xls,.xlsx"。代码如下:
<form class='form-control' action="/show1" method="post" enctype="multipart/form-data">
<div class="col-sm-4">
<input type="file" name="files" value="请选择一个EXCEL文件" accept=".xls,.xlsx">
</div>
<div class="col-sm-4">
<input type="submit">
</div>
</form>
- Flask路由中加入如下的函数处理表单的提交。这里就是核心问题了。第一,首先应该将文件下载到工程环境中,即save。(我这里建了一个文件夹tableinfo,所以else里的第二行代码会这么写)。其次,再利用openpyxl加载文件,即load_workbook这个函数(新手注意路径的写法哈,相对路径前面有一点表示当前工程的路径)。openpyxl操作excel文件仍然分为三部分:
(一)创建workbook
(二)创建表单
(三) 遍历单元格。
这里特别特别注意:
创建表单时表单的名字是在EXCEL中有标注的,仔细看看左下方一行的值。(见下图)
最重要的来了:遍历时一定注意:表单的下标从1开始。(仔细观察上图左边的标注,这就是下标)。其次,行数和列数均是最大行数和最大列数,什么意思呢?是说你表单能够容纳数据的行数和列数。表单没有填充满当然会存在空值了。所以需要对空值处理。比如下列代码判断为空跳出循环:
if sheet1.cell(1,i).value is None:
break
好了,详细的代码如下:
@app.route('/show1',methods=['POST','GET'])
def show1():
if fl.request.method=='GET':
return fl.render_template('Test5_temp.html',finall=-1)
else:
file = fl.request.files['files']
filepath = os.path.join(os.path.join(os.getcwd(), 'tableinfo'), file.filename)
file.save(filepath)
book=openpyxl.load_workbook('./tableinfo/'+file.filename)
sheet1=book['Sheet1']
finall="<tr>"
for i in range(1,sheet1.max_row):
if sheet1.cell(1,i).value is None:
break
print(sheet1.cell(1,i).value)
finall+="<th>"+str(sheet1.cell(1,i).value)+"</th>"
finall+="</tr>"
for i in range(2,sheet1.max_row):
if sheet1.cell(i,1).value is None:
break
finall+="<tr>"
for j in range(1,sheet1.max_column):
if sheet1.cell(i,j).value is None:
break
finall+="<td>"+str(sheet1.cell(i,j).value)+"</td>"
finall+="</tr>"
return fl.render_template('Test5_temp.html',finall=finall)
#读文件操作
最后来一波结果图庆祝一下两个小时奋战的结果: