當前位置:
首頁 > 最新 > 納稅服務系統二POI、用戶唯一性校驗

納稅服務系統二POI、用戶唯一性校驗

前言

用戶模塊:本文主要的知識點有以下:

使用POI來操作Excel,對數據進行導入和導出

對用戶進行唯一性校驗,不能同時出現相同的用戶

POI基礎

再次回到我們的用戶模塊上,我們發現還有兩個功能沒有完成:

這裡寫圖片描述

對於將網頁中的數據導入或導出到excel文件中,我們是完全沒有學習過的。但是呢,在Java中操作excel是相對常用的,因此也有組件供我們使用

JAVA中操作Excel的有兩種比較主流的工具包

JXL

POI

這次我們主要學習的是POI操作excel。

JXL有一個缺陷,只能操作03或以前版本的excel,而POI可以操作97-07版本的。

面向對象看excel

首先,要用Java來操作excel的話,肯定用對象來指定excel相關的內容的。我們來看看excel由什麼組成:

這裡寫圖片描述

POI是這樣看的:

整個excel稱作為工作薄

工作薄下可以創建很多張表,稱作為工作表

工作表有非常多的行

行又可細分單元格【指定行的列就可以定位到工作表任意的位置了】

給我們一頓分析以後,我們發現它們之間是有從屬關係的:

工作表從屬於工作薄

行從屬於工作表

單元格從屬於行

操作Excel步驟

導入POI開發包:

poi-ooxml-3.10.1-20140818.jar,

poi-ooxml-schemas-3.10.1-20140818.jar,

以及複製在ooxml-lib目錄下的xmlbeans-2.6.0.jar,dom4j-1.6.1.jar【dom4j一般在項目導入的時候已經存在了】。

poi-ooxml-3.11-20141221.jar

創建Excel並寫入數據

這裡寫圖片描述

這裡寫圖片描述

讀取Excel的數據

這裡寫圖片描述

這裡寫圖片描述

03與07版本

03版本使用的是HSSFWorkbook這麼一個類來操作03的Excel數據

07版本使用的是XSSFWorkbook這麼一個類來操作07的Excel數據

其實他們的方法都是一樣的,僅僅是類的不同。而使用哪個對象,我們可以根據後綴名來判斷創建哪個對象【是03還是07】

Excel樣式

回到我們的需求中,當我們使用POI導出數據的時候,Excel應該要有樣式才好看的。類似下面的模板:

這裡寫圖片描述

在POI中可以利用格式化對象來格式化excel文檔;也即設置excel內容的樣式。

POI中主要的格式化對象常用的有:

合併單元格

設置單元格樣式

設置單元格字體

居中

背景顏色等

POI的樣式對象明顯是屬性工作薄的。應用於工作表

這裡寫圖片描述

合併單元格

屬於工作薄,應用於工作表

創建合併單元格對象的時候要給出4個參數,它們分別表示:

行的起始位置

行的結束位置

列的起始位置

列的結束位置

這裡寫圖片描述

設置單元格樣式

上面的圖我們可以發現,我們已經實現了合併單元格,但是一般我們都是將字體設置成居中、字體大小等等。POI也提供了相對應的對象給我們實現:

設置居中

樣式屬於工作薄,應用於單元格:

這裡寫圖片描述

設置字體

字體屬於工作薄,應用於樣式【和css是類似的】

這裡寫圖片描述

實現導出功能

綁定按鈕事件,請求Action處理導出,打開一個輸入框給用戶下載

Action處理

Service實現

效果


優化一

我們來看下面這段代碼,他們都要設置居中,字體就除了大小不同。其他都相同。卻佔用了這麼多代碼!!!

於是我就抽取成一個方法來得到樣式

需要工作薄來創建樣式

只有字體的大小是變化的

當使用的時候,代碼就變成了這樣調用:

優化二

我們的Service業務層的代碼看起來太多了。這樣我們維護起來就不方便了。

我的做法是:把代碼抽取成Utils的方法,Service層調用就好了。

實現導入功能

現在我有這麼一個Excel文件,要把信息存儲到資料庫中,並且在瀏覽器顯示出來

這裡寫圖片描述

其實導入Excel就是文件上傳,只不過不用把文件保存在伺服器的硬碟數據中而是保存在資料庫中,輸出到瀏覽器就行了。

Action封裝文件上傳

Action處理

主要判斷有沒有上傳文件。給Service層處理

Utils封裝成集合返回

Service調用

用戶唯一性校驗

接下來是對其進行補充…主要完成用戶唯一性校驗的問題

我們發現:在新增或編輯頁面的時候用戶的賬號是可以重複的,這是不符合我們的邏輯的。

這裡寫圖片描述

當用戶新增賬號的時候,如果該賬號已經存在了,就應該告訴用戶該賬號重複,不能使用該賬號。

分析

用戶在填寫完賬戶的時候,就應該去做校驗了。【使用AJAX】

校驗的工作是什麼呢????其實就是去查找資料庫有沒有對應的賬戶記錄,如果有,那麼就告訴用戶存在了。如果沒有,就沒問題了。

上面已經說了有兩處需要校驗用戶唯一性的問題:

新增頁面

修改頁面

新增頁面和修改頁面是有不同的處理方案的,因為在修改頁面時,如果用戶不修改賬戶,該用戶的賬戶本來就存在了。因此我們要排除該用戶的當前賬戶相同的問題,其實也很簡單。

在修改頁面時是需要id傳遞過去的,而新增用戶是不需要的。在查詢資料庫的時候,看看有沒有id,如果有id就多一個條件即可!

條件就是不把本賬戶的算進去

前台使用AJAX處理

為賬戶的輸入框添加事件

當賬戶的輸入框修改時,就去資料庫查詢有沒有相同的賬戶名字。

值得注意的是:本來我是在控制項上添加一個id,使用Jquery得到id所在的控制項,然後綁定事件,但是用不了。

2017年9月24日19:30:50更新。我覺得當時很可能就是沒有在$(function(){});內進行判定。

所以,我只能在控制項上綁定一個靜態方法了

把賬號的值傳遞給伺服器,接受伺服器返回的值

編寫Dao方法

我們使用的是Hibernate,編寫的HQL語句是FROM 實體,並不是"SELECT * FROM….. "

Service調用Dao

Action處理

由於經常要判斷傳遞過來的數據時候為null,是否為"",我們使用StringUtils來進行判斷:

前台提示

GIF

這裡寫圖片描述

完善

上面只是完成了校驗用戶名是否唯一的功能,但是如果用戶不聽我的勸告,照樣去提交表單,還是可以完成的。

於是在提交表單的時候要判斷是否合法才能讓用戶提交:

把submit按鈕改成是button,提供單擊事件

改成是同步的主要原因是:我們的數據值要依賴與Ajax的返回值。由於Ajax是無刷新的訪問,因此我們需要改成是同步的。

editUI

在editUI上唯一區別就是需要把id傳遞過去給伺服器端。

GIF

這裡寫圖片描述

總結

導入就是用戶上傳一個Excel文件,我們讀取Excel文件的數據,封裝成對象,存進資料庫中

導出就是將我們資料庫的數據寫到Excel文件中,讓用戶能夠進行下載

指定我們的返回類型是excel

工作表從屬於工作薄,行從屬於工作表,單元格從屬於行

在POI組件中,Excel文件我們又分為了兩類,03版和07版的,他倆對應了不同的對象,但這兩個對象的API都是一樣的。因此我們可以通過文件的後綴來判斷使用哪個對象

我們的Excel還是應該有樣式才好看的。POI也提供了對應的API給我們修改樣式

合併單元格,從屬於工作薄,應用與工作表

設置居中、字體的大小都是屬於樣式的。從屬於工作薄,應用與單元格。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Java3y 的精彩文章:

閱讀SSH項目之ERP

TAG:Java3y |