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

我使用了一段时间的计算器,它经常帮助我。 现在我有一个问题,我无法解决自己或通过search。 我试图输出我的excel文件,由浏览器中的openpyxl生成,就像我用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解决这个问题。

这是我的工作。 我使用python 2.7和最新的openpyxl和来自flask的send_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) 
 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下载我的文件。 希望这会有所帮助

将xlsx输出写入磁盘,然后通过Apache提供服务是完美的,但直接在Excel中引起错误和其他问题。

我添加了一些额外的步骤,并对您的代码进行了一些小修改:

 buffer=output.getvalue() 

在HTTP标头中:

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

并使用write()而不是print()将缓冲区推入标准输出stream:

 stdout.write(buffer) 

你的脚本适合我,如你所期望的那样,不需要改动。

我只能假设你的CGI脚本安装有问题。

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

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

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

由于Excel使用二进制格式,因此您应该使用BytesIO进行缓冲。

from io import BytesIO

但是,如果你使用save_virtual_workbook() ,你会得到什么错误?

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

在任何情况下,一旦你有CSV格式的数据,那么只需要使用python来构buildHTML页面并循环访问CSV数据,同时插入<table><tr><td>标签,作为适当的。