博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据库数据导出CSV文件,浏览器下载
阅读量:4322 次
发布时间:2019-06-06

本文共 4751 字,大约阅读时间需要 15 分钟。

直接上代码:

def download(request):    # 从数据库查询数据    data_list = Info.objects.all()    # 定义返回对象    response = HttpResponse()    # 给返回对象定义解析类型    response['Content-Type'] = 'csv'    # 声明一个csv的响应    response['Content-Disposition'] = 'attachment;filename="data.csv"'    # csv的响应编码格式声明    response.write(codecs.BOM_UTF8)    # 把响应设置成文件句柄    writer_obj = csv.writer(response)    # 先写入表格头    writer_obj.writerow(["姓名", "年龄", "地址"])    # 写入数据    for info in data_list:        writer_obj.writerow([info.name, info.age, info.address])    return response

参考1:

https://www.cnblogs.com/haoshine/p/5695760.html

import csvimport codecsimport datetimefrom django.db import connectionfrom django.contrib.auth.models import Userfrom django.http import HttpResponsefrom models import *def output(request, user_id, node_id, function_id):    function_id = int(function_id)    user_id = int(user_id)    node_id= int(node_id)    # 指定csv请求回应    response = HttpResponse(content_type='text/csv')    user = User.objects.get(id=user_id)    functions_has_permission = DataPermission.objects.filter(category=node_id)    # 取出sql语句    function_obj = DataPermission.objects.get(id=function_id)    function_obj_sql = function_obj.sql    # 执行sql语句,并执行。保存执行结果和字段名    cursor = connection.cursor()    cursor.execute(function_obj_sql)    results = cursor.fetchall()    descriptions = cursor.description    descriptions_long = len(descriptions)    description_list = [None] * descriptions_long    i = 0    for description in descriptions:        description_list[i] = description[0]        i = i + 1    # 将执行结果从元组形式转化为列表形式。    i=0    results_long = len(results)    results_list = [None] * results_long    for i in range(results_long):        results_list[i] = list(results[i])    # print(results_list)    # 为文件取名字    now = datetime.datetime.now()    now = str(now.isoformat())    name = (now + '.csv').replace(':', '')    # 声明一个csv的响应    response['Content-Disposition'] = 'attachment; filename="%s"' % name    # csv的响应的编码格式声明    response.write(codecs.BOM_UTF8)    writer = csv.writer(response)    # 转码问题    a = u'中'    for result in results_list:        i=0        for item in result:            if type(item) == type(a):                # 如果是unicode类型,那么编码成utf-8                result[i] = item.encode('utf-8')            i = i + 1    # with open(response, 'wb') as f:    writer.writerow(description_list)    for result in results_list:        writer.writerow(result)        i = i + 1    response.close()    return response
参考

 

导出的文件,中文如果显示成乱码

解决方法:将上面代码中的'utf-8' 改成 'gb2312'

result[i] = item.encode('gb2312')

 

参考2:

抽取数据库文件: def exportmysql(request):     conn= MySQLdb.connect(     host='192.168.137.3',     port = 3306,     user='root',     passwd='1234567',     db ='DEVOPS',     charset='UTF8'     )     cur = conn.cursor()     a = cur.execute("select ip,info,env from machine_info")     info = cur.fetchall()     response = HttpResponse(content_type='text/csv')     response['Content-Disposition'] = 'attachment; filename="somefilename.csv"'     writer = csv.writer(response)     for row in info:        writer.writerow(row)     return response

 

参考3:

最近一个用django开发的web项目要进行数据的导入导出,所以有必要了解下。

     django中主要用HttpResponse将请求结果返回给浏览器,所以文件的下载也是通过改对象进行处理的,具体的一个列子的代码如下:

[python] view plain copy#文件下载  def download(request):      """                                                                               Send a file through Django without loading the whole file into                    memory at once. The FileWrapper will turn the file object into an                 iterator for chunks of 8KB.                                                       """             #读取mongodb的文件到临时文件中      fileid_=request.GET["fileid"]      filepath_ = ('%s/%s'%(MEDIA_ROOT, fileid_)) #文件全路径      file_=TFiles.objects.get(fileid=int(fileid_))      filename_=file_.filename      filetype_=file_.filetype        if os.path.isfile(filepath_):          pass      else:          mongoLoad(fileid_)            #下载文件      def readFile(fn, buf_size=262144):#大文件下载,设定缓存大小          f = open(fn, "rb")          while True:#循环读取              c = f.read(buf_size)              if c:                  yield c              else:                  break          f.close()      response = HttpResponse(readFile(filepath_), content_type='APPLICATION/OCTET-STREAM') #设定文件头,这种设定可以让任意文件都能正确下载,而且已知文本文件不是本地打开      response['Content-Disposition'] = 'attachment; filename='+filename_.encode('utf-8') + filetype_.encode('utf-8')#设定传输给客户端的文件名称      response['Content-Length'] = os.path.getsize(filepath_)#传输给客户端的文件大小      return response

 

=====================

Python+Django实现文件的下载

HttpResponse,  StreamingHttpResponse,  FileResponse

https://blog.csdn.net/li627528647/article/details/77544136

转载于:https://www.cnblogs.com/zhzhlong/p/9310106.html

你可能感兴趣的文章
[转]iOS教程:SQLite的创建数据库,表,插入查看数据
查看>>
【转载】OmniGraffle (一)从工具栏开始
查看>>
初识ionic
查看>>
java 中打印调用栈
查看>>
开发 笔记
查看>>
数据挖掘算法比赛 - 简单经验总结
查看>>
win7(64位)php5.5-Apache2.4-mysql5.6环境安装
查看>>
生成商户订单号/退款单号
查看>>
使用Android OpenGL ES 2.0绘图之六:响应触摸事件
查看>>
我们过去几年做对了哪些事
查看>>
ubuntu 16.04LTS
查看>>
javascript深入理解js闭包
查看>>
Oracle的安装
查看>>
Android Socket连接PC出错问题及解决
查看>>
Android Studio-—使用OpenCV的配置方法和demo以及开发过程中遇到的问题解决
查看>>
第2天线性表链式存储
查看>>
python自动化测试-D11-学习笔记之一(yaml文件,ddt)
查看>>
mysql存储过程使用游标循环插入数据
查看>>
Ubuntu 12.04 添加新用户并启用root登录
查看>>
shell中$0,$?,$!等的特殊用法
查看>>