Django中使用XlsxWriter生成Excel时遭遇SyntaxError问题求助
首先看你的回溯信息,错误是SyntaxError: invalid syntax (views.py, line 430),这说明你的代码里存在语法问题,导致整个views模块无法被导入(因为URL配置里导入了views)。
核心语法错误修复
查看你的excelr函数,在这一行:
worksheet.write(i+1,5, str(expstring(exp[i]))
这里缺少了一个右括号!str(expstring(exp[i]))后面应该再加一个)来闭合worksheet.write()的参数列表。修正后这一行应该是:
worksheet.write(i+1,5, str(expstring(exp[i])))
这个语法错误会导致Python解析器无法正确读取你的代码,所以在导入views模块时就触发了错误,这也是为什么错误回溯显示在URL配置的from . import views这一步。
其他潜在问题优化
除了语法错误,还有几个点可以优化,避免后续出现问题:
文件名中的非法字符:
datetime.now()生成的字符串包含冒号(比如2024-05-20 14:30:00),而大多数操作系统不允许文件名里有冒号,会导致创建文件失败。可以把时间格式改成不含冒号的形式,比如:from datetime import datetime # 使用不含冒号的时间格式 timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") path = f"registrationsdb/{user.username}_{timestamp}_registrations.xlsx"Django视图返回值问题:你的视图现在直接返回文件路径,但Django视图需要返回
HttpResponse或其子类才能正确响应用户请求。要让用户能下载生成的Excel文件,应该返回FileResponse,示例如下:from django.http import FileResponse import os def excelr(request): # ... 前面的代码保持不变,修正语法错误和文件名后 ... workbook.close() # 打开文件,返回下载响应 file_path = os.path.abspath(path) response = FileResponse(open(file_path, 'rb'), as_attachment=True) response['Content-Disposition'] = f'attachment; filename="{user.username}_registrations.xlsx"' return response查询优化:你在循环里每次都查询
Experience.objects.filter(delegate=dele),可以使用select_related或prefetch_related来减少数据库查询次数,提升性能:# 获取registrations时预关联delegate和对应的experience registrations = Registration.objects.filter(MUN=user).select_related('delegate').prefetch_related('delegate__experience') # 这样在循环里可以直接获取:row.delegate.experience.all()
修正语法错误后,你的视图应该能正常导入并运行了,再结合上面的优化点可以避免后续的其他问题。
内容的提问来源于stack exchange,提问作者ScreamingPigeon

