jxTMS使用示例--导出excel

110 篇文章 0 订阅
44 篇文章 0 订阅

使用本示例需通过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。那么该如何做呢?

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值