Just looking at your test5 document is unused (why do you need this object)? output is a StringIO but you never write anything in it. You call both response.write(output.getvalue()) and return output.getvalue(). I think you only want the latter. I think this: "attachment; filename=Comparable Sales.docx" should be "attachment; filename='Comparable Sales.docx'"
What is the desired workflow? Is the docx in the database or is it to be created? How? On Monday, 5 January 2015 11:36:58 UTC-6, David Wellsandt wrote: > > I'm going crazy here to implement a reporting system for .docx files. I > read several examples of streaming a file (like CSV outputs and such), but > they were all from the controller. Since there will be several report > formats for my application, I wanted to move all the reports to the views. > I SWEAR I had it working and then fouled it up somehow. > > Here's what works. > > *controllers/sale.py* > @auth.requires_login() > def test5(): > from docx import Document > from docx.shared import Inches > import StringIO > output = StringIO.StringIO() > document = Document() > sales = db(db.sale.property==db.property.id).select() > document.add_heading('Sales', 0) > response.headers['Content-Type']= > 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' > response.headers['Content-Disposition'] = "attachment; > filename=Comparable Sales.docx" > response.write(output.getvalue(), escape=False) > document.save(output) > return output.getvalue() > > It produces a .docx file. No data yet, but just a file with the heading > caption that reads, "Sales." > > > > Then, I tried splitting stuff up a bit. > > *controllers/sale.py* > @auth.requires_login() > def test4(): > response.view = 'default/test2.html' > return locals() > > *views/default/test2.html* > {{ > from docx import Document > from docx.shared import Inches > import StringIO > output = StringIO.StringIO() > document = Document() > sales = db(db.sale.property==db.property.id).select() > document.add_heading('Sales', 0) > response.headers['Content-Type']= > 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' > response.headers['Content-Disposition'] = "attachment; > filename=Comparable Sales.docx" > document.save(output) > response.write(output.getvalue(), escape=False) > }} > > With the split-up deal, it downloads fine. When I open it, Word alerts me > first, "The file Comparable Sales.docx cannot be opened because there are > problems with the contents." > > I click OK and get: > > "Word found unreadable content in Comparable Sales.docx. Do you want to > recover the contents of this document?" > > I click OK and it opens with the correct content. > > I've tried several variations, such as moving the sales query to the > controller, removing the Content-Disposition header, etc. No luck. > > I've tried comparing the underlying document.xml files, but I don't notice > any notable differences. I've validated and checked for errors. > > So, clearly I'm very close if it's actually getting the content, but what > have I done that keeps making it corrupt? > -- Resources: - http://web2py.com - http://web2py.com/book (Documentation) - http://github.com/web2py/web2py (Source code) - https://code.google.com/p/web2py/issues/list (Report Issues) --- You received this message because you are subscribed to the Google Groups "web2py-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to web2py+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.