jxTMS:低成本快速定制的业务系统个人开发平台。

导出Excel文件

上篇文章讲述了jxTMS中如何从excel文件中导入数据。本文则讲述jxTMS中如何导出数据保存到excel文件中。

和excel中导入不同的是,导出到excel中需要先指定一个模板文件,即导出到excel需要如下的步骤:

  • 开发者先根据业务目的,设计好一个业务表单的excel文件模板
  • 开发者将此模板文件上传到jxTMS中
  • 在需要导出时复制这个模板
  • 向其中写入相关的业务数据
  • 保存
  • 下载到用户本地

上传模板文件

目前上传模板文件属于开发者才能使用的功能【demo中因未涉及到,所以未提供】,然后其和前文的上传文件的界面定义是一样的,只不过其命令响应事件是uploadTemplet。

uploadTemplet函数会将上传后的文件移动到webRoot目录下的templet目录中,并为其增加一个本组织简称的前缀,以避免两组织间同名文件的困扰。

打开模板文件

和前文打开上传文件不同的是,打开模板文件需要指定组织简称:



#打开本组织的模板文件【testFile.xls】中的【testSheet】表
    with  jxExcel(ctx.getCurrentOrg().getAbbr(),'testFile','testSheet') as e:



写入数据

和导入一样,也有两种类型的数据写入:

  • 零散数据的写入
  • 行数据的写入

其中,零散数据的写入是根据指定的格子名逐个格子一一写入:



e.setCellValue(cellName,value)



其中,cellName是【A1、C21】的格子名;而value则是给定的值。

注:模板文件存在的意义就是提前设计好表单格式,自然也就包括了每个格子的数据类型和显示格式,所以数据写入不需考虑太多,只需确保将正确的数据写到正确的格子中即可

行数据的写入则较为复杂,因为写入是需要在设计的带格式的格子中写入的,所以针对行数据,在设计表单时,首先应留出一个空白行,然后设计好该行中各个格子的显示格式,然后在写入时首先复制该行并原地插入,这就保证了行数据的格式正确。



newRow = e.copyRow(rowIndex)



注1:如果该行中有格子的合并,也会同样复制 注2:由于是复制该行后原地插入以保证原空白行还是在最下面,所以如果每次复制的行号不动,则最先插入的行会出现在表格的最底端,但后面复制到的行都是刚写入过数据的脏行,所以每个格子都应写数据以避免污染 注3:由于是复制后原地插入,所以原空白行的行号会自动加一,所以如果每次复制的行号也加一,则最先插入的行会出现在表格的最顶端

保存

直接调用如下函数即可:



tmpFilePath = e.saveTmp()



则jxTMS会将从模板文件复制过来并写入了业务数据的临时文件保存到临时目录中,并返回所保存的文件路径。

注:临时文件会根据配置被定期清理,所以不需关心其后的情况,而所有的临时文件在生成时其文件名都会被添加一个随机串号作为防碰撞信息,以避免重名所带来的问题,而该文件名没有任何办法再次使用,所以应视为一次性的用后失效

下载

调用saveTmp后会得到临时文件的存储路径,只需要将此路径作为一个a锚显示到界面即可:



self.clearA()
self.addHref(tmpFilePath,  '下载合同'.decode('utf-8'))



clearA是清楚清除附加工具条中的所有临时性的工具条。其作用是如果第一次生成的表单是错误,然后在页面中修改了某些信息然后再次请求重新生成新表单并下载,则清除掉之前的下载链接,以避免下载错误。而addHref则是将临时文件以正确的格式显示为页面上的一个名为【下载合同】的下载链接的a锚,用户点击此链接就会将刚生成的临时文件下载到本地。

注:jxTMS一定是保存了临时文件后才会将下载链接显示给用户,但笔者发现点击后需要二三十秒浏览器才会弹出对话框询问是保存还是直接显示。这是浏览器的原因而非jxTMS的原因

目前,jxTMS已经打包为云服务器镜像,开发者开箱即用: