springMVC導入報表,uuid使用,poi解析導入MySQL

今天繼續昨天未完成工作,已經完工。

下面總結下我遇到的問題

1.使用springMVC上傳文件,獲得流以及條件,代碼如下,

jsp部分代碼

<h1>Please upload a file</h1>  
<!--   enctype(編碼格式)必須爲multipart/form-data  -->  
        <form method="post" action="../manager/test.do" enctype="multipart/form-data">  
            <input type="text" name="name"/>  
            <input type="file" name="file"/>  
            <input type="submit"/>  
        </form>  
        
    
java後臺接收代碼

/**
	 * @Title: test
	 * @Description: TODO 初始化員工信息
	 * @author wuxiaolong
	 */
	@RequestMapping(value = "/test",method = RequestMethod.POST)
	public ModelAndView initStaffInfo(@RequestParam("file") MultipartFile myfile, HttpServletRequest request){
		System.out.println("進入");
		return viewReportAssessmentOrderService.initUploadStaff(myfile ,request);
	} 
需要注意的是

①@RequestParam註解 要加上,否則獲取不到參數

②要修改servlet-context.xml,加上

    <!--  這裏申明的id必須爲multipartResolver  -->  
    <bean id="multipartResolver"  
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
      
        <!-- one of the properties available; the maximum file size in bytes -->  
        <property name="maxUploadSize" value="100000"/>  
    </bean>  

CommonsMultipartResolver允許設置的屬性有:
    defaultEncoding:表示用來解析request請求的默認編碼格式,當沒有指定的時候根據Servlet規範會使用默認值ISO-8859-1。當request自己指明瞭它的編碼格式的時候就會忽略這裏指定的defaultEncoding。
    uploadTempDir:設置上傳文件時的臨時目錄,默認是Servlet容器的臨時目錄。
    maxUploadSize:設置允許上傳的最大文件大小,以字節爲單位計算。當設爲-1時表示無限制,默認是-1。
    maxInMemorySize:設置在文件上傳時允許寫到內存中的最大值,以字節爲單位計算,默認是10240。

這篇文章寫的很好http://haohaoxuexi.iteye.com/blog/1188116

附送jsp上傳的demo    http://blog.csdn.net/lookthesea/article/details/1617633

2.poi解析合併單元格,兵獲取它的值

由於合併單元格後,假設爲A1-A5爲合併後的單元格,此時可以獲取A1的值,但A2-A5的值爲null

我寫了一個方法,自動判斷單元格是否爲合併的並返回它實際的值,參考代碼,

下面代碼中首先通過最後一個方法得到

List<CellRangeAddress> rangeList
,int i 是讀取的行數。

/**
	 * @Title: 獲得單元格的值,如果是合併單元格的話有相應處理
	 * @Description: TODO
	 * @author wuxiaolong
	 * @param sheet
	 * @param rangeList
	 * @param i
	 * @return
	 */
	public String getRangeValue(Sheet sheet,List<CellRangeAddress> rangeList,int i){
			Boolean flag=this.isCombineCell(rangeList, sheet.getRow(i).getCell(1), sheet);
			if(flag){
				return this.getMergedRegionValue(sheet, i,1);
			}
			return null;
			
	}

/**
	* 判斷單元格是否爲合併單元格
	* 
	* @param listCombineCell
	*            存放合併單元格的list
	* @param cell
	*            需要判斷的單元格
	* @param sheet
	*            sheet
	* @return
	*/
	public  Boolean isCombineCell(List<CellRangeAddress> listCombineCell,
	Cell cell, Sheet sheet) {
		int firstC = 0;
		int lastC = 0;
		int firstR = 0;
		int lastR = 0;
		
		for (CellRangeAddress ca : listCombineCell) {
			// 獲得合併單元格的起始行, 結束行, 起始列, 結束列
			firstC = ca.getFirstColumn();
			lastC = ca.getLastColumn();
			firstR = ca.getFirstRow();
			lastR = ca.getLastRow();
			if (cell.getColumnIndex() <= lastC&& cell.getColumnIndex()>= firstC) {
				if (cell.getRowIndex() <= lastR && cell.getRowIndex() >= firstR) {
					return true;
			}
				}
		}
			return false;
		}



/**
	 * @Title: 獲取合併單元格的值 
	 * @Description: TODO
	 * @author wuxiaolong
	 * @param sheet
	 * @param row
	 * @param column
	 * @return
	 */
	public String getMergedRegionValue(Sheet sheet, int row, int column) { 
		int sheetMergeCount = sheet.getNumMergedRegions(); 
		for (int i = 0; i < sheetMergeCount; i++) { 
			CellRangeAddress ca = sheet.getMergedRegion(i); 
			int firstColumn = ca.getFirstColumn(); 
			int lastColumn = ca.getLastColumn(); 
			int firstRow = ca.getFirstRow(); 
			int lastRow = ca.getLastRow(); 

			if (row >= firstRow && row <= lastRow) { 
				if (column >= firstColumn && column <= lastColumn) { 
					Row fRow = sheet.getRow(firstRow); 
					Cell fCell = fRow.getCell(firstColumn); 

					return getCellFormatValue(fCell); 
				} 
			} 
		} 

		return null; 
	}



/** 
	  * 合併單元格處理,獲取合併行 
	  * @param sheet 
	  * @return List<CellRangeAddress> 
	  */  
	  public List<CellRangeAddress> getCombineCell(Sheet sheet)  
	  {  
	    List<CellRangeAddress> list = new ArrayList<CellRangeAddress>();  
	    //獲得一個 sheet 中合併單元格的數量  
	    int sheetmergerCount = sheet.getNumMergedRegions();  
	    //遍歷合併單元格  
	    for(int i = 0; i<sheetmergerCount;i++)   
	    {  
	      //獲得合併單元格加入list中  
	      CellRangeAddress ca = sheet.getMergedRegion(i);  
	      list.add(ca);  
	    }  
	    return list;  
	  }  

3.我在java後臺生成一個uuid序列號,如果要存入的字段在數據庫中是主鍵,那麼uuid會自動改寫,就是你在java後臺獲得的不是實際存入數據庫的,這時如果有外鍵關聯的話,先生成uuid,然後使用dao.add(entity);返回entity.getUUID即可,再操作關聯字段。

uuid關鍵代碼

本來搜到一個很不多的文章,沒收藏,大家自己百度吧,很多

mysql 裏面可以用uuid()語句來生成一個UUID:

select uuid();
或 select replace(uuid(), '-', '');

直接在insert語句中插入UUID作主鍵的用法(簡便):

insert into Price( Name, UUID, Price, BID) values('FEIFEI_TEST', uuid(), 32, 3);

 

UUID
UUID含義是通用唯一識別碼 (Universally Unique Identifier),這是一個軟件建構的標準,也是被開源軟件基金會 (Open Software Foundation, OSF) 的組織在分佈式計算環境 (Distributed Computing Environment, DCE) 領域的一部份。
  UUID 的目的,是讓分佈式系統中的所有元素,都能有唯一的辨識資訊,而不需要透過中央控制端來做辨識資訊的指定。如此一來,每個人都可以建立不與其它人衝突的 UUID。在這樣的情況下,就不需考慮數據庫建立時的名稱重複問題。目前最廣泛應用的 UUID,即是微軟的 Microsoft’s Globally Unique Identifiers (GUIDs),而其他重要的應用,則有 Linux ext2/ext3 檔案系統、LUKS 加密分割區、GNOME、KDE、Mac OS X 等等。
  是指在一臺機器上生成的數字,它保證對在同一時空中的所有機器都是唯一的。通常平臺會提供生成的API。按照開放軟件基金會(OSF)制定的標準計算,用到了以太網卡地址、納秒級時間、芯片ID碼和許多可能的數字
  UUID由以下幾部分的組合:
  (1)當前日期和時間,UUID的第一個部分與時間有關,如果你在生成一個UUID之後,過幾秒又生成一個UUID,則第一個部分不同,其餘相同。
  (2)時鐘序列
  (3)全局唯一的IEEE機器識別號,如果有網卡,從網卡MAC地址獲得,沒有網卡以其他方式獲得。
  UUID的唯一缺陷在於生成的結果串會比較長。關於UUID這個標準使用最普遍的是微軟的GUID(Globals Unique Identifiers)。在ColdFusion中可以用CreateUUID()函數很簡單的生成UUID,其格式爲:xxxxxxxx-xxxx- xxxx-xxxxxxxxxxxxxxxx(8-4-4-16),其中每個 x 是 0-9 或 a-f 範圍內的一個十六進制的數字。而標準的UUID格式爲:xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx (8-4-4-4-12),可以從cflib 下載CreateGUID() UDF進行轉換。
  使用UUID的好處在分佈式的軟件系統中(比如:DCE/RPC, COM+,CORBA)就能體現出來,它能保證每個節點所生成的標識都不會重複,並且隨着WEB服務等整合技術的發展,UUID的優勢將更加明顯。根據使用的特定機制,UUID不僅需要保證是彼此不相同的,或者最少也是與公元3400年之前其他任何生成的通用惟一標識符有非常大的區別。
  通用惟一標識符還可以用來指向大多數的可能的物體。微軟和其他一些軟件公司都傾向使用全球惟一標識符(GUID),這也是通用惟一標識符的一種類型,可用來指向組建對象模塊對象和其他的軟件組件。第一個通用惟一標識符是在網羅計算機系統(NCS)中創建,並且隨後成爲開放軟件基金會(OSF)的分佈式計算環境(DCE)的組件。
以上摘自http://baike.baidu.com/view/1052579.htm



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章