您当前的位置:首页 > 计算机 > 编程开发 > Python

django 导出xls文件

时间:07-11来源:作者:点击数:

django 导出xls文件

1.同目录下创建file_handle.py文件

file_handle.py

import xlwt, datetime
from xlwt import *
import xlsxwriter


# 写入excel文件函数
def wite_to_excel(n, head_data, records, download_url, table_name):
    # 获取时间戳
    timestr = datetime.datetime.now().strftime("%Y%m%d%H%M%S")

    # 工作表
    wbk = xlwt.Workbook(style_compression=2, encoding='utf-8')
    sheet1 = wbk.add_sheet('sheet1', cell_overwrite_ok=True)

    # 写入表头
    for filed in range(0, len(head_data)):
        sheet1.write(0, filed, head_data[filed], excel_head_style())

    # 写入数据记录
    for row in range(1, n + 1):
        for col in range(0, len(head_data)):
            sheet1.write(row, col, records[row - 1][col], excel_record_style())
            # 设置默认单元格宽度
            sheet1.col(col).width = 256 * 15

    wbk.save(download_url + table_name + '.xls')
    return timestr


# 写入excel文件函数
def wite_to_excel_text(n, head_data, records, download_url, table_name):
    # 获取时间戳
    timestr = datetime.datetime.now().strftime("%Y%m%d%H%M%S")

    # 工作表
    wbk = xlsxwriter.Workbook(download_url + table_name + '.xls')
    sheet1 = wbk.add_worksheet('sheet1')

    # 写入表头
    for filed in range(0, len(head_data)):
        sheet1.write(0, filed, head_data[filed])

    # 写入数据记录
    for row in range(1, n + 1):
        for col in range(0, len(head_data)):
            sheet1.write(row, col, records[row - 1][col])
            # 设置默认单元格宽度
            # sheet1.col(col).width = 256 * 15

    # wbk.save(download_url + table_name + '.xls')
    wbk.close()
    return timestr


# 定义导出文件表头格式
def excel_head_style():
    # 创建一个样式
    style = XFStyle()
    # 设置背景色
    pattern = Pattern()
    pattern.pattern = Pattern.SOLID_PATTERN
    pattern.pattern_fore_colour = Style.colour_map['light_green']  # 设置单元格背景色
    style.pattern = pattern
    # 设置字体
    font0 = xlwt.Font()
    font0.name = u'微软雅黑'
    font0.bold = True
    font0.colour_index = 0
    font0.height = 240
    style.font = font0
    # 设置文字位置
    alignment = xlwt.Alignment()  # 设置字体在单元格的位置
    alignment.horz = xlwt.Alignment.HORZ_CENTER  # 水平方向
    alignment.vert = xlwt.Alignment.VERT_CENTER  # 竖直方向
    style.alignment = alignment
    # 设置边框
    borders = xlwt.Borders()  # Create borders
    borders.left = xlwt.Borders.THIN  # 添加边框-虚线边框
    borders.right = xlwt.Borders.THIN  # 添加边框-虚线边框
    borders.top = xlwt.Borders.THIN  # 添加边框-虚线边框
    borders.bottom = xlwt.Borders.THIN  # 添加边框-虚线边框
    style.borders = borders

    return style


# 定义导出文件记录格式
def excel_record_style():
    # 创建一个样式
    style = XFStyle()
    # 设置字体
    font0 = xlwt.Font()
    font0.name = u'微软雅黑'
    font0.bold = False
    font0.colour_index = 0
    font0.height = 200
    style.font = font0
    # 设置文字位置
    alignment = xlwt.Alignment()  # 设置字体在单元格的位置
    alignment.horz = xlwt.Alignment.HORZ_CENTER  # 水平方向
    alignment.vert = xlwt.Alignment.VERT_CENTER  # 竖直方向
    style.alignment = alignment
    # 设置边框
    borders = xlwt.Borders()  # Create borders
    borders.left = xlwt.Borders.THIN  # 添加边框-虚线边框
    borders.right = xlwt.Borders.THIN  # 添加边框-虚线边框
    borders.top = xlwt.Borders.THIN  # 添加边框-虚线边框
    borders.bottom = xlwt.Borders.THIN  # 添加边框-虚线边框
    style.borders = borders

    return style

2.views.py

class ExportExelc(APIView):
    # authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
    # permission_classes = (IsAuthenticated,)
    def post(self, request, *args, **kwargs):
        '''导出数据'''
        table_name = request.query_params['table_name']
        # 表头字段
        # records表示要添加的数据
        # 写入备注
        head_data = []
        records = []
        record = []
        queryset = get_query_exprot(connection, table_name, DATABASES['default']['NAME'])
        for sql_info in queryset:
            head_data.append(sql_info['COLUMN_NAME'])  # 设置标题字段
            record.append(sql_info['COLUMN_COMMENT'])  # 设置标题字段
        records.append(record)
        cursor = connection.cursor()
        page = 0
        page_size = 1000
        while True:
            start = page * page_size
            page += 1
            num = cursor.execute(f'select * from {table_name} limit {start},{page_size};')
            if not num:
                break
            for i in cursor.fetchall():
                record = []
                for j in i:
                    record.append(str(j))
                records.append(record)
        n = len(records)
        # 设置生成文件所在路径
        download_url = os.path.dirname(os.path.abspath(__file__)) + '\\export_excel\\'
        # excel文件名称
        table_name = table_name.replace('database_data_', '')
        # 写入数据到excel中
        # wite_to_excel(n, head_data, records, download_url, table_name)
        wite_to_excel_text(n, head_data, records, download_url, table_name)
        from django.http import StreamingHttpResponse

        def file_iterator(file_name, chunk_size=512):
            with open(file_name, 'rb') as f:
                while True:
                    c = f.read(chunk_size)
                    if c:
                        yield c
                    else:
                        break

        # 显示在弹出对话框中的默认的下载文件名
        the_file_name = table_name + '.xls'

        # 设置生成文件所在路径
        download_url = download_url

        response = StreamingHttpResponse(file_iterator(download_url + the_file_name))
        response['Content-Type'] = 'application/octet-stream'
        response['Content-Disposition'] = 'attachment;filename="{0}"'.format(the_file_name)

        return response

3.query

def get_query_exprot(connection, table, key):
    """
    表的结构和数据
    :param connection:
    :param table:
    :return:
    """
    cursor = connection.cursor()
    cursor_columns = connection.cursor()
    sql = f"select * from information_schema.columns where table_schema ='{key}' and table_name = '{table}';"
    data_nums = cursor.execute(sql)
    if data_nums:
        cursor_columns.execute("show columns from information_schema.columns")
        columns = [i[0] for i in cursor_columns.fetchall()]
        queryset = [{c: str(j) for c, j in zip(columns, i)} for i in cursor.fetchall()]
        return queryset

4.在xls文件上追加数据

import xlrd
from xlutils.copy import copy
workbook = xlrd.open_workbook(file_name, formatting_info=True)  # 读取xls文件
write_data = copy(workbook)
sheet_data = write_data.get_sheet(0)
sheet_data.write(i, 12, 'succeed')   # i是行    12 是列   'succeed' 追加要写入的数据
write_data.save('.\\operations.xls')
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门