今天做了一個poi解析Excel,導入數據庫的東東,還沒做完,整理下知識點。
1.首先是uuid
package com.mytest;
import java.util.UUID;
public class UTest {
public static void main(String[] args) {
UUID uuid = UUID.randomUUID();
System.out.println(uuid);
}
}
UUID是由一個十六位的數字組成,表現出來的形式例如
550E8400-E29B-11D4-A716-446655440000
//下面就是實現爲數據庫獲取一個唯一的主鍵id的代碼
public class UUIDGenerator {
public UUIDGenerator() {
}
/**
* 獲得一個UUID
* @return String UUID
*/
public static String getUUID(){
String s = UUID.randomUUID().toString();
//去掉“-”符號
return s.substring(0,8)+s.substring(9,13)+s.substring(14,18)+s.substring(19,23)+s.substring(24);
}
/**
* 獲得指定數目的UUID
* @param number int 需要獲得的UUID數量
* @return String[] UUID數組
*/
public static String[] getUUID(int number){
if(number < 1){
return null;
}
String[] ss = new String[number];
for(int i=0;i<number;i++){
ss[i] = getUUID();
}
return ss;
}
public static void main(String[] args){
String[] ss = getUUID(10);
for(int i=0;i<ss.length;i++){
System.out.println(ss[i]);
}
}
}
2.使用md5加密
爲了讓讀者朋友對MD5的應用有個直觀的認識,筆者以一個比方和一個實例來簡要描述一下其工作過程:
大家都知道,地球上任何人都有自己獨一無二的指紋,這常常成爲公安機關鑑別罪犯身份最值得信賴的方法;與之類似,MD5就可以爲任何文件(不管其大小、格式、數量)產生一個同樣獨一無二的"數字指紋",如果任何人對文件做了任何改動,其MD5值也就是對應的"數字指紋"都會發生變化。
我們常常在某些軟件下載站點的某軟件信息中看到其MD5值,它的作用就在於我們可以在下載該軟件後,對下載回來的文件用專門的軟件(如Windows MD5 Check等)做一次MD5校驗,以確保我們獲得的文件與該站點提供的文件爲同一文件。利用MD5算法來進行文件校驗的方案被大量應用到軟件下載站、論壇數據庫、系統文件安全等方面。
筆者上面提到的例子只是MD5的一個基本應用,實際上MD5還被用於加密解密技術上,如Unix、各類BSD系統登錄密碼(在MD5誕生前採用的是DES加密算法,後因MD5安全性更高,DES被淘汰)、通信信息加密(如大家熟悉的即時通信軟件MyIM)、數字簽名等諸多方面。
MD5將任意長度的“字節串”變換成一個128bit的大整數,並且它是一個不可逆的字符串變換算法,換句話說就是,即使你看到源程序和算法描述,也無法將一個MD5的值變換回原始的字符串,從數學原理上說,是因爲原始的字符串有無窮多個,這有點象不存在反函數的數學函數。
MD5的典型應用是對一段Message(字節串)產生fingerprint(指紋),以防止被“篡改”。舉個例子,你將一段話寫在一個叫 readme.txt文件中,並對這個readme.txt產生一個MD5的值並記錄在案,然後你可以傳播這個文件給別人,別人如果修改了文件中的任何內容,你對這個文件重新計算MD5時就會發現(兩個MD5值不相同)。如果再有一個第三方的認證機構,用MD5還可以防止文件作者的“抵賴”,這就是所謂的數字簽名應用。
MD5還廣泛用於加密和解密技術上,在很多操作系統中,用戶的密碼是以MD5值(或類似的其它算法)的方式保存的, 用戶Login的時候,系統是把用戶輸入的密碼計算成MD5值,然後再去和系統中保存的MD5值進行比較,而系統並不“知道”用戶的密碼是什麼。
public String makeMD5(String password) {
MessageDigest md;
try {
// 生成一個MD5加密計算摘要
md = MessageDigest.getInstance("MD5");
// 計算md5函數
md.update(password.getBytes());
// digest()最後確定返回md5 hash值,返回值爲8爲字符串。因爲md5 hash值是16位的hex值,實際上就是8位的字符
// BigInteger函數則將8位的字符串轉換成16位hex值,用字符串來表示;得到字符串形式的hash值
String pwd = new BigInteger(1, md.digest()).toString(16);
System.err.println(pwd);
return pwd;
} catch (Exception e) {
e.printStackTrace();
}
return password;
}
3.使用poi,來得到合併單元格的值
/**
* 合併單元格處理,獲取合併行
* @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;
}
/**
* 判斷單元格是否爲合併單元格,是的話則將單元格的值返回
* @param listCombineCell 存放合併單元格的list
* @param cell 需要判斷的單元格
* @param sheet sheet
* @return
*/
public String isCombineCell(List<CellRangeAddress> listCombineCell,Cell cell,Sheet sheet) throws Exception
{
int firstC = 0;
int lastC = 0;
int firstR = 0;
int lastR = 0;
String cellValue = null;
for(CellRangeAddress ca:listCombineCell)
{
//獲得合併單元格的起始行, 結束行, 起始列, 結束列
firstC = ca.getFirstColumn();
lastC = ca.getLastColumn();
firstR = ca.getFirstRow();
lastR = ca.getLastRow();
if(cell.getRowIndex() >= firstR && cell.getRowIndex() <= lastR)
{
if(cell.getColumnIndex() >= firstC && cell.getColumnIndex() <= lastC)
{
Row fRow = sheet.getRow(firstR);
Cell fCell = fRow.getCell(firstC);
cellValue = getCellValue(fCell);
break;
}
}
else
{
cellValue = "";
}
}
return cellValue;
}
4.補充上一個內容
得到所有的合併單元格 sourceSheet.getNumMergedRegions(); 得到某一個合併單元格 CellRangeAddress oldRange=sourceSheet.getMergedRegion(i); 起始行 oldRange.getFirstRow() ; 結束行oldRange.getLastRow() 起始列oldRange.getFirstColumn() 結束列oldRange.getLastColumn()5.由於沒有做完,所以還會補充。