Flask学习利用Openpyxl导入外部EXCEL文件的几个坑

关于这个问题,网上大部分讲解只注重效果而忽略了很多细节导致不少网页制作爱好的朋友陷入泥潭。博主这里采用的是Python3的Openpyxl库来利用Flask的文件选择框将选中的EXCEL文件导入到网页中并以table的形式显示。步骤如下:

  1. 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>
  1. 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)
#读文件操作

最后来一波结果图庆祝一下两个小时奋战的结果:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值