加载和解析 xlsx 文件
Loading and parse xlsx file
如何继续使用下载的文件?
将其解析为模型
views.py
def model_form_upload(request):
if request.method == 'POST':
form = DocumentForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return redirect('home')
else:
form = DocumentForm()
return render(request, 'core/model_form_upload.html', {
'form': form
})
my model.py
class Document(models.Model):
description = models.CharField(max_length=255, blank=True)
document = models.FileField(upload_to='documents/')
uploaded_at = models.DateTimeField(auto_now_add=True)
class Parameters(models.Model):
par_time = models.DateTimeField('date')
par_recipe = models.CharField(max_length=200)
par_machine = models.CharField(max_length=200)
par_fa = models.CharField(max_length=200)
par_ag_typ = models.CharField(max_length=200)
par_rollennr = models.IntegerField(default=0)
par_definition_id = models.IntegerField(default=0)
par_name = models.CharField(max_length=200)
par_value = models.IntegerField(default=0)
用于下载 Excel 个文件 (xlsx)。 xlsx 中的字段如模型中所述表示。
刚接触Django,一无所获
首先您需要一个可以读取 XLSX 文件的库。我发现 openpxyl 最简单。使用 pip install openpyxl
.
安装
要处理上传的文件,写一个小函数。类似于下面的代码。
import openpyxl
def handle_parameters_upload(request, file):
wb = openpyxl.load_workbook(file, read_only=True)
first_sheet = wb.get_sheet_names()[0]
ws = wb.get_sheet_by_name(first_sheet)
data = []
# Loop over rows and create `Parameters()` objects with column data
# row_offset=1 is used if you have a header row in your file, you want to skip it
# otherwise use 0 or delete the row_offset parameter, since 0 is default
for row in ws.iter_rows(row_offset=1):
parameter = Parameters()
parameter.par_time = row[0].value
parameter.par_recipe = row[1].value
parameter.par_machine = row[2].value
parameter.par_fa = row[3].value
parameter.par_ag_typ = row[4].value
parameter.par_rollennr = row[5].value
parameter.par_definition_id = row[6].value
parameter.par_name = row[7].value
parameter.par_value = row[8].value
data.append(parameter)
# Bulk create data
Parameters.objects.bulk_create(data)
return True
这将打开 XLSX 文件,从中读取数据并保存到数据库。使用 bulk_create(),因为它以高效的方式将对象插入数据库。
调整您的 model_form_upload() 视图。
def model_form_upload(request):
if request.method == 'POST':
form = DocumentForm(request.POST, request.FILES)
if form.is_valid():
form.save()
handle_file = handle_parameters_upload(request, request.FILES['document'])
return redirect('home')
else:
form = DocumentForm()
return render(request, 'core/model_form_upload.html', {'form': form})
您还可以使用 read/write XLSX 的其他库。我也经常用pyexcel。
如何继续使用下载的文件? 将其解析为模型
views.py
def model_form_upload(request):
if request.method == 'POST':
form = DocumentForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return redirect('home')
else:
form = DocumentForm()
return render(request, 'core/model_form_upload.html', {
'form': form
})
my model.py
class Document(models.Model):
description = models.CharField(max_length=255, blank=True)
document = models.FileField(upload_to='documents/')
uploaded_at = models.DateTimeField(auto_now_add=True)
class Parameters(models.Model):
par_time = models.DateTimeField('date')
par_recipe = models.CharField(max_length=200)
par_machine = models.CharField(max_length=200)
par_fa = models.CharField(max_length=200)
par_ag_typ = models.CharField(max_length=200)
par_rollennr = models.IntegerField(default=0)
par_definition_id = models.IntegerField(default=0)
par_name = models.CharField(max_length=200)
par_value = models.IntegerField(default=0)
用于下载 Excel 个文件 (xlsx)。 xlsx 中的字段如模型中所述表示。
刚接触Django,一无所获
首先您需要一个可以读取 XLSX 文件的库。我发现 openpxyl 最简单。使用 pip install openpyxl
.
要处理上传的文件,写一个小函数。类似于下面的代码。
import openpyxl
def handle_parameters_upload(request, file):
wb = openpyxl.load_workbook(file, read_only=True)
first_sheet = wb.get_sheet_names()[0]
ws = wb.get_sheet_by_name(first_sheet)
data = []
# Loop over rows and create `Parameters()` objects with column data
# row_offset=1 is used if you have a header row in your file, you want to skip it
# otherwise use 0 or delete the row_offset parameter, since 0 is default
for row in ws.iter_rows(row_offset=1):
parameter = Parameters()
parameter.par_time = row[0].value
parameter.par_recipe = row[1].value
parameter.par_machine = row[2].value
parameter.par_fa = row[3].value
parameter.par_ag_typ = row[4].value
parameter.par_rollennr = row[5].value
parameter.par_definition_id = row[6].value
parameter.par_name = row[7].value
parameter.par_value = row[8].value
data.append(parameter)
# Bulk create data
Parameters.objects.bulk_create(data)
return True
这将打开 XLSX 文件,从中读取数据并保存到数据库。使用 bulk_create(),因为它以高效的方式将对象插入数据库。
调整您的 model_form_upload() 视图。
def model_form_upload(request):
if request.method == 'POST':
form = DocumentForm(request.POST, request.FILES)
if form.is_valid():
form.save()
handle_file = handle_parameters_upload(request, request.FILES['document'])
return redirect('home')
else:
form = DocumentForm()
return render(request, 'core/model_form_upload.html', {'form': form})
您还可以使用 read/write XLSX 的其他库。我也经常用pyexcel。