【问题标题】:How can I send an xls file one line per time through http response?如何通过http响应每次发送一行xls文件?
【发布时间】:2015-01-22 06:58:47
【问题描述】:

问题

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

详细的问题描述显示在下面的链接页面中:

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

有什么不同

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

我的问题是

由于数据集非常大,我无法一次生成整个 .xls 文件,最好将一行或几行发送到每次客户端,就像我对 .csv 文件所做的那样。

那么我怎样才能将.xls数据一块一块地发送到客户端呢?还是有更好的建议?

非常感谢您的回答!

【问题讨论】:

  • 你为什么不拆分文件并发送它(s inSplitter 或类似的),然后使用 python 或类似的重新加入它,xls 由于合并单元格等不能可靠地分成行,它会是完成这项工作需要做很多工作。

标签: python excel http csv flask


【解决方案1】:

这是使用依赖项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

【讨论】:

    猜你喜欢
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    相关资源
    最近更新 更多