注册 登录
编程论坛 Python论坛

求助,openpyxl不能把数据写进excel表格

奋发的火龙果 发布于 2023-04-16 08:18, 1582 次点击
import openpyxl
filename="英语2205-08.xlsx"
wb=openpyxl.load_workbook(filename)
#打开excel文件                        
ws=wb.worksheets[0]
#激活sheet1
total=list(ws.values)[6:98]
#确定范围
dic={}
#创建字典
for item in total:
    dic[item[1]]=item[2]
#读取学号和姓名,放入字典
   
for i in dic:
    print(i,dic[i],end="")#先输出一位学生的学号和姓名,再判断学生出勤情况
    for x in range(7,99):
        n=input()
        if n=="1":#若学生已到,则输入“1”
            ws["F7"]="√"#在表格中对应位置标明出勤情况
            x=x+1
            print("该学生已到")
            break#退出内循环
        elif n=="0":#若学生未到,则输入“0”
            ws["F8"]= "×"#在表格中对应位置标明出勤情况
            x=x+1
            print("该学生未到")
            break#退出内循环
else:
    print("\n本轮点名结束")
   
wb.save("英语2205-08.xlsx")#保存

wb.close()#关闭

15 回复
#2
sheeboard2023-04-16 08:34
上传个测试文件,或贴出错误信息,方便别人帮你debug。
#3
东海ECS2023-04-16 10:04
问题可能出在for循环中的写操作。可以尝试在每个学生循环完后,用ws.cell(row,column,value)来写入表格,而不是在循环内部直接写入单元格。

例如,在每个学生循环完后,可以添加以下代码:

for num in range(1, len(dic)+1):
    ws.cell(row=num+6, column=6, value="" if dic[num] == "1" else "×")

其中,6表示F列的列号,num+6表示该学生在表格中的行号。value根据该学生的出勤情况赋值为"√"或"×"。

注意:以上只是猜测,准确请提供错误提示
#4
奋发的火龙果2023-04-16 11:03
只有本站会员才能查看附件,请 登录
我自己运行的时候没有出现错误信息,它会按照我的顺序先输出学生的学号和姓名,在我分别输入1和0 的时候输出“该学生已到”和“该学生未到”,输入其他数字的时候是没反应的,但是很奇怪的是“√”和“×”写不进excel表格里,我的excel表格和这个程序已经放在同一个目录里面了,感谢各位

[此贴子已经被作者于2023-4-16 11:31编辑过]

#5
奋发的火龙果2023-04-16 11:04
回复 2楼 sheeboard
感谢感谢,我已经发了
#6
奋发的火龙果2023-04-16 11:05
回复 3楼 东海ECS
感谢感谢,我后来回去看的时候改正了,我发了现在写的,请问能帮我看看吗?
#7
sheeboard2023-04-16 11:28
以下是引用奋发的火龙果在2023-4-16 11:04:23的发言:

感谢感谢,我已经发了

zip文件里没excel数据文件

[此贴子已经被作者于2023-4-16 11:32编辑过]

#8
奋发的火龙果2023-04-16 11:34
回复 7楼 sheeboard
我们老师发给我们的是所有学生的学号,好像不能发出来了吧,十分抱歉...
#9
奋发的火龙果2023-04-16 11:41
回复 7楼 sheeboard
只有本站会员才能查看附件,请 登录
表格大概长这样....

[此贴子已经被作者于2023-4-16 11:43编辑过]

#10
东海ECS2023-04-16 11:56
然后呢?
#11
sheeboard2023-04-16 12:53
勾号和叉号的问题,我用unicode,如
ws['f7']='\u2713'
ws['f9']='\u00D7'
只有本站会员才能查看附件,请 登录


代码逻辑还是有问题的,输入不是0和1要重新输,其它的楼上有人说了。

[此贴子已经被作者于2023-4-16 12:56编辑过]

#12
奋发的火龙果2023-04-16 14:24
回复 10楼 东海ECS
或许是还需要我给什么信息吗?
#13
奋发的火龙果2023-04-16 15:12
回复 11楼 sheeboard
我是想通过输入“1”代表学生已到,然后在对应单元格里写入“√”,通过输入“0”代表学生未到,然后在对应单元格里写入“×”,跟其他数字没有关系,但是我的程序运行之后没有弹出错误信息,可以按照“先系统每次自动输出学生学号和姓名,在输入'1'或'0'的时候输出'该学生已到'或'该学生未到'”这样的步骤进行,不过内容写不进excel表格
#14
奋发的火龙果2023-04-16 15:16
回复 13楼 奋发的火龙果
我刚才试了一下一直输“1”把整个名单的人名点完,最后excel表格里面只有第一个人的出勤情况那里打了“√”,之前只点几个人的名字的话表格没反应
#15
sheeboard2023-04-16 16:32
程序代码:

from openpyxl import load_workbook
wb=load_workbook('英语2205-08.xlsx')
ws=wb.worksheets[0]

for row in ws.iter_rows(min_row=7,max_col=6,max_row=ws.max_row):
    while True:
        print(row[1].value,row[2].value)
        n=input('请输入 0 或 1:')
        if n=='1':
            row[5].value='\u2713'
            print('该学生已到')
            break
        elif n=='0':
            row[5].value='\u00D7'
            print('该学生未到')
            break
        else:
            print('输入错误,再输一遍')
print("\n本轮点名结束")

wb.save('结果.xlsx')

不知道是不是这个意思

[此贴子已经被作者于2023-4-16 16:45编辑过]

#16
奋发的火龙果2023-04-16 22:12
回复 15楼 sheeboard
对对对对对对!!!!!我就是想这个意思来着。哇,真的太感谢了!!!!!或许,方便告诉我我那个程序哪里有问题吗?总之,无论怎么样都很感谢在座的各位呀!!!!!!还有这个伟大的论坛!!!!
1