Search code examples
pythongoogle-app-enginexlwtpyexcelerator

How can i store excel file created using pyExcelerator as input for db.BlobProperty()


How can i store excel file created using pyExcelerator as input for db.BlobProperty() ?

Actally what i need is that Using taskqueue program will create a excel file and store it in the datastore. And will send a link to the users to download the file. How do i do this ? Please help me

Datamodel:

class filestore(db.Model):
   stock_file = db.BlobProperty()

Python code for storing the excel file in datastore

from pyExcelerator import *
class MainHandler(webapp.RequestHandler):
  def get(self):                  
     w = Workbook()
     ws = w.add_sheet('Hey, Dude')
     ws.write(0, 0, 'Part Number')        
     self.response.headers['Content-Type'] = 'application/ms-excel'
     self.response.headers['Content-Transfer-Encoding'] = 'Binary'
     self.response.headers['Content-disposition'] = 'attachment; filename="Test.xls"'

     temp_file = filestore()
     temp_file.stock_file = db.blob(wb.save(self.response.out)) // Storing 0kb file 
     temp_file.put()

After inserting new file, file size in 0kb why ?


Solution

  • If your goal is to create an Excel file and save it as a blob for later use you need to first save it as a StringIO object, not construct a response, as you are doing currently.

    Here is a sample using xlwt (a fork of pyExcelerator):

    import xlwt
    
    file_type = 'application/ms-excel'
    file_name = 'sample.xls'
    
    wbk = xlwt.Workbook()
    sheet = wbk.add_sheet('Hey, Dude')
    sheet.write(0, 0, 'Part Number')
    
    file = StringIO.StringIO()
    wbk.save(file)
    file.seek(0)    
    
    with files.open(file_name, 'a') as f:
      f.write('%s' % file.getvalue())
    
    files.finalize(file_name)
    
    blob_key = files.blobstore.get_blob_key(file_name)