Django框架下如何获取上传Excel文件路径并读取指定单元格内容
Django 上传Excel文件读取单元格内容解决方案
错误原因
Django 中request.FILES返回的UploadedFile对象,默认仅当上传文件大小超过配置项FILE_UPLOAD_MAX_MEMORY_SIZE(默认值为2.5MB)时,才会写入磁盘临时文件,此时才存在temp_name属性;小于该阈值的文件会直接存储在内存中,不存在temp_name属性,因此触发报错。
最优解决方案:直接读取内存文件(无需获取本地路径)
xlrd的open_workbook方法支持直接传入文件二进制内容,无需将文件落盘,适配所有大小的上传文件,修改post方法代码如下:
def post(self, request, *args, **kwargs): message = '' ExcelFile = request.FILES['import_file'] # 直接读取上传文件二进制内容传入xlrd,无需获取本地路径 wb = xlrd.open_workbook(file_contents=ExcelFile.read()) sheet = wb.sheet_by_index(0) A1 = sheet.cell_value(0,0) return render(request, self.template_name, {"message":A1})
注意:若使用xlrd 2.0及以上版本,默认仅支持xls格式文件读取,如需读取xlsx格式,可降级到xlrd==1.2.0版本,或替换使用openpyxl库处理。
备选方案:强制获取文件本地路径
如果业务场景必须获取上传文件的本地磁盘路径,可通过写入临时文件的方式实现:
import tempfile import os def post(self, request, *args, **kwargs): message = '' ExcelFile = request.FILES['import_file'] # 创建临时文件写入上传内容 with tempfile.NamedTemporaryFile(delete=False, suffix='.xlsx') as tmp_file: for chunk in ExcelFile.chunks(): tmp_file.write(chunk) tmp_path = tmp_file.name # 读取临时文件内容 wb = xlrd.open_workbook(tmp_path) sheet = wb.sheet_by_index(0) A1 = sheet.cell_value(0,0) # 用完删除临时文件,避免占用磁盘空间 os.unlink(tmp_path) return render(request, self.template_name, {"message":A1})
内容的提问来源于stack exchange,提问作者Merrin K
相关产品推荐
相关产品推荐

