天天看點

jxTMS使用示例--導出excel

使用本示例需通過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目錄中。

然後執行一次熱機重新整理後,由于快捷欄中的入口有變化,是以先要登出,再次登入後點選快捷欄中的【示範->導出示例】,然後點選【導出】按鈕。

大家看到了什麼?!是不是在界面上面會多出來一個【下載下傳加班統計表】的工具條:

jxTMS使用示例--導出excel

而這個【下載下傳加班統計表】是不是好像在哪看到過?嗯,看一看我們在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。那麼該如何做呢?