# excel下拉清單導出,資料校驗
def xlsx_excel(headers, results, filename):
excel_stream = io.BytesIO()
workbook = xlsxwriter.Workbook(excel_stream)
worksheet = workbook.add_worksheet()
# 數字格式
header_format = workbook.add_format({
'num_format': '@',
})
# 下拉清單校驗格式
data_validate = {'validate': 'list', 'source': ['是', '否']}
data_validate1 = {'validate': 'list', 'source': ['有', '無']}
# 日期格式校驗
date_validate = {'validate': 'date',
'criteria': 'between',
'minimum': date(2018, 1, 1),
'maximum': date(9999, 12, 12)}
for i in range(len(headers)):
# 寫入校驗規則
if isinstance(headers[i], tuple):
# 寫入計算公式
if "自動計算" in headers[i][0]:
worksheet.write(0, i, headers[i][0])
worksheet.write_formula(1, i, headers[i][1], header_format)
# 使用之前定義的header_format數字格式
elif "text" in headers[i][1]:
r = headers[i][1].replace('text', '')
worksheet.write(0, i, headers[i][0], workbook.add_format({'font_color': 'red'}))
worksheet.set_column("{}:{}".format(r, r), None, header_format)
# 使用之前定義的date_validate日期格式
elif "date" in headers[i][1]:
r = headers[i][1].replace('date', '')
worksheet.write(0, i, headers[i][0], workbook.add_format({'font_color': 'red'}))
worksheet.data_validation('{}2:{}1048576'.format(r, r), date_validate)
# 使用之前定義的data_validate下拉規則
else:
worksheet.write(0, i, headers[i][0], workbook.add_format({'font_color': 'red'}))
worksheet.data_validation('{}2:{}1048576'.format(headers[i][1], headers[i][1]), data_validate)
else:
worksheet.write(0, i, headers[i], workbook.add_format({'font_color': 'red'}))
# 整行寫入資料
for x in range(len(results)):
worksheet.write_row("A{}".format(x + 2), results[x])
workbook.close()
xlsx_data = excel_stream.getvalue()
response = HttpResponse(content_type='application/ms-excel')
response['Content-Disposition'] = 'attachment; filename=%s.xlsx' % filename
response.write(xlsx_data)
return response
headers = [("日期", 'dateA'), "姓名", ("手機号", "textC"), "數字一", "數字二",
("合計(自動計算)", "=D2+E2")]
results = [["2019/1/1", "張三", "18888888888", "1000", 1000]]
filename = "test_excel"
xlsx_excel(headers, results, filename)