如何在Django中上传xlsx文件后生成文本网页?

时间:2017-12-12 22:21:29

标签: python django excel

我有一个用户上传xlsx文件的字段在Django中,我很难让Django从上传该xlsx文件的用户返回一个简单的基于文本的网页。基本上,我需要Django从他们上传的xlsx文件的单元格生成文本。我试图使用openpyxl来做到这一点。在我的脚本运行之后,如何让Django生成包含xlsx文件结果的新页面?我需要创建一个新模板,一旦用户提交上传的xlsx文件,该模板就会重定向到它吗?这是一个例子。

# views.py
from django.shortcuts import render
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
from .forms import UploadForm
import openpyxl

def index2(request):
    if request.method != 'POST':
        form = UploadForm()
    else:
        form = UploadForm(request.POST or None, request.FILES or None)
        if form.is_valid():
            form.save()
            file = request.FILES['fileobj']
            wb = openpyxl.load_workbook(file)
            sheet = wb.get_sheet_by_name('Sheet1')
            # script that runs overs the sheet here...
            return HttpResponseRedirect(reverse('webpage with results'))


    context = {'form': form}
    return render(request, 'upload/upload_page.html', context)

1 个答案:

答案 0 :(得分:0)

我建议分解问题。现在你正试图一次解决几件事:

  1. 上传文件
  2. 保存文件
  3. 解析文件
  4. 渲染文件视图
  5. 我将1)和2)放在一边并独立处理XSLX加载/查看部分。例如,您可以在视图中对文件的路径进行硬编码,并以此方式使其坚如磐石。毕竟这只是发展。一旦它好了,删除硬编码文件并连接真正的上传/保存逻辑。

    实际上,您需要创建一个代表说UploadedExcelFile的模型类。上载文件时,创建一个实例并保存它(即数据库中的一行)。然后编写一个加载该模型实例的视图,该视图又可以加载Excel文件。

    您可能还想考虑摄取文件,而不是仅仅存储在磁盘上,或者使用某种异步方法(例如django-q)。这取决于几个因素,比如需要从文件中提取什么样的信息,是否可编辑等等。如果是我,而不知道系统的界限,我会做这样的事情:

    • 上传文件
    • 将文件存储在临时区域
    • 创建一个模型对象(即数据库行)来表示该文件,并说该状态为“正在处理”。
    • 启动django-q作业以摄取文件,并为其提供文件名
    • 将视图返回此模型。
    • 异步作业加载文件,将相关方面解析为json,将数据存储在模型对象中(即在数据库中),将模型状态标记为“就绪”。
    • 用户可以重新加载页面以查看数据(或使用websockets等告诉它重新加载)。