6

我现在使用 stackoverflow 有一段时间了,它经常帮助我。现在我有一个问题,我自己或通过搜索无法解决。我正在尝试在浏览器中输出由 openpyxl 生成的 excel 文件,就像我使用 phpexcel 一样。该方法似乎是相同的,但我只得到损坏的文件。我的代码如下所示:

from openpyxl.workbook import Workbook
from openpyxl.writer.excel import ExcelWriter
from openpyxl.writer.excel import save_virtual_workbook
from openpyxl.cell import get_column_letter
from StringIO import StringIO

print 'Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
print 'Content-Disposition: attachment;filename="results.xlsx"'
print 'Cache-Control: max-age=0\n'

output = StringIO()

wb = Workbook()

ws = wb.worksheets[0]

ws.cell('A1').value = 3.14

wb.save(output)
print output.getvalue()
#print save_virtual_workbook(wb)

我使用版本 1.5.8 和 python 2.7。这些方法都不起作用。当我只是从桌面而不是浏览器使用它时,它可以完美运行。我将非常感谢您的帮助。

PS请不要告诉我使用其他语言或程序会更容易。我需要用python解决这个问题。

4

7 回答 7

6

这对我来说是工作。我使用python 2.7和最新的openpyxlsend_file来自烧瓶

... code ...

import StringIO
from openpyxl import Workbook
wb = Workbook()
ws = wb.active # worksheet
ws.title = "Excel Using Openpyxl"
c = ws.cell(row=5, column=5)
c.value = "Hi on 5,5"
out = StringIO.StringIO()
wb.save(out)
out.seek(0)

return send_file(out, mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            attachment_filename='xxl.xlsx', as_attachment=True)
于 2014-10-06T10:35:11.943 回答
3
output = HttpResponse(mimetype='application/application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
file_name = "Test.xlsx"
output['Content-Disposition'] = 'attachment; filename='+ file_name

wb = Workbook()

ws = wb.worksheets[0]

ws.cell('A1').value = 3.14

wb.save(output)

return output

我使用这个技巧通过 openpyxl 下载我的文件。希望这会有所帮助

于 2016-02-23T18:41:25.380 回答
1

将 xlsx 输出写入磁盘,然后通过 Apache 提供它运行良好,但直接将其输出会导致 Excel 中的错误和其他问题。

我添加了几个额外的步骤并对您的代码进行了一个小改动:

buffer=output.getvalue()

在 HTTP 标头中:

print "Content-Length: " + str(len(buffer))

并用于write()代替print()将缓冲区推送到标准输出流中:

stdout.write(buffer)
于 2013-10-23T16:58:02.077 回答
0

您的脚本可以按您的预期为我工作,无需更改。

我只能假设您的 cgi 脚本设置有问题。

确保您有脚本所在的目录实际上由 Web 服务器提供服务。在 apache 上,您可以通过以下方式实现:

  ScriptAlias /cgi-bin/ /home/WWW/localhost/cgi-bin/

通过设置脚本权限确保脚本是可执行的。python scriptname对于不必要的命令行操作 ( ),对于您的网络浏览器来说就是这样。并确保网络服务器的所有者可以执行脚本,因为网络服务器可能不会像你一样运行。

于 2013-03-18T15:31:22.580 回答
0

因为 Excel 使用二进制格式,所以您应该使用 BytesIO 来缓冲。

from io import BytesIO

但是,如果您使用save_virtual_workbook()which 为您执行此操作,您会遇到什么错误?

于 2014-10-06T14:10:46.193 回答
0

我有同样的问题。解决方案是将stdout切换到bin模式:

import msvcrt

print 'Content-Type:application/octet-stream; name="{}"'.format(os.path.basename(xls_file))
print 'Content-Disposition:attachment; filename="{}"'.format(os.path.basename(xls_file))
print "Content-Length: " + str(os.path.getsize(xls_file))
print 'Cache-Control: max-age=0\r\n'

msvcrt.setmode (1, os.O_BINARY) # stdout = 1
sys.stdout.flush()
with open(xls_file, 'rb') as fobj:
    copyfileobj(fobj, sys.stdout)
于 2021-05-04T08:29:41.020 回答
-6

如果您想构建一个看起来像电子表格的 HTML 表格,您可能需要使用 CSV。要么这样做,而不是 Excel,要么在构建 Excel 后将其转换为 CSV。

无论如何,一旦您拥有 CSV 格式的数据,那么只需使用 python 构建 HTML 页面并循环遍历 CSV 数据,同时根据需要插入您的<table><tr><td>标签。

于 2012-09-05T23:07:47.993 回答