数据库数据导出CSV文件,浏览器下载

直接上代码:

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 csv
import codecs
import datetime
from django.db import connection
from django.contrib.auth.models import User
from django.http import HttpResponse
from 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

posted @ 2018-07-14 16:47  静静别跑  阅读(1342)  评论(0编辑  收藏  举报