我现在使用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解决这个问题。
答案 0 :(得分:5)
这对我有用。我使用了python 2.7
以及最新的openpyxl
和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)
答案 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>
标签,视情况而定。