這兩天用POI產生Excel,看了看頭兒給的例子就動手開始寫,寫的還算順利,資料可以匯出到Excel中了,而接下來的布局就很麻煩了,所有的
操作都需要用程式來控制,寫了一會我覺得這樣不行,應該弄一個模板,於是我把Excel的格式提取出來,放到一個新的Excel檔案中,每次都
開啟這個模板檔案,從這個模板檔案裡邊插入資料,只是在儲存的時候把資料儲存到另外一個Excel檔案中,這樣就可以省去了不少布局的麻煩
。當然這也存在些問題:
如果有多個sheet怎麼辦?答:如果需要多個sheet可以在模板中多建立幾個模板sheet。
如果我建立的好多模板sheet但是有用不了那麼多呢?答:可以在儲存之前把多於的sheet刪除掉。
上面兩個問題都解決了,按說應該是沒有問題了,但是新的問題出現了,excel可以產生,但是開啟後sheet不能切換,一切換就報錯。查了半
天不知是什麼原因,找頭兒給我看,他看了會跟我說代碼沒有問題,問題是Excel模板必須把最後添加的sheet設定成選中狀態,不能是別的
sheet。比如你有從sheet1到sheet9這九個sheet所以你就要把sheet9設定成選中然後儲存。這樣根據模板到處的excle才沒有問題。
public static void createExcelFromTemplate(String templateFile, String saveFile, ArrayList excelData)
{
// 讀模數板Excel
HSSFWorkbook tempWorkBook = new HSSFWorkbook(new FileInputStream(templateFile));
//處理excel
//
tempWorkBook = deleteSheet(tempWorkBook);
//儲存Excel
generateExcel(tempWorkBook, saveFile);
}
/**//*由HSSFWorkbook產生Excel文檔
*
* */
public static void generateExcel(HSSFWorkbook wb, String saveFile) {
try {// 建立一輸出檔案流
FileOutputStream fOut = new FileOutputStream(saveFile);
// 把相應的Excel 活頁簿存檔
wb.write(fOut);
fOut.flush();
// 操作結束,關閉檔案
fOut.close();
} catch (Exception e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
//刪除多於的Sheet
public static HSSFWorkbook deleteSheet(HSSFWorkbook wb) {
int totalSheets = wb.getNumberOfSheets() - 1;
while (0 <= totalSheets) {
if (wb.getSheetName(totalSheets).lastIndexOf("Sheet") == 0) {
wb.removeSheetAt(totalSheets);
totalSheets--;
} else {
totalSheets--;
}
}
return wb;
}