如何将使用pyExcelerator创建的Excel文件作为db.BlobProperty()的输入存储?
我该如何将使用pyExcelerator创建的Excel文件存储为db.BlobProperty()的输入呢?
其实我想要的是,使用任务队列程序创建一个Excel文件,并把它存储在数据存储中。然后再给用户发送一个链接,让他们可以下载这个文件。我该怎么做呢?请帮帮我。
数据模型:
class filestore(db.Model):
stock_file = db.BlobProperty()
用于将Excel文件存储在数据存储中的Python代码
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()
插入新文件后,文件大小显示为0kb,这是为什么呢?
2 个回答
0
这段代码会把文件保存为 blobproperty() 格式在数据存储中。
import StringIO
w = Workbook()
ws = w.add_sheet('Hey, Dude')
ws.write(0, 0, 'Part Number')
buffer = StringIO.StringIO()
w.save(buffer)
contents = buffer.getvalue()
mymodel = filestore()
mymodel.stock_file = db.Blob(contents)
mymodel.put()
1
如果你的目标是创建一个Excel文件,并将其保存为一个可以稍后使用的blob(大块数据),那么你需要先把它保存为一个StringIO对象,而不是像你现在这样直接构建一个响应。
下面是一个使用xlwt(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)