Python 利用Ajax上傳excel文件將數據導入數據庫

HTML的代碼:

<input id="CONTENTS" type="file" name="CONTENTS" value="" required style="display: inline-block;">
<button class="btn btn-default bt-btn1" οnclick="import_elder_information();return false;">導入記錄</button>

效果如下:

JavaScript的代碼:

function import_elder_information() {
        if($('#CONTENTS').val == '')
        {
            swal('請選擇導入文件!');
            return false;
        }
        var formData = new FormData();

        formData.append("content",$('#CONTENTS')[0].files[0]);

        $.ajax({
            url: '/sqb/management_living/living_elder/nursing_record/import_record',
            dataType: 'json',
            async: false,
            data:formData,
            type: 'post',
            processData : false, // 使數據不做處理
            contentType : false, // 不要設置Content-Type請求頭
            success: function (data) {
                console.log(data);
                alert('導入成功');
                
            },
            error: function (data) {
                alert('error');
            }
        })
    }

Ajax上傳文件就這麼寫就對了

Python的代碼:

import openpyxl
@sqb.route('/import_user', methods=['GET', 'POST'])
def import_record(*_arg, **_kwarg):
    try:
        result = []
        CONTENTS = request.files.get('content')
        # # 打開excel文件,獲取工作簿對象
        # # wb = openpyxl.load_workbook('F:/info.xlsx')
        if CONTENTS:
            folder_url = 'excel'
            result = upload_files_by_folder_name(CONTENTS, folder_url)
            if 'error' in result[0]:
                print(result[0]['error'])
            else:
                url = result[0]['dirname'] + '/' + result[0]['filename']
        else:
            return 0
        wb = openpyxl.load_workbook(url)
        # 從表單中獲取單元格的內容
        sheet = wb['數據錄入']  # 當前表單

        #從第二行開始讀取數據,因爲第一行是標題
        for i in range(2, sheet.max_row):
            #列是從1開始的
            elder_name = sheet.cell(i, 1).value  # 老人姓名
            age= sheet.cell(i, 2).value  # 年齡

            #插入數據庫,自己寫,寫法不一樣
            insert_sql = """insert into user(name,age) values(%s,%s)"""
            db_helper.updateSql(insert_sql,pargm=[name, age])
            
        result.append(elder_name)
        result = json.dumps(result)
        return result
    except Exception as exc:
        ex_str = traceback.format_exc()
        logger.error('error', exc_info=True)
        resp = make_response(render_template('error.html', errormsg=exc, hot_line=hot_line,copy_right=copy_right))
        return resp


def upload_files_by_folder_name(file_obj, folder_url):
    """
    文件上傳
    :param file_obj:
    :param folder_url:
    :return:
    """
    error = False
    result = []
    if file_obj and upload_allowed_file(file_obj.filename):
        fname, fext = os.path.splitext(file_obj.filename)
        rnd_name = '%s%s' % (gen_rnd_filename(), fext)
        filepath = os.path.join(sqb.static_folder, 'upload/%s' % folder_url, rnd_name)
        # 檢查路徑是否存在,不存在則創建
        dirname = os.path.dirname(filepath)
        if not os.path.exists(dirname):
            try:
                os.makedirs(dirname)
            except:
                error = 'ERROR_CREATE_DIR'
        elif not os.access(dirname, os.W_OK):
            error = 'ERROR_DIR_NOT_WRITEABLE'
        if error:
            result.append({'error': error})
        else:
            file_obj.save(filepath)
            url = 'http://' + get_env('domain_name') + '/upload/%s/%s' % (folder_url, rnd_name)
            result.append({"filename": rnd_name, "url": url,"dirname":dirname})
    return result

excel的表格就如下所示:

這樣基本就完成了一個簡單的python導入

發佈了23 篇原創文章 · 獲贊 8 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章