# -*- coding: GB2312 -*- import Gnumeric import rpy def summary(gnm_scores): '@FUNCTION=summarize_scores\n'\ '@SYNTAX=summarize_scores(gnm_scores)\n'\ '@DESCRIPTION=Summarize all scores of the class\n'\ '@EXAMPLES=To summarize score in A1:A50,\n'\ ' summar_scores(A1:A50)\n' '@SEEALSO=' r = PyGnmRange(gnm_scores) wb = Gnumeric.workbooks()[0] s = wb.sheets()[0] scores = [s[index].get_value() for index in r] rpy.r.assign('scores',scores) res = rpy.r('summary(scores)') report(wb.sheet_add(),res) def mark(score): '@FUNCTION=mark_score\n'\ '@SYNTAX=mark_score(score)\n'\ '@DESCRIPTION=determine the rank for a score\n'\ '@EXAMPLES=To determine a score in A1: \n'\ ' mark_score(a1)\n'\ '@SEEALSO=' var = 'N/A' if score < 0: var = cstr('非法分数') elif score < 60: var = cstr('未及格') elif score < 80: var = cstr('及格') elif score < 90: var = cstr('良') elif score <= 100: var = cstr('优秀') else: var = cstr('非法分数') return var class PyGnmRange: def __init__(self, gnm_range_ref): # isinstance(gnm_range_ref,GnmRangRef) self._range_ref = gnm_range_ref get_cols = Gnumeric.functions['column'] get_rows = Gnumeric.functions['row'] get_col_num = Gnumeric.functions['columns'] get_row_num = Gnumeric.functions['rows'] cols = get_cols(gnm_range_ref) rows = get_rows(gnm_range_ref) # column first table self._table = [] self._col_num = get_col_num(gnm_range_ref) self._row_num = get_row_num(gnm_range_ref) for i in range(self._col_num): for j in range(self._row_num): self._table.append((cols[i][j]-1, rows[i][j]-1)) def col_num(self): return self._col_num def row_num(self): return self._row_num def get_col(self,col): start = (col-1) * self._row_num end = col * self._row_num return self._table[start:end] def get_row(self,row): indexes = [(i*self._row_num)+(row-1) for i in range(self._col_num)] return [self._table[i] for i in indexes] def __iter__(self): return iter(self._table) def report(sheet,dic): sheet[0,0].set_text(cstr('报表')) i = 0 for key,value in dic.items(): sheet[i,1].set_text(key) sheet[i,2].set_text(str(value)) i += 1 return True def cstr(str): """ translate a chinese string into utf-8 string for GTK+ """ return unicode(str,'gbk').encode('utf8') exam_functions = { 'mark_score' : ('f','score',mark), 'summerize_scores':('r','gnm_scores',summary) }