1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | -*- coding: GB2312 -*- def mark(score): '@FUNCTION=MARK_SCORE\n'\ '@SYNTAX=mark_score(score)\n'\ '@DESCRIPTION= determine the level for a score\n'\ '@EXAMPLES= To determine a score in A1: \n'\ ' mark_score(a1)\n'\ '@SEEALSO=' level='N/A' if score < 0: level = cstr('非法分数') elif score < 60: level = cstr('未及格') elif score < 80: level = cstr('及格') elif score < 90: level = cstr('良') elif score <= 100: level = cstr('优秀') else: level = cstr('非法分数') return level 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) } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <?xml version="1.0" encoding="UTF-8"?> <plugin id="Gnumeric_PyFunc"> <information> <name>Exam functions</name> <description> Determine rank for exam score </description> <require_explicit_enabling/> </information> <loader type="Gnumeric_PythonLoader:python"> <attribute value="exam" name="module_name"/> </loader> <services> <service type="function_group" id= "exam"> <category> Exam</category> <category xml:lang="zh_CN">Exam</category> <functions> <function name= "mark_score"/> </functions> </service> </services> </plugin>OK!现在启动Gnumeric (4) ,按图示在A列输入一列成绩,然后在B1单元格内输入公式:'=mark_score(A1)', 然后利用鼠标拖动复制公式的功能,把公式复制到对应的B列,就会发现所有标志在B列中已经自动生成了。 插图1 成绩分类 更进一步 如果只是对单元格数据简单计算的话,那么Python在Gnumeric中充其量是好玩的玩具罢了,但Python插件的功能远不只这些,Python可以控制读写单元格区域(Range)的数据,访问Gnumeric的全部函数,控制工作表的创建等,把这些功能有机地组合起来就能完成复杂的任务了。本节对全班成绩做进一步的处理,利用RPy (5) 的summary函数对所有的分数进行简单的统计,计算最值、均值、中位数和两个四分位数,并把所得计算结果打印到新的工作表中。 要想统计全班成绩,首要的任务就是从Gnumeric获取数据。对于大批量的数据,Gnumeric是用单元格区域(Range)来表示的,然而在调用过程中传递给Python的是单元格区域引用(RangeRef),所以需要对单元格区域引用(RangeRef)做相应的转换以便提取批量数据。不幸的是,Gnumeric的API正处于发展阶段,没有直接的转换方法。为此,笔者利用了Gnumeric自身的函数构建了一个PyGnmRange类。PyGnmRange对象以单元格区域引用(RangeRef)为初始化参数,为该单元格区域中的构建所有单元格的索引,即"_table"属性,同时提供几个方法来方便地访问,这样我们就可以配合Gnumeric模块中的Sheet对象操纵单元格数据了。 代码 6 类PyGnmRange的定义
另外PyGnmRange类定义需要注意两点: 1. 单元格下标采取了列优先的表示方法,从零开始计数,例如B3表示为(1,2),这样同时也是为了与Gnumeric规范保持一致,便于操纵单元格数据。 2. 类初始化函数使用了四个Gnumeric的函数,分别为column、columns、row、rows,其功能如下: file:///C:/Users/21408/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif 有了前面的准备,我们就可以具体实现summary函数了。summary函数通过gnm_scores参数获得当前的单元格区域引用,并利用该参数创建PyGnmRange对象,计算所有单元格的下标;又通过Gnumeric模块的workbooks和sheets函数,取得工作表1的对象;从而结合工作表对象和单元格下标来操作单元格数据。而真正的计算R语言完成的,RPy模块则是联接Python和R语言的桥梁 (6) 。最后,summary函数取得R语言计算的结果并通过Gnumeric模块将其打印到一个新建的工作表里。 代码 7 exam.py 中summary函数定义
函数编写完之后就是函数注册了,函数原型字典只有一行,唯一需要注意的是,单元格区域引用数据类型需要用"r"来表示。plugin.xml文件也只需要加入下面一行: 代码 8 summay函数的plugin.xml配置文件
下面的两张是插件函数的运行效果图,输入数据是随机生成的80个100以内的浮点数,函数插在B1单元格内,由于该函数的目的是生成简单的报表而不是返回值,所以运行结束后B1单元格内依然空白,而所有的数据全部打印在新建的工作表4内(图2和图3)。 插图2 全班成绩和函数的输入 插件部署 Gnumeric插件部署及其简单,用户只需要在自己主目录下新建.gnumeric目录,放入插件函数即可,例如exam.py和plugin.xml就是位于 <HOME>/.gnumeric/<version> (7)/plugins/exam/,重新启动Gnumeric插件就生效了 (8) 。 |
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
添加我为好友,拉您入交流群!
请使用微信扫一扫!