如何将Openpyxl生成的xlsx输出到浏览器?

时间:2012-09-05 18:00:21

标签: python excel browser cgi openpyxl

我现在使用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。 这些方法都不起作用。当我从桌面使用它而不是浏览器时,它可以完美地运行。 我非常感谢你的帮助。

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

7 个答案:

答案 0 :(得分:5)

这对我有用。我使用了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)

答案 1 :(得分: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下载我的文件。希望能有所帮助

答案 2 :(得分:1)

将xlsx输出写入磁盘,然后通过Apache提供服务工作得很好,但是直接将其输出会导致Excel和其他问题出错。

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

buffer=output.getvalue()

在HTTP标头中:

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

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

stdout.write(buffer)

答案 3 :(得分:0)

您的脚本可以按照您的预期而无需更改。

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

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

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

通过设置脚本权限确保脚本可以删除。对于您的webbrowser,不需要的命令行操作(python scriptname)。并确保Web服务器的所有者可以执行脚本,因为Web服务器可能不会像您一样运行。

答案 4 :(得分:0)

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

from io import BytesIO

但如果你使用save_virtual_workbook()为你做这件事,你会得到什么错误?

答案 5 :(得分: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)

答案 6 :(得分:-5)

如果要构建与电子表格相似的HTML表格,则可能需要使用CSV。要么这样做,而不是Excel,或者在构建之后将Excel转换为CSV。

在任何情况下,一旦您拥有CSV格式的数据,那么只需使用python构建HTML页面并循环CSV数据,同时插入<table><tr><td>标签,视情况而定。