Django 导入 Excel 端点
Posted
技术标签:
【中文标题】Django 导入 Excel 端点【英文标题】:Django Import Excel Endpoint 【发布时间】:2018-02-11 14:40:43 【问题描述】:我正在尝试创建一个端点,用于将 excel 文件加载到服务器并导入其中的数据。 为此,我使用django-import-export 包。 这是查看代码:
def create(self, request, *args, **kwargs):
file_serializer = self.get_serializer(data=request.data)
file_serializer.is_valid(raise_exception=True)
if file_serializer.is_valid():
from tablib import Dataset
from workflows.submittals.admin import ItemImportResource
item_model_resource = ItemImportResource()
file_serializer.save()
dataset = Dataset()
file_obj = request.FILES['file']
imported_data = Dataset().load(open(file_obj).read())
result = item_model_resource.import_data(dataset, dry_run=True)
if not result.has_errors():
item_model_resource.import_data(dataset, dry_run=False)
return Response(file_serializer.data, status=status.HTTP_201_CREATED)
else:
return Response(file_serializer.errors, status=status.HTTP_400_BAD_REQUEST)
将文件加载到 (tablib) 数据集时,我收到此错误:
'invalid file: <InMemoryUploadedFile: Import_Sample_test1.xls (application/vnd.ms-excel)>'
我尝试引用文件名,所以替换了
imported_data = Dataset().load(open(file_obj).read())
与
imported_data = Dataset().load(open(file_obj.name).read())
然后似乎数据集确实加载了文件,因为在响应中我看到了文件的一些字节表示,但我也收到了以下错误消息:
'ascii' codec can't decode byte 0xd0 in position 0: ordinal not in range(128)
有什么想法吗?
更新: 我的 ItemImportModel 模型:
class ItemImportModel(models.Model):
spec_section_identifier = models.CharField('Spec Section #', max_length=15)
spec_section_name = models.CharField('Spec Section Name',max_length=200)
sub_spec_section = models.CharField('Sub Spec Section', max_length=200, null=True, blank=True)
title = models.CharField(max_length=200)
description = models.TextField(null=True, blank=True, default="")
type = models.CharField(max_length=50, choices=Item.ITEM__TYPES)
我正在尝试导入的文件:
【问题讨论】:
【参考方案1】:主要问题是 dataset.load 部分。 显然对不同类型的文件应该有不同的处理方式。 这终于对我有用了
对于 csv-
imported_data = dataset.load(open(file_obj.name).read())
对于 xls-
imported_data = dataset.load(open(file_obj.name, 'rb').read(), 'xls')
对于 xlsx -
imported_data = dataset.load(open(file_obj.name, 'rb').read(), 'xlsx')
【讨论】:
以上是关于Django 导入 Excel 端点的主要内容,如果未能解决你的问题,请参考以下文章