Python读取Excel内容

时间:2024-03-29 11:16:54

一、Python处理Excel的模块大概有以下几个:

XlsxWrite、openpyxl、xlrd&xlwt、Microsoft Excel,其差异大致如下:

Python读取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)