使用xlwt
-
示例
def excel_(headers, result, file_name, horizontal=True): f = xlwt.Workbook() default_easyxf = xlwt.easyxf(num_format_str='0.00') sheet1 = f.add_sheet('sheet1') # 標紅加粗 # style = "font:colour_index 10, bold False" # style = xlwt.easyxf(style) if horizontal: for i in range(0, len(headers)): if isinstance(headers[i], tuple): sheet1.write(0, i, headers[i][0], xlwt.easyxf(headers[i][1])) continue sheet1.write(0, i, headers[i]) row_index = 0 else: r = [] for k, v in zip(headers, result): r.append([k, v]) result = r row_index = -1 for rows in result: row_index += 1 for j in range(0, len(rows)): try: if not rows[j]: r = '' elif '.' in str(rows[j]): r = float(rows[j]) else: r = int(rows[j]) except ValueError: r = rows[j] if isinstance(r, (int, float)): # 數值格式 if r < 10000000000: sheet1.write(row_index, j, r, default_easyxf) else: sheet1.write(row_index, j, str(r)) else: sheet1.write(row_index, j, str(r)) # 保存到本地 # f.save("/User/name/{}".format(file_name)) excel_stream = io.BytesIO() # BytesIO流(在內存中讀寫) f.save(excel_stream) res = excel_stream.getvalue() excel_stream.close() response = HttpResponse(content_type='application/vnd.ms-excel') from urllib import parse response['Content-Disposition'] = 'attachment;filename=' + parse.quote(file_name) response.write(res) return response headers = ["姓名", ("手機號", "font:colour_index 10, bold False")] results = [["李白", "1888888888"], ["杜甫", "19999999999"]] file_name = "test.xlsx" excel_(headers, results, file_name)
使用xlsxwriter
-
示例
# 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)
- 參考鏈接:python生成Excel的兩種方式