如何通过http响应每次发送一行xls文件?

时间:2015-01-22 06:58:47

标签: python excel http csv flask

问题

最近我遇到了导出大量数据的问题,并将其发送到客户端。

详细的问题说明显示在以下链接页面中:

How can I adapt my code to make it compatible to Microsoft Excel?

有什么不同

虽然,链接页面中的第一个答案帮助我解决了excel打开 .csv 文件时代码混乱的问题。但正如我评论的那样,这对用户来说会有点不方便。所以我尝试直接导出 .xls 文件。

我的问题是

  

因为数据集非常大,我无法一次生成整个 .xls 文件,也许发送一行或几行是个好主意每次都使用 .csv 文件到客户端。

     

那么如何将 .xls 数据逐件发送到客户端?或者更好的推荐?

我非常感谢您的回答!

1 个答案:

答案 0 :(得分:0)

这是使用依赖项flask + sql-alchemy + pandas

的可能解决方案
def export_query(query, file_name = None):

    results = db.session.execute(query)

    fetched = results.fetchall()

    dataframe = pd.DataFrame(fetched)

    dataframe.columns = get_query_coloumn_names(query)

    base_path = current_app.config['UPLOAD_FOLDER']
    workingdocs = base_path + datetime.now().strftime("%Y%m%d%H%M%S") + '/'

    if not os.path.exists(workingdocs):
        os.makedirs(workingdocs)

    if file_name is None:
        file_name = workingdocs + str(uuid.uuid4()) + '-' + 'export.xlsx'
    else:
        file_name = workingdocs + file_name

    dataframe.to_excel(file_name)
    return file_name

def export_all(q, page_limit, page):

    query = db.session.query(...).\
                                outerjoin(..).\
                                filter(..).\
                                order_by(...)
    paging_query = query.paginate(page, page_limit, True)
    # TODO need to return total to help user know to keep trying paging_query.total
    return export_query(paging_query)

@api.route('/export_excel/', methods=['POST'])
@permission_required(Permission.VIEW_REPORT)
def export_excel():
    json = request.get_json(silent=False, force=True)
    q = ''.join(('%',json['q'],'%'))
    page_limit = try_parse_int(json['page_limit'])
    page = try_parse_int(json['page'])

    file_name = export_all(q, page_limit, page)
    response = send_file(file_name)
    response.headers["Content-Disposition"] = "attachment; filename=export.xlsx"
    return response