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/'
'Python' 카테고리의 다른 글
django 에서 raw query 사용시 like 구문 fomat 할당 에러 (0) | 2019.10.18 |
---|---|
python list 객체 for문으로 출력 (0) | 2019.10.18 |
django 내장 템플릿 필터 (0) | 2019.10.17 |
django template 에서 for문 사용하기 (model 사용하지 않고 간단한 for문) (2) | 2019.10.16 |
Django Template에서 연산이 필요할 때 mathfilters 설치 (게시글 번호 표시 참조) (0) | 2019.10.11 |