前端导出Excel和后台导出Excel表
Django后台导出Excel表
教程
xlwt教程:https://www.jianshu.com/p/4e39444d5ebc
官方文档:https://xlwt.readthedocs.io/en/latest/
https://github.com/python-excel/tutorial/raw/master/python-excel.pdf
http://www.gocalf.com/blog/python-read-write-excel.html#openpyxl
XlsxWriter:
https://github.com/jmcnamara/XlsxWriter
http://xlsxwriter.readthedocs.org
openpyxl: http://openpyxl.readthedocs.io/en/default/
Microsoft excel API:https://msdn.microsoft.com/en-us/library/fp179694.aspx
xlrd用来读取excel文件,xlwt用来写excel文件,它们合作来对excel进行操作。
官方文档:http://www.python-excel.org/
xlrd官方介绍:https://pypi.python.org/pypi/xlrd/1.0.0
xlwt官方介绍:https://pypi.python.org/pypi/xlwt/1.1.2
xlutils官方介绍:https://pypi.python.org/pypi/xlutils
http://xlutils.readthedocs.io/en/latest/
导出数据到CSV文件
简单的方法。不需要安装依赖项,这是一件很好的事情。如果您不需要任何花哨的格式,请使用它。
import csv from django.http import HttpResponse from django.contrib.auth.models import User def export_users_csv(request): response = HttpResponse(content_type='text/csv') response['Content-Disposition'] = 'attachment; filename="users.csv"' writer = csv.writer(response) writer.writerow(['Username', 'First name', 'Last name', 'Email address']) users = User.objects.all().values_list('username', 'first_name', 'last_name', 'email') for user in users: writer.writerow(user) return response
将数据导出到XLS文件
如果您确实需要导出到.xls文件,请使用这个方法。你将能够添加格式为粗体字体、字体大小、定义列大小等。
首先,安装xlwt模块。最简单的方法是使用pip。
pip install xlwt
import xlwt from django.http import HttpResponse from django.contrib.auth.models import User def export_users_xls(request): response = HttpResponse(content_type='application/ms-excel') response['Content-Disposition'] = 'attachment; filename="users.xls"' wb = xlwt.Workbook(encoding='utf-8') ws = wb.add_sheet('Users') # Sheet header, first row row_num = 0 font_style = xlwt.XFStyle() font_style.font.bold = True columns = ['Username', 'First name', 'Last name', 'Email address', ] for col_num in range(len(columns)): ws.write(row_num, col_num, columns[col_num], font_style) # Sheet body, remaining rows font_style = xlwt.XFStyle() rows = User.objects.all().values_list('username', 'first_name', 'last_name', 'email') for row in rows: row_num += 1 for col_num in range(len(row)): ws.write(row_num, col_num, row[col_num], font_style) wb.save(response) return response
修改模板后导出Excel表
response = HttpResponse(content_type='application/vnd.ms-excel') response['Content-Disposition'] = 'attachment;filename=统计报表.xlsx'.encode(encoding="utf-8") workbook = load_workbook('faultStatistics/统计报表模板.xlsx') workbook.guess_types = True # 猜测格式类型 ws = workbook.active # 修改项目名称 project = TProject.objects.filter(id=project_id).first() ws['A1'] = project.project_name # 按设备名统计故障数 devices = TDevice.objects.filter(project_id=project_id).values_list("name", flat=True) data_device_list = [] for name in set(devices): device_ids = TDevice.objects.filter(name=name).values_list("id", flat=True) count = TAlarm.objects.filter(device_id__in=device_ids).count() data_device_list.append({"name": name, "num": count}) for index, item in enumerate(data_device_list): ws['A' + str(index + 4)] = item.get("name") ws['B' + str(index + 4)] = item.get("num") # 按厂家统计故障数 factorys = TDevice.objects.filter(project_id=project_id).values_list("factory", flat=True) data_factory_list = [] for factory in set(factorys): device_ids = TDevice.objects.filter(factory=factory).values_list("id", flat=True) count = TAlarm.objects.filter(device_id__in=device_ids).count() data_factory_list.append({"factory": factory, "num": count}) for index, item in enumerate(data_factory_list): ws['D' + str(index + 4)] = item.get("factory") ws['E' + str(index + 4)] = item.get("num") # 工程故障总数/已报修次数 alarm_years = TAlarm.objects.filter(project_id=project_id).values_list("create_date", flat=True) alarm_years = set([date.year for date in alarm_years if date is not None]) data_fault_by_year = [] for year in list(alarm_years): fault_total_num = TAlarm.objects.filter(project_id=project_id).filter(create_date__year=str(year)).count() fault_repair_num = TAlarm.objects.filter(project_id=project_id).filter(create_date__year=str(year)).exclude( status="UNSOLVED").count() data_fault_by_year.append({'year': str(year), 'total_num': fault_total_num, 'repair_num': fault_repair_num}) for index, item in enumerate(data_fault_by_year): ws['G' + str(index + 4)] = item.get("year") ws['H' + str(index + 4)] = item.get("total_num") ws['I' + str(index + 4)] = item.get("repair_num") # 当年设备故障比率 fault_rate_list = TAlarm.objects.filter(project_id=project_id).values("alarm_type").annotate( count=Count('alarm_type')) fault_rate_list = fault_data_by_alarm_type(fault_rate_list) fault_total_num = sum([item.get("value") for item in fault_rate_list]) for index, item in enumerate(fault_rate_list): ws['K' + str(index + 4)] = item.get("name") ws['L' + str(index + 4)] = item.get("value") ws['M' + str(index + 4)] = item.get("value") * 100 / fault_total_num # 写出到IO output = BytesIO() workbook.save(output) # 重新定位到开始 output.seek(0) response.write(output.getvalue()) return response
后台-直接生成Excel表
import xlwt # 1.导出excel的库 from io import BytesIO # 2.实现了在内存中读写bytes def export_order(request): # 设置HTTPResponse的类型 response = HttpResponse(content_type='application/vnd.ms-excel') response['Content-Disposition'] = 'attachment;filename=平台发布订单.xls'.encode(encoding='utf-8') # 创建一个文件对象 wb = xlwt.Workbook(encoding='utf8') # 创建一个sheet对象 sheet = wb.add_sheet('order-sheet') # 设置文件头的样式,这个不是必须的可以根据自己的需求进行更改 style_heading = xlwt.easyxf(""" font: name Arial, colour_index white, bold on, height 0xA0; align: wrap off, vert center, horiz center; pattern: pattern solid, fore-colour 0x19; borders: left THIN, right THIN, top THIN, bottom THIN; """, num_format_str='YYYY-MM-DD') # 写入文件标题 sheet_header = ['订单发布时间', '订单编号', '发布人', '联系人', '手机号', '项目名称', '订单状态'] for i, item in enumerate(sheet_header): sheet.col(i).width = 256 * 20 sheet.write(0, i, item, style_heading) # 写入数据 orders = TOrderPlatform.objects.filter() row_index = 1 for order in orders: user = TUser.objects.filter(id=order.publisher_id).first() sheet.write(row_index, 0, order.publish_time.strftime("%Y-%m-%d %H:%M:%S")) sheet.write(row_index, 1, order.id) sheet.write(row_index, 2, user.name) sheet.write(row_index, 3, order.name) sheet.write(row_index, 4, order.tel) sheet.write(row_index, 5, order.project_name) sheet.write(row_index, 6, TOrderPlatform.status_dict[order.status]) row_index += 1 # 写出到IO wb.save(response) return response

# 导出测试函数 def export_order(request): sheet_header = ['订单发布时间', '订单编号', '发布人'] rows = [ ['1995-01-10','001','张三'] ] return utils.export_excel('平台发布订单', sheet_header, rows) # excel导出函数 import xlwt from django.http import HttpResponse def export_excel(export_file_name, sheet_header, rows): """平台发布订单导出""" # 设置HTTPResponse的类型 response = HttpResponse(content_type='application/vnd.ms-excel') response['Content-Disposition'] = 'attachment;filename={}.xls'.format(export_file_name).encode(encoding='utf-8') # 创建一个文件对象 wb = xlwt.Workbook(encoding='utf8') # 创建一个sheet对象 sheet = wb.add_sheet('order-sheet') # 设置文件头的样式,这个不是必须的可以根据自己的需求进行更改 style_heading = xlwt.easyxf(""" font: name Arial, colour_index white, bold on, height 0xA0; align: wrap off, vert center, horiz center; pattern: pattern solid, fore-colour 0x19; borders: left THIN, right THIN, top THIN, bottom THIN; """, num_format_str='YYYY-MM-DD') # 写入文件标题 sheet_header = ['订单发布时间', '订单编号', '发布人', '联系人', '手机号', '项目名称', '订单状态'] for i, item in enumerate(sheet_header): sheet.col(i).width = 256 * 20 sheet.write(0, i, item, style_heading) # 写入数据 row_index = 1 style_body = xlwt.easyxf("""align:wrap off,vert center,horiz center;""") for row in rows: sheet.write(row_index, 0, row[0], style_body) sheet.write(row_index, 1, row[1], style_body) sheet.write(row_index, 2, row[2], style_body) sheet.write(row_index, 3, row[3], style_body) sheet.write(row_index, 4, row[4], style_body) sheet.write(row_index, 5, row[5], style_body) sheet.write(row_index, 6, row[6], style_body) row_index += 1 # 写出到IO wb.save(response) return response
import openpyxl import StringIO from django.utils.encoding import escape_uri_path def downexcel(request): wb = openpyxl.Workbook() ws = wb.active ws.title=u'测试表名' ws.merge_cells('A1:P1') ws['A1'] = '这是用来测试的标题' sio = StringIO.StringIO() wb.save(sio) sio.seek(0) res = sio.getvalue() response = HttpResponse(res, content_type='application/vnd.ms-excel', ) response['Content-Disposition'] = "attachment; filename=%s.xls" % escape_uri_path('测试文件名'.encode('utf-8')) return response
前台 - 使用JS导出Excel表
注意:前4种方法只支持IE,最后一个支持主流浏览器
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>html 表格导出</title> <script language="JavaScript" type="text/javascript"> //第一种方法 function method1(tableid) { var curTbl = document.getElementById(tableid); var oXL = new ActiveXObject("Excel.Application"); var oWB = oXL.Workbooks.Add(); var oSheet = oWB.ActiveSheet; var sel = document.body.createTextRange(); sel.moveToElementText(curTbl); sel.select(); sel.execCommand("Copy"); oSheet.Paste(); oXL.Visible = true; } //第二种方法 function method2(tableid) { var curTbl = document.getElementById(tableid); var oXL = new ActiveXObject("Excel.Application"); var oWB = oXL.Workbooks.Add(); var oSheet = oWB.ActiveSheet; var Lenr = curTbl.rows.length; for (i = 0; i < Lenr; i++) { var Lenc = curTbl.rows(i).cells.length; for (j = 0; j < Lenc; j++) { oSheet.Cells(i + 1, j + 1).value = curTbl.rows(i).cells(j).innerText; } } oXL.Visible = true; } //第三种方法 function getXlsFromTbl(inTblId, inWindow){ try { var allStr = ""; var curStr = ""; if (inTblId != null && inTblId != "" && inTblId != "null") { curStr = getTblData(inTblId, inWindow); } if (curStr != null) { allStr += curStr; } else { alert("你要导出的表不存在"); return; } var fileName = getExcelFileName(); doFileExport(fileName, allStr); } catch(e) { alert("导出发生异常:" + e.name + "->" + e.description + "!"); } } function getTblData(inTbl, inWindow) { var rows = 0; var tblDocument = document; if (!!inWindow && inWindow != "") { if (!document.all(inWindow)) { return null; } else { tblDocument = eval(inWindow).document; } } var curTbl = tblDocument.getElementById(inTbl); var outStr = ""; if (curTbl != null) { for (var j = 0; j < curTbl.rows.length; j++) { for (var i = 0; i < curTbl.rows[j].cells.length; i++) { if (i == 0 && rows > 0) { outStr += " t"; rows -= 1; } outStr += curTbl.rows[j].cells[i].innerText + "t"; if (curTbl.rows[j].cells[i].colSpan > 1) { for (var k = 0; k < curTbl.rows[j].cells[i].colSpan - 1; k++) { outStr += " t"; } } if (i == 0) { if (rows == 0 && curTbl.rows[j].cells[i].rowSpan > 1) { rows = curTbl.rows[j].cells[i].rowSpan - 1; } } } outStr += "rn"; } } else { outStr = null; alert(inTbl + "不存在 !"); } return outStr; } function getExcelFileName() { var d = new Date(); var curYear = d.getYear(); var curMonth = "" + (d.getMonth() + 1); var curDate = "" + d.getDate(); var curHour = "" + d.getHours(); var curMinute = "" + d.getMinutes(); var curSecond = "" + d.getSeconds(); if (curMonth.length == 1) { curMonth = "0" + curMonth; } if (curDate.length == 1) { curDate = "0" + curDate; } if (curHour.length == 1) { curHour = "0" + curHour; } if (curMinute.length == 1) { curMinute = "0" + curMinute; } if (curSecond.length == 1) { curSecond = "0" + curSecond; } var fileName = "table" + "_" + curYear + curMonth + curDate + "_" + curHour + curMinute + curSecond + ".csv"; return fileName; } function doFileExport(inName, inStr) { var xlsWin = null; if (!!document.all("glbHideFrm")) { xlsWin = glbHideFrm; } else { var width = 6; var height = 4; var openPara = "left=" + (window.screen.width / 2 - width / 2) + ",top=" + (window.screen.height / 2 - height / 2) + ",scrollbars=no,width=" + width + ",height=" + height; xlsWin = window.open("", "_blank", openPara); } xlsWin.document.write(inStr); xlsWin.document.close(); xlsWin.document.execCommand('Saveas', true, inName); xlsWin.close(); } //第四种 function method4(tableid){ var curTbl = document.getElementById(tableid); var oXL; try{ oXL = new ActiveXObject("Excel.Application"); //创建AX对象excel }catch(e){ alert("无法启动Excel!\n\n如果您确信您的电脑中已经安装了Excel,"+"那么请调整IE的安全级别。\n\n具体操作:\n\n"+"工具 → Internet选项 → 安全 → 自定义级别 → 对没有标记为安全的ActiveX进行初始化和脚本运行 → 启用"); return false; } var oWB = oXL.Workbooks.Add(); //获取workbook对象 var oSheet = oWB.ActiveSheet;//激活当前sheet var sel = document.body.createTextRange(); sel.moveToElementText(curTbl); //把表格中的内容移到TextRange中 sel.select(); //全选TextRange中内容 sel.execCommand("Copy");//复制TextRange中内容 oSheet.Paste();//粘贴到活动的EXCEL中 oXL.Visible = true; //设置excel可见属性 var fname = oXL.Application.GetSaveAsFilename("将table导出到excel.xls", "Excel Spreadsheets (*.xls), *.xls"); oWB.SaveAs(fname); oWB.Close(); oXL.Quit(); } //第五种方法 var idTmr; function getExplorer() { var explorer = window.navigator.userAgent ; //ie if (explorer.indexOf("MSIE") >= 0) { return 'ie'; } //firefox else if (explorer.indexOf("Firefox") >= 0) { return 'Firefox'; } //Chrome else if(explorer.indexOf("Chrome") >= 0){ return 'Chrome'; } //Opera else if(explorer.indexOf("Opera") >= 0){ return 'Opera'; } //Safari else if(explorer.indexOf("Safari") >= 0){ return 'Safari'; } } function method5(tableid) { if(getExplorer()=='ie') { var curTbl = document.getElementById(tableid); var oXL = new ActiveXObject("Excel.Application"); var oWB = oXL.Workbooks.Add(); var xlsheet = oWB.Worksheets(1); var sel = document.body.createTextRange(); sel.moveToElementText(curTbl); sel.select(); sel.execCommand("Copy"); xlsheet.Paste(); oXL.Visible = true; try { var fname = oXL.Application.GetSaveAsFilename("Excel.xls", "Excel Spreadsheets (*.xls), *.xls"); } catch (e) { print("Nested catch caught " + e); } finally { oWB.SaveAs(fname); oWB.Close(savechanges = false); oXL.Quit(); oXL = null; idTmr = window.setInterval("Cleanup();", 1); } } else { tableToExcel(tableid) } } function Cleanup() { window.clearInterval(idTmr); CollectGarbage(); } var tableToExcel = (function() { var uri = 'data:application/vnd.ms-excel;base64,', template = '<html><head><meta charset="UTF-8"></head><body><table>{table}</table></body></html>', base64 = function(s) { return window.btoa(unescape(encodeURIComponent(s))) }, format = function(s, c) { return s.replace(/{(\w+)}/g, function(m, p) { return c[p]; }) } return function(table, name) { if (!table.nodeType) table = document.getElementById(table) var ctx = {worksheet: name || 'Worksheet', table: table.innerHTML} window.location.href = uri + base64(format(template, ctx)) } })() </script> </head> <body> <div > <button type="button" onclick="method1('tableExcel')">导出Excel方法一</button> <button type="button" onclick="method2('tableExcel')">导出Excel方法二</button> <button type="button" onclick="getXlsFromTbl('tableExcel','myDiv')">导出Excel方法三</button> <button type="button" onclick="method4('tableExcel')">导出Excel方法四</button> <button type="button" onclick="method5('tableExcel')">导出Excel方法五</button> </div> <div id="myDiv"> <table id="tableExcel" width="100%" border="1" cellspacing="0" cellpadding="0"> <tr> <td colspan="5" align="center">html 表格导出道Excel</td> </tr> <tr> <td>列标题1</td> <td>列标题2</td> <td>类标题3</td> <td>列标题4</td> <td>列标题5</td> </tr> <tr> <td>aaa</td> <td>bbb</td> <td>ccc</td> <td>ddd</td> <td>eee</td> </tr> <tr> <td>AAA</td> <td>BBB</td> <td>CCC</td> <td>DDD</td> <td>EEE</td> </tr> <tr> <td>FFF</td> <td>GGG</td> <td>HHH</td> <td>III</td> <td>JJJ</td> </tr> </table> </div> </body> </html>
openpyxl
保存为流
python操作Excel文件之openpyxl: https://blog.csdn.net/weixin_39904311/article/details/83058611
from tempfile import NamedTemporaryFile from openpyxl import Workbook wb = Workbook() with NamedTemporaryFile() as tmp: wb.save(tmp.name) tmp.seek(0) stream = tmp.read()
参考地址:
https://blog.csdn.net/qq_27901091/article/details/83303463
https://www.jianshu.com/p/beea62b23cb0
https://gitee.com/sunzhenquan/codes/usj5ng0d7q6p8yi92zbem
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下