笔者之前用Python编写了一个复习单词的脚本,前端时间尝试将其调整为网页的版本。在这里做一些问题的记录。
其功能非常简单,用户以Excel表格的形式上传自己今日新记录的单词,样例格式如下:
四列分别表示:单词,翻译,出现的位置,记录的时间。
程序将用户新记录的单词添加到总单词表中,并进行去重合并操作。
程序根据目前时间,查找出1,2,7,15天之前的单词,用作复习。
程序流程如图:
这里仅对遇到的问题做一些记录:
目录
AssertionError: SRE module mismatch错误,并且无法查看虚拟环境下的包(pip list失效)
Pycharm 中使用Django报错,许多包无法导入,报错:AttributeError: __name__
Pycharm 中使用Anaconda虚拟环境,出现:
AssertionError: SRE module mismatch错误,并且无法查看虚拟环境下的包(pip list失效)
删除环境变量中的PYTHONPATH,重启pycharm即可。
Pycharm 中使用Django报错,许多包无法导入,报错:AttributeError: __name__
可能是python版本有问题或者python安装的问题。
解决方法:
1.使用Anaconda新建一个纯净的虚拟环境,使用虚拟环境运行Django即可。
2.如果不是使用的Anaconda,重装python即可。
注:python3.7 与 Django3.2兼容
前后端处理Excel表格:
1.接受并处理:
0.从request里面接收:
file_storage = request.files.get['file_data'] #是storage格式
file_data = file_storage.read() #是二进制流
print(file_storage.filename) #输出文件的名字
1.openpyxl,不适用xls
wb = openpyxl.load_workbook(file_storage)#打开Excel
sheet = wb.worksheets[0] #打开表
#sheet = wb['sheet1'] #打开表
# sheet['A1'].value #获取数据
for row in sheet.iter_rows(): #遍历表
for cell in row:
print(cell.coordinate, cell.value)
sheet['A1'].value='1111111' #修改数据,行列都是1开始
#sheet.cell(1,1).value='1111111'
#sheet.cell(1,1,'111111')
#max_row=sheet.max_row
#max_cow = sheet.max_column
wb.save('1234.xlsx') #保存文件
###以下为新建文件的方法
wb=openpyxl.Workbook()
wb.create_sheet(index=0,title='小猪')
2.pyexcel,缺点是只能读取本地的文件,不能直接读取前端发来的数据流。
3.xlrd,不适用xlsx ,而且此方法只能读文件,不能写文件。
使用xlwt可以写Excel文件,但是必须生成一个新的Excel文件
使用xlutils可以进行读写Excel文件,但是其实是进行了一个拷贝。这里不多研究,可参考网上其他文章。
2.插入和删除操作
1.插入操作
ws.insert_rows(2,3)#在第二行的前面插入3行,所以第一个参数不能是0
ws.insert_cols(1,2)#在第一列的前面插入2列,所以第一个参数不能是0
2.删除操作
wk_sheet.delete_rows(3,2) #删除从第一行开始算的2行内容
wk_sheet.delete_cols(1,2) #删除从第一列开始算的2列内容
3.处理并返回:
1.转换为字节流/二进制流。
File_data是前文中直接接收到的二进制流。可以直接构造返回。
rv = make_response(file_data)
rv.headers['Content-Type'] = "application/vnd.ms-excel"
# rv.headers["Cache-Control"] = "no-cache"
rv.headers['Content-Disposition'] = 'attachment; filename={}.xlsx'.format('Output')
return rv
2.设置返回格式,(makeResponse),以附件的形式
3.使用flask-Excel库和pyexcel库,返回Excel文件
x = p.get_sheet(file_name='total.xlsx')
return excel.make_response(x, "xls", file_name="export_data")
3.返回本地文件:
1.返回静态文件
2.从目录返回,直接找到对应文件发送。
directory_path = os.getcwd() # 假设在当前目录
return send_from_directory(directory_path, 'total.xlsx', as_attachment=True)
jQuery和Ajax通信模板:
注:ajax通信仅能交换数据,但是不能从后端下载文件
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script>
</head>
<script>
$('#today').click(function () {
$.ajax({
url:'/get_today',
type:'post',
data:'2021/4/30',
success:function (data) {
alert(data)
},error:function () {
alert('失败!')
}
})
})
</script>
前端设置按钮,从后端下载固定文件 以及 指定文件:
$('#all').click(function () {
{#var queryForm = $("#queryCourseForm");#}
var exportForm = $("<form action='/get_all' method='post'></form>")
{#exportForm.html(queryForm.html());#}
$(document.body).append(exportForm);
exportForm.submit();
exportForm.remove();
})