python - 如何生成excel文件并将其作为文件保存到数据库
问题描述
我创建了一个使用 xlwt 创建 excel 文件的函数。我能够将其作为文件下载,但我希望先将其保存到数据库中,而我所做的却不起作用。
这是我到目前为止所做的。
import xlwt
response = HttpResponse(content_type='application/ms-excel')
response['Content-Disposition'] = 'attachment; filename="excel-file.xls"'
wb = xlwt.Worbook()
# some excel file generating code here
wb.save(response)
return response
生成excel文件后,我尝试将其保存到数据库中,但这样做不起作用。(代码如下)
# file = models.FileField
Reports.objects.create(
file=wb
)
我也尝试过先将其保存到流中,但这样保存也不起作用。(代码如下)
f = io.StringIO()
wb.save(f)
# file = models.FileField
Reports.objects.create(
file=f
)
解决方案
好的,我想我明白你现在在问什么了。
不幸的是,FileField
该类旨在将(上传的)文件保存在文件系统中,而不是数据库中。这大概是件好事。数据库并非旨在用作文件系统。但无论哪种方式,如果使用FileField
数据库将只包含文件名,而不包含文件内容。
所以我的第一个建议是按预期使用FileField
和。https://docs.djangoproject.com/en/3.0/topics/files/#file-storageFileSystemStorage
中有一些示例代码显示了如何将一些内容保存到默认文件存储中。
或者,如果您真的想将 Excel 对象存储在数据库中,则需要FileField
将BinaryField
. 然后你可以做这样的事情:
buffer = BytesIO()
wb.save(buffer)
// excel = models.BinaryField()
Reports.object.create(excel=buffer.getValue(), ...)
(可能有更有效的方法来做到这一点。)
推荐阅读
- c++ - C ++双链表,我应该在动态分配节点后删除它们吗?
- swift - “从不”类型作为多泛型初始化的默认类型
- python - 如何在python中读取二进制文件并将其转换为整数数组?
- swiftui - 在 SwiftUI 中实现 Box-Shadow
- java - 在 Anylogic 8.7 中如何调用存储在集合中的特定代理的属性?
- r - 如何引用函数中的列
- python - 在列中查找特定字符并将其与其他列合并
- multithreading - 屏障代码并等待所有线程到达集合点然后进入临界区
- javascript - 我可以将我所有的 html 文件放在一个 javascript const 中并用“HtmlService.createHtmlOutput().setContent(CONST_HTML)”显示它吗?
- go - 如何处理分块文件上传