본문으로 바로가기

django 엑셀 파일 업로드, 엑셀 파일 읽기

category Python 2019. 10. 18. 18:51

template

 

 

<form id="frm_excel" name="frm_excel" enctype="multipart/form-data">

  <input type="file" name="file_excel" >

  <button type="button" onclick="execl_upload();">업로드</button>

</form>

<script>

//엑셀 업로드
        function execl_upload(){
            if(!$('#file_excel').val()){
                alert('엑셀 파일을 입력하세요');
            }else{

                var ext = $('#file_excel').val().split('.').pop().toLowerCase();
                if($.inArray(ext, ['xls','xlsx']) == -1) {
	                alert('엑셀 파일만 업로드 할 수 있습니다.');
                }else{
                    if (confirm('엑셀을 반영 하시겠습니까?')){

                       var ajax_url = "{% url 'member:salary_update_excel' %}";

                       // Get form
                       var form = $('#frm_excel')[0];

                       // Create an FormData object
                       var formData = new FormData(form);

                       var params = "";
                       var msg = "";
                       $.ajax({
                           type: "post",
                           enctype: 'multipart/form-data',
                           processData: false,
                           contentType: false,
                           url: ajax_url,
                           //data:params,
                           data: formData,
                           dataType: "JSON", // JSON 리턴
                           headers:{"X-CSRFToken": csrftoken},
                           beforeSend: function () {
                           },
                           success: function (data) {
                               // success
                               alert(data.rtnmsg);
                               if (data.state) {
                                   location.reload();
                               }
                           },
                           complete: function (data) {
                               // 통신이 실패했어도 완료가 되었을 때
                           },
                           error: function (xhr, status, error) {
                               alert("통신 에러");
                           },
                           timeout: 100000 //응답제한시간 ms
                       });

                    }
                }
            }
        }
        
        
 </script>

 

 

 

views.py

 

파일을 읽을땐  openpyxl 설치

pip install openpyxl

from openpyxl import load_workbook



def salary_update_excel(request):
    if request.method == 'POST':

        # 파일 저장
        # file = request.FILES['file_excel']
        # fs = FileSystemStorage()
        # filename = fs.save(file.name, file)
        # uploaded_file_url = fs.url(filename)
        # print(uploaded_file_url)

        file = request.FILES['file_excel']
        
        # data_only=Ture로 해줘야 수식이 아닌 값으로 받아온다.
        load_wb = load_workbook(file, data_only=True)
        
        # 시트 이름으로 불러오기
        load_ws = load_wb['Sheet1']

        # 셀 주소로 값 출력
        # print(load_ws['A1'].value)

        # 일단 리스트에 담기
        all_values = []
        for row in load_ws.rows:
            row_value = []
            for cell in row:
                row_value.append(cell.value)
            all_values.append(row_value)

        cnt = 0
        for idx, val in enumerate(all_values):
            if idx == 0:
                #엑셀 형식 체크 (첫번째의 제목 row)
                if val[0]!='항목1' or val[1]!='항목2' or val[2]!='항목3':
                    context = {'state': False, 'rtnmsg': '엑셀 항목이 올바르지 않습니다.'}
                    return HttpResponse(json.dumps(context), content_type="application/json")
            else:
                # print(type(val[2]))
                if val[2] and type(val[2]) == int :
                    memData = Member.objects.get(msabun=val[0], mname=val[1])
                    memData.myear_salary = val[2]
                    memData.save()
                    cnt += 1


        context = {'state': True, 'rtnmsg' : '{0}건의 엑셀 데이터가 반영 되었습니다.'.format(cnt)}
        return HttpResponse(json.dumps(context), content_type="application/json")

 

참고 : https://myjamong.tistory.com/51

 

 

* 파일 저장시  setting.py에 아래 내용 추가 + files디렉토리 생성

 

# 파일 저장 경로
MEDIA_ROOT = os.path.join(BASE_DIR, 'files')
MEDIA_URL = '/files/'