很久以來都想研究一下利用java操作Excel的方法,今天沒事,就稍微了解了一下,特總結一下。利用java操作Excel,有個開源的東東-jxl.jar,可以到http://sourceforge.net/projects/jexcelapi/files/下載。
一.讀取Excel檔案內容
複製代碼代碼如下:
/** *//**讀取Excel檔案的內容
* @param file 待讀取的文件
* @return
*/
public static String readExcel(File file)...{
StringBuffer sb = new StringBuffer();
Workbook wb = null;
try ...{
//建構Workbook(工作薄)對象
wb=Workbook.getWorkbook(file);
} catch (BiffException e) ...{
e.printStackTrace();
} catch (IOException e) ...{
e.printStackTrace();
}
if(wb==null)
return null;
//取得了Workbook物件之後,就可以透過它得到Sheet(工作表)物件了
Sheet[] sheet = wb.getSheets();
if(sheet!=null&&sheet.length>0)...{
//對每個工作表進行循環
for(int i=0;i<sheet.length;i++)...{
//得到目前工作表的行數
int rowNum = sheet[i].getRows();
for(int j=0;j<rowNum;j++)...{
//得到目前行的所有儲存格
Cell[] cells = sheet[i].getRow(j);
if(cells!=null&&cells.length>0)...{
//對每個單元格進行循環
for(int k=0;k<cells.length;k++)...{
//讀取目前儲存格的值
String cellValue = cells[k].getContents();
sb.append(cellValue+" ");
}
}
sb.append(" ");
}
sb.append(" ");
}
}
//最後關閉資源,釋放記憶體
wb.close();
return sb.toString();
}
二.寫入Excel文件
這裡有很多格式了,像是文字內容加粗,加上某些顏色等,可以參考jxl的api
複製代碼代碼如下:
/**產生一個Excel文件
* @param fileName 要產生的Excel檔名
*/
public static void writeExcel(String fileName)...{
WritableWorkbook wwb = null;
try ...{
//首先要使用Workbook類別的工廠方法建立一個可寫入的工作薄(Workbook)對象
wwb = Workbook.createWorkbook(new File(fileName));
} catch (IOException e) ...{
e.printStackTrace();
}
if(wwb!=null)...{
//建立一個可寫入的工作表
//Workbook的createSheet方法有兩個參數,第一個是工作表的名稱,第二個是工作表在工作薄中的位置
WritableSheet ws = wwb.createSheet("sheet1", 0);
//下面開始加入單元格
for(int i=0;i<10;i++)...{
for(int j=0;j<5;j++)...{
//這裡要注意的是,在Excel中,第一個參數表示列,第二個表示行
Label labelC = new Label(j, i, "這是第"+(i+1)+"行,第"+(j+1)+"列");
try ...{
//將產生的儲存格加入工作表中
ws.addCell(labelC);
} catch (RowsExceededException e) ...{
e.printStackTrace();
} catch (WriteException e) ...{
e.printStackTrace();
}
}
}
try ...{
//從記憶體寫入檔案中
wwb.write();
//關閉資源,釋放記憶體
wwb.close();
} catch (IOException e) ...{
e.printStackTrace();
} catch (WriteException e) ...{
e.printStackTrace();
}
}
}
註:如果您想在一個已經存在的Excel中寫入內容,則需依照以下方式進行:
複製代碼代碼如下:
WritableWorkbook book = null;
try...{
// Excel取得文件
Workbook wb = Workbook.getWorkbook(new File("D:/test.xls"));
// 開啟一個文件的副本,並且指定資料寫回原始文件
book = Workbook.createWorkbook(new File("D:/test.xls"), wb);
// 新增一個工作表
WritableSheet sheet = book.getSheet("sheet1");
sheet.addCell(new Label(8,3, "第3行第8列新增東西了"));
//TODO 以下部分省略
}catch(Exception e)...{
e.printStackTrace();
}
三.在一個Excel檔案中尋找是否包含某一個關鍵字
複製代碼代碼如下:
/**搜尋某一個文件是否包含某個關鍵字
* @param file 待搜尋的文件
* @param keyWord 要搜尋的關鍵字
* @return
*/
public static boolean searchKeyWord(File file,String keyWord)...{
boolean res = false;
Workbook wb = null;
try ...{
//建構Workbook(工作薄)對象
wb=Workbook.getWorkbook(file);
} catch (BiffException e) ...{
return res;
} catch (IOException e) ...{
return res;
}
if(wb==null)
return res;
//取得了Workbook物件之後,就可以透過它得到Sheet(工作表)物件了
Sheet[] sheet = wb.getSheets();
boolean breakSheet = false;
if(sheet!=null&&sheet.length>0)...{
//對每個工作表進行循環
for(int i=0;i<sheet.length;i++)...{
if(breakSheet)
break;
//得到目前工作表的行數
int rowNum = sheet[i].getRows();
boolean breakRow = false;
for(int j=0;j<rowNum;j++)...{
if(breakRow)
break;
//得到目前行的所有儲存格
Cell[] cells = sheet[i].getRow(j);
if(cells!=null&&cells.length>0)...{
boolean breakCell = false;
//對每個單元格進行循環
for(int k=0;k<cells.length;k++)...{
if(breakCell)
break;
//讀取目前儲存格的值
String cellValue = cells[k].getContents();
if(cellValue==null)
continue;
if(cellValue.contains(keyWord))...{
res = true;
breakCell = true;
breakRow = true;
breakSheet = true;
}
}
}
}
}
}
//最後關閉資源,釋放記憶體
wb.close();
return res;
}
四.往Excel中插入圖片圖示
插入圖片的實作很容易,請參考以下程式碼:
複製代碼代碼如下:
/** *//**往Excel插入圖片
* @param dataSheet 待插入的工作表
* @param col 圖片從該列開始
* @param row 圖片從該行開始
* @param width 圖片所佔的列數
* @param height 圖片所佔的行數
* @param imgFile 要插入的圖片文件
*/
public static void insertImg(WritableSheet dataSheet, int col, int row, int width,
int height, File imgFile)...{
WritableImage img = new WritableImage(col, row, width, height, imgFile);
dataSheet.addImage(img);
}
以上程式碼的註解已經很清楚了,大概也就不用再解釋了,我們可以用以下程式驗證:
複製代碼代碼如下:
try ...{
//建立一個工作薄
WritableWorkbook workbook = Workbook.createWorkbook(new File("D:/test1.xls"));
//待插入的工作表
WritableSheet imgSheet = workbook.createSheet("Images",0);
//要插入的圖片文件
File imgFile = new File("D:/1.png");
//圖片插入到第二行第一個儲存格,長寬各佔六個儲存格
insertImg(imgSheet,0,1,6,6,imgFile);
workbook.write();
workbook.close();
} catch (IOException e) ...{
e.printStackTrace();
} catch (WriteException e) ...{
e.printStackTrace();
}
但是jxl只支援png格式的圖片,jpg格式和gif格式都不支持
五.插入頁首頁腳
一般的頁首頁腳都分為三個部分,左,中,右三部分,利用如下程式碼可實現插入頁首頁尾
複製代碼代碼如下:
/** *//**加入Excel中頁首頁尾
* @param dataSheet 待加入頁首的工作表
* @param left
* @param center
* @param right
*/
public static void setHeader(WritableSheet dataSheet,String left,String center,String right)...{
HeaderFooter hf = new HeaderFooter();
hf.getLeft().append(left);
hf.getCentre().append(center);
hf.getRight().append(right);
//加入頁眉
dataSheet.getSettings().setHeader(hf);
//加入頁腳
//dataSheet.getSettings().setFooter(hf);
}
我們可以用以下程式碼測試該方法:
複製代碼代碼如下:
try ...{
//建立一個工作薄
WritableWorkbook workbook = Workbook.createWorkbook(new File("D:/test1.xls"));
//待插入的工作表
WritableSheet dataSheet = workbook.createSheet("加入頁首",0);
ExcelUtils.setHeader(dataSheet, "chb", "2007-03-06", "第1頁,共3頁");
workbook.write();
workbook.close();
} catch (IOException e) ...{
e.printStackTrace();
} catch (WriteException e) ...{
e.printStackTrace();
}