使用本示例需通过docker容器,请先下拉jxTMS的docker镜像并按说明启动tms容器,并从helloWorld开始尝试。
导出excel
上一节我们演示了如何导入excel,本节我们演示如何导出数据到excel。大家打开demoCode目录下的【加班统计表.xls】文件,我们以此文件为模板导出数据。
和导入excel一样,导出excel时同样有:
-
离散数据
-
表数据
【加班统计表.xls】中有三个离散数据:C3的姓名、E3的部门和F8的总加班数,其中总加班数是特意放到了加班表的下方。【加班统计表.xls】中的加班表只有两行,所以我们打算放入四行,看看该如何做。
界面与入口
我们做个简单的导出界面和入口。在web文件中添加:
web export996 type div;
web export996t1 parent export996 type table title="导出示例",width=900,alone=true;
with export996t1 row 1 col c0 web n type button width=80,text='导出',motion=cmd,demand=export996,confirm='确认导出?!',onlyOnce=false;
就是一个导出按钮。
在op.py中添加:
@biz.Motion('demo.demo1','disp','export996')
@biz.OPDescr
def op1(json):
json.setShortcut('演示'.decode('utf-8'),'导出示例'.decode('utf-8'))
导出处理
在capa.py文件中增加导出按钮所对应的事件响应函数:
@myModule.event('cmd', 'export996')
def export996(self, db, ctx):
#打开本组织的模板文件:加班统计表.xls,并打开其中的加班统计表sheet
with jxExcel(ctx.getCurrentOrg().getAbbr(), '加班统计表'.decode('utf-8'),'加班统计表'.decode('utf-8')) as e:
#固定位置可以直接以excel中的格号来读
e.setCellValue('B2','2021年5月'.decode('utf-8'))
#填写员工姓名
e.setCellValue('C3',ctx.getCaller().abbreviation())
#填写部门
e.setCellValue('E3','技术部'.decode('utf-8'))
#表数据的插入,会使得【总计加班小时数】这一行下移,导致行号变化,所以为了避免麻烦,先插入F8中的汇总数
e.setCellValue('F8','120小时'.decode('utf-8'))
#设置表头行
e.head(4)
#将行号5【从0开始】这一行复制【不复制数据只复制格式】,相当于复制行号5后原地插入
r=e.copyRow(5)
#写新行中的数据
e.setCellValue(r,'日期'.decode('utf-8'),'2021-5-4')
e.setCellValue(r,'加班原由'.decode('utf-8'),'996')
e.setCellValue(r,'加班开始时间'.decode('utf-8'),'9点'.decode('utf-8'))
e.setCellValue(r,'加班结束时间'.decode('utf-8'),'21点'.decode('utf-8'))
e.setCellValue(r,'总计加班时长(小时)'.decode('utf-8'),'12')
r=e.copyRow(5)
#再次将行号5【从0开始】这一行复制,相当于复制行号5后原地插入
e.setCellValue(r,'日期'.decode('utf-8'),'2021-5-3')
e.setCellValue(r,'加班原由'.decode('utf-8'),'996')
e.setCellValue(r,'加班开始时间'.decode('utf-8'),'9点'.decode('utf-8'))
e.setCellValue(r,'加班结束时间'.decode('utf-8'),'21点'.decode('utf-8'))
e.setCellValue(r,'总计加班时长(小时)'.decode('utf-8'),'12')
r=e.copyRow(5)
e.setCellValue(r,'日期'.decode('utf-8'),'2021-5-2')
e.setCellValue(r,'加班原由'.decode('utf-8'),'996')
e.setCellValue(r,'加班开始时间'.decode('utf-8'),'9点'.decode('utf-8'))
e.setCellValue(r,'加班结束时间'.decode('utf-8'),'21点'.decode('utf-8'))
e.setCellValue(r,'总计加班时长(小时)'.decode('utf-8'),'12')
r=e.copyRow(5)
e.setCellValue(r,'日期'.decode('utf-8'),'2021-5-1')
e.setCellValue(r,'加班原由'.decode('utf-8'),'996')
e.setCellValue(r,'加班开始时间'.decode('utf-8'),'9点'.decode('utf-8'))
e.setCellValue(r,'加班结束时间'.decode('utf-8'),'21点'.decode('utf-8'))
e.setCellValue(r,'总计加班时长(小时)'.decode('utf-8'),'12')
#将写入数据的文件保存在临时位置
href = e.saveTmp()
#清除临时工具条
self.clearA()
#在临时工具条中增加一个工具条:下载加班统计表。点击该工具条,即下载刚才所保存的临时文件
self.addHref(href,'下载加班统计表'.decode('utf-8'))
注:我们插入的时间是从五月四号到五月一号,大家一会观察一下导出文件中的日期顺序
导出excel文件和导入excel文件有一点不同:导出excel文件需要一个模板。因为如果编程来设置导出文件的格式的话,很不直观,调整起来很麻烦,编程的工作量也非常大。所以需要先设置好一个模板文件,这样在导出时就可以不再管格式的问题了,直接向需要的格子中写入数据即可。
注:由于excel文件的数字显示有格式问题,可能会导致写入的数据与看到的不一致,所以我们强烈建立把模板中的所有格子的格式都先设置为文本
模板文件统一存放到web根目录【webRoot】下的templet目录中。本组织的代码维护肯定是由一个人或团队来服务的,所以本组织的模板文件可以保证不重名,但不同组织之间的模板文件如果由不同的团队维护的话,是无法保证可以不重名的,所以这些模板文件是上传到jxTMS中时,jxTMS为起添加了组织唯一简称来规避重名问题,则大家上传到jxTMS中的加班统计表的模板文件实际是:
./webRoot/templet/demo_6288_加班统计表.xls
大家不必关心这一点,只要将【加班统计表.xls】这个文件通过【运维管理->上传模板】上传一下就可以了。
然后用with语句打开:
with jxExcel(ctx.getCurrentOrg().getAbbr(), '加班统计表'.decode('utf-8'),'加班统计表'.decode('utf-8')) as e:
大家对比一下导入时的with语句,可以看到jxExcel多了获取本组织的唯一简称的参数。系统据此识别到底是从模板目录下读还是从上传文件处读文件。
由于表数据的长度不固定,所以表数据下方的离散数据应在表数据写入前先行写入。所以打开文件后的四行语句都是离散数据的写入。
下面和导入一样,指定了4号行为表头行,然后开始写入。但在写入之前,先copyRow了一个新的5号行,这时原来的5号行直到行末,会整体下移一行,为新行腾出空间。同时会将原5号行的格式复制给新的5号行,但原5号行中的数据并不会复制给新的5号行。
最后三行语句的含义我们等大家看完效果后再来解释。
我们将web、op.py、capa.py等文件按用sftp管理jxTMS的代码所述更新到/home/tms/codeDefine/demo/demo/demo1目录中。
然后执行一次热机刷新后,由于快捷栏中的入口有变化,所以先要退出登录,再次登录后点击快捷栏中的【演示->导出示例】,然后点击【导出】按钮。
大家看到了什么?!是不是在界面上面会多出来一个【下载加班统计表】的工具条:
而这个【下载加班统计表】是不是好像在哪看到过?嗯,看一看我们在capa.py文件中增加的代码的最后一句。
模板文件是需要反复用来导出时使用的,所以我们是不能将导出的数据写到模板文件中的,而是要写入到一个临时文件中,然后通知用户下载。我们添加到capa.py中的export996函数的最后三行代码就是用来做这个的。
-
首先,在数据导出后,我们需要将其用saveTmp函数保存到tmp目录【我们上节说过tmp目录中的文件会如何呢?】中
-
其次,在界面中添加一个临时的工具条,以便用户下载这个含有导出数据的临时文件
-
最后,为了避免用户反复导出,最后也不知道这些临时的工具条哪个是新的了,所以先clearA一下,把之前添加的临时工具条全部清除掉
大家现在点击一个这个临时的工具条,浏览器就会提示将下载的文件是打开还是保存到本地,大家就先选直接打开好了,浏览器就会下载该文件并显示出来。
注:下载很快,但下载完显示出来却总需要等上二三十秒,多个浏览器都是如此:(
大家有没有奇怪一点,我们在写表数据时,是从5-4倒数到5-1的,但我们看到的文件中却是从5-1正数到5-4的。为什么呢?
大家请仔细回忆一下,我上面讲的copyRow的工作原理,并用笔自己画一下,看看为什么会如此。
如果大家不想在插入数据时从5-4倒数到5-1,而就想从5-1正数到5-4。那么该如何做呢?