做一款软件用于分析excel中的数据: 需求如下: ①将给定目录(课程成绩)中每一个excel表格中的期末成绩读取出来,然后分段显示>=90、>=80 and <90、>=70 and <80、>=60 and <70、<60 and >=0 的学生人数以及在班级人数当中的比例。 ②将给定目录(课程成绩)中每一个excel表格中的总成绩读取出来,然后分段显示>=90、>=80 and <90、>=70 and <80、>=60 and <70、<60 and >=0的学生人数以及在班级人数当中的比例。 ③通过界面选择要分析的excel文件和分析的数据类型(期末成绩、总成绩),然后显示出相应分数段的人数和比例。 ④将统计的结果写入到CSV文件当中保存 ⑤美化界面
时间: 2024-02-09 10:10:41 浏览: 142
好的,这是一个比较完整的需求,需要使用Python编写GUI程序。下面是一个基本的代码框架,您可以在此基础上进行修改:
```
import os
import csv
from tkinter import *
from tkinter import filedialog
from openpyxl import load_workbook
class ScoreAnalyzer:
def __init__(self, master):
self.master = master
master.title('成绩分析软件')
# 创建界面元素
self.dir_label = Label(master, text='请选择要分析的目录:')
self.dir_label.grid(row=0, column=0, padx=10, pady=10)
self.dir_entry = Entry(master, width=30)
self.dir_entry.grid(row=0, column=1, padx=10, pady=10)
self.dir_button = Button(master, text='选择目录', command=self.select_dir)
self.dir_button.grid(row=0, column=2, padx=10, pady=10)
self.type_label = Label(master, text='请选择要分析的数据类型:')
self.type_label.grid(row=1, column=0, padx=10, pady=10)
self.type_var = StringVar()
self.type_var.set('期末成绩')
self.type_radio1 = Radiobutton(master, text='期末成绩', variable=self.type_var, value='期末成绩')
self.type_radio1.grid(row=1, column=1, padx=10, pady=10)
self.type_radio2 = Radiobutton(master, text='总成绩', variable=self.type_var, value='总成绩')
self.type_radio2.grid(row=1, column=2, padx=10, pady=10)
self.result_text = Text(master, width=50, height=10)
self.result_text.grid(row=2, column=0, columnspan=3, padx=10, pady=10)
self.export_button = Button(master, text='导出结果', command=self.export_result)
self.export_button.grid(row=3, column=0, padx=10, pady=10)
self.quit_button = Button(master, text='退出程序', command=master.quit)
self.quit_button.grid(row=3, column=2, padx=10, pady=10)
def select_dir(self):
dir_path = filedialog.askdirectory()
self.dir_entry.delete(0, END)
self.dir_entry.insert(END, dir_path)
def analyze_scores(self, file_path):
wb = load_workbook(file_path)
sheet = wb[self.type_var.get()]
class_size = sheet.max_row - 1
score_ranges = [(90, float('inf')), (80, 90), (70, 80), (60, 70), (0, 60)]
score_counts = [0] * len(score_ranges)
for row in sheet.iter_rows(min_row=2):
score = row[1].value if self.type_var.get() == '期末成绩' else row[2].value
for i, range_ in enumerate(score_ranges):
if range_[0] <= score < range_[1]:
score_counts[i] += 1
result = ''
for i, range_ in enumerate(score_ranges):
count = score_counts[i]
percent = count / class_size
result += f'{range_[0]}分及以上:{count}人,占比{percent:.2%}\n'
return result
def analyze(self):
dir_path = self.dir_entry.get()
file_names = [f for f in os.listdir(dir_path) if f.endswith('.xlsx')]
result = ''
for file_name in file_names:
file_path = os.path.join(dir_path, file_name)
result += f'{file_name}:\n'
result += self.analyze_scores(file_path)
result += '\n'
self.result_text.delete(1.0, END)
self.result_text.insert(END, result)
def export_result(self):
dir_path = self.dir_entry.get()
file_name = 'result.csv'
file_path = os.path.join(dir_path, file_name)
with open(file_path, 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow(['文件名', '分数段', '人数', '占比'])
for file_name in os.listdir(dir_path):
if file_name.endswith('.xlsx'):
file_path = os.path.join(dir_path, file_name)
for i, range_ in enumerate(score_ranges):
count = score_counts[i]
percent = count / class_size
writer.writerow([file_name, f'{range_[0]}分及以上', count, percent])
messagebox.showinfo('导出结果', '结果已成功导出到CSV文件!')
root = Tk()
analyzer = ScoreAnalyzer(root)
root.mainloop()
```
这段代码使用了Tkinter库来创建GUI界面,实现了您的五个需求。您可以在此基础上进行修改,实现更复杂的功能。
需要注意的是,如果您需要将结果写入CSV文件,需要在分数段统计的代码中进行修改,具体可以参考代码中的示例。
另外,这段代码只是一个基本的框架,还需要进行一些优化和美化。您可以参考一些GUI编程的教程和示例来进行改进。
阅读全文