python - Django上传excel文件,用pandas处理,下载为csv
问题描述
我在本地主机上运行 Django(稍后在局域网上运行),我的想法是我可以进入网页,单击一个按钮,提示您从计算机中选择一个 excel 文件。Pandas 将对上述 excel 文件进行处理,Django/Pandas 将制作此 Pandas 数据框的 excel 文件作为下载提示。
我已经运行了 Django,并使用模块“Django-Excel”中的以下代码完成了我想要的基本操作。Excel 文件输入---> excel 文件输出,不将文件保存到数据库或仅将其保存在内存中的任何内容。但是,我找不到将熊猫硬塞进去的方法。我遇到的主要问题是我不确定如何使用 Pandas 返回一个 excel 文件。我一直在我的离线 python 代码中使用'.to_excel()',但是,还没有找到在运行 Django 的本地主机中使用它的方法。我确定我错过了一些非常简单的东西,但我就是无法得到它。
也许如果有人可以举一个简单的例子,比如上传一个excel,pandas会将excel中的一列数字乘以2,输出新的excel以读取/保存。
from django.shortcuts import render, redirect
from django.http import HttpResponseBadRequest, HttpResponse
from _compact import JsonResponse
from django import forms
import django_excel as excel
from polls.models import Question, Choice
class UploadFileForm(forms.Form):
file = forms.FileField()
# Create your views here.
def upload(request):
if request.method == "POST":
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
filehandle = request.FILES['file']
# do pandas here to filehandle/ put filehandle into a function
return excel.make_response(filehandle.get_sheet(), "csv",
file_name="download")
else:
form = UploadFileForm()
return render(
request,
'upload_form.html',
{
'form': form,
'title': 'Excel file upload and download example',
'header': ('Please choose any excel file ' +
'from your cloned repository:')
})
非常感谢,如果不清楚,对不起这是我第一次在这个网站上发帖,如果你不明白我的要求,我会详细说明。
解决方案
我会为将来看到这个的人上传我的答案:-)
def uploads(request):
if request.method == "POST":
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
kappa = request.FILES['file']
# Do work on kappa/excel file here with Pandas
output = io.BytesIO()
writer = pd.ExcelWriter(output, engine='xlsxwriter')
kappa.to_excel(writer, index=False)
writer.save()
output.seek(0)
response = HttpResponse(output,
content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
response['Content-Disposition'] = 'attachment; filename=%s.xlsx' % 'Download'
return response
else:
form = UploadFileForm()
return render(request, 'upload_form.html', {'form': form})
我放弃了使用“Django-excel”,而是使用了 io 模块中的“BytesIO”。这具有不依赖第三方模块的好处。您可以将 Pandas 数据帧写入 io.BytesIO(),然后在 HttpResponse 中使用它。
推荐阅读
- javascript - 返回对象而不是函数
- loops - 计算10个位置的距离时如何在飞镖颤动中循环(for)?
- vue.js - 为什么我的 JSFiddle 可以工作,但我的 Codepen 不行?
- ubuntu - 如何解决问题:pscp:无法打开/home/cse316/lab1.rar:权限被拒绝
- flutter - 为什么我会收到错误:ADB exited with exit code 1
- git - Github:无法从跟踪列表中删除我的数据库
- java - 如何在java中下载网站的源代码
- javascript - 如何使用 javascript 检查变量是否为特定类型?
- javascript - 超出最大调用堆栈大小错误节点js
- jquery - Owl carousel 2 即使在使用 responsiveclass true 后也无法在响应模式下工作