openpyxl 讀取前端傳輸的檔案,並處理
阿新 • • 發佈:2021-08-09
def create(self, request, *args, **kwargs): container_type_list = settings.CONTAINER_TYPE_LIST gas_file = request.data.get('gas_file') if gas_file: """gas_file存在,建立非TA計劃申請表""" try: df = openpyxl.load_workbook(gas_file, data_only=True) sheet = df[df.sheetnames[0]] rows = get_max_row(sheet) asset_type = 'asset_type' in sheet.cell(1, 1).value asset_type_id = 'asset_type_id' in sheet.cell(1, 2).value container_type = 'container_type' in sheet.cell(1, 3).value container_type_comments = 'container_type_comments' in sheet.cell(1, 4).value is_fields_right = all([asset_type,asset_type_id,container_type,container_type_comments]) if not is_fields_right: raise Exception("欄位不匹配") except Exception as e: logger.error(e) resp = unified_response(code=status.InputErr, message='檔案格式不正確') return Response(resp) try: with transaction.atomic(): for row in range(1, rows + 1): if row > 1: asset_type = sheet.cell(row, 1).value asset_type_id = sheet.cell(row, 2).value container_type = str(sheet.cell(row, 3).value).strip() container_type_comments = sheet.cell(row, 4).value if container_type not in container_type_list: raise ValueError('上傳表格失敗,container_type:%s 不符合要求'%container_type) Gas.objects.create( asset_type=asset_type, asset_type_id=asset_type_id, container_type=container_type, container_type_comments=container_type_comments ) except ValueError as e: logger.error(e) resp = unified_response(code=status.InputErr, message=str(e)) return Response(resp) except Exception as e: logger.error(e) resp = unified_response(code=status.InputErr, message='上傳失敗,檔案內容有誤,請修改後重新上傳') return Response(resp) resp = unified_response(message='檔案上傳成功!') return Response(resp) container_type = str(request.data.get('container_type')).strip() if container_type not in container_type_list: resp = unified_response(code=status.InputErr, message='操作失敗,container_type:%s 不符合要求'%container_type) return Response(resp) return super().create(request, *args, **kwargs)