java 專案利用POI匯出excel總結
阿新 • • 發佈:2019-01-05
在專案中遇到需要把計劃檢修的專案匯出 使用的是Apache POI 對資料進行匯出
1.通過單元格格式來設定表格樣式
- 對於表格的表頭是固定的 所以先把表頭設定為定值
Workbook workbook = new HSSFWorkbook(); //新建excel表格
Sheet sheet = workbook.createSheet("維修-檢修計劃詳情"); //新建工作簿
Row row = sheet.createRow(0); //新建第一行為表格表頭
row.createCell(0).setCellValue("檢修記錄ID");
row.createCell(1).setCellValue ("檢修單號");
row.createCell(2).setCellValue("記錄來源");
row.createCell(3).setCellValue("所屬部門");
row.createCell(4).setCellValue("部門名稱");
- 然後通過迴圈遍歷自動生成下面資料行
for (int i = 0; list != null && i < list.size(); i++) {
row = sheet.createRow(i+1);//迴圈生成新的行
String overhaulRecordId = list.get(i).get ("OVERHAUL_REC_ID").toString();
mtOverhaulRecord = iOverhaulRecordService.findByKey(new Long(overhaulRecordId));
ExcelUtil.setCellValue(row, 0 , changNulltoString(list.get(i).get("OVERHAUL_REC_ID")));
ExcelUtil.setCellValue(row, 1 , changNulltoString(list.get(i).get("OVERHAUL_REC_NO")));
ExcelUtil.setCellValue (row, 3 , changNulltoString(list.get(i).get("DEPT_ID")));
ExcelUtil.setCellValue(row, 4 , changNulltoString(list.get(i).get("DEPT_NAME")));
}
- 最後匯出
super.writeExcel("recordList.xls", workbook);
這樣匯出的表格完全沒有格式,無法進行列印
- 所以需要進行排版設計 通過設定單元格格式來調整
CellStyle cellStyle = workbook.createCellStyle();//新建單元格格式
cellStyle.setWrapText(true);//是否自動換行
cellStyle.setAlignment(HSSFCellStyle.ALIGN_LEFT);//設定內容左對齊
cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//設定垂直居中
int length = row.getLastCellNum();
for (int j = 0; j < length; j++) {//遍歷row行的每一個單元格
row.getCell(j).setCellStyle(cellStyle);//設定單元格格式
}
在實際使用中,列印時需要設定列印格式 橫版,頁邊距等需要一一設定,網上的資料很多,在這實現一個需求,由於表格內容過長需要分頁顯示那麼表頭在每一頁重複出現,需要使用setRepeatingRowsAndColumns( )方法
//五個引數分別是:第幾張工作表、開始列、結束列、開始行、結束行 這一區域即為表頭
workbook.setRepeatingRowsAndColumns(0, 0, 12, 1, 3);
2.通過上傳excel模板來設定表格樣式
這樣一個表格 這麼多格式感覺很麻煩這時候 使用excel模板來匯出資料就顯得方便許多了
使用模板就涉及到使用伺服器上傳的模板來填充資料
首先要獲取專案結構中的模板檔案,在實際獲取中遇到一些問題
- 要從專案的web\UploadFile\excelModel中獲取模板檔案
String excelPath = request.getRealPath("/") + "UploadFiles" + File.separator + "excelModel" + File.separator+"overhaulprocess.xls";
FileInputStream excelFileInputStream = new FileInputStream(excelPath);
HSSFWorkbook workbook = new HSSFWorkbook(excelFileInputStream);
使用separator來加入檔案路徑分隔符,避免出現linux系統和windows系統的路徑差異導致找不到檔案的錯誤
windows和linux檔案路徑差異
比如要在temp目錄下新建一個test.txt檔案
//在windows中就需要這麼寫
File file = new File("c:\temp\test.txt");
//在linux中就需要寫
File file2 = new File("/temp/test.txt");
//考慮跨平臺性就需要使用separtor來代替名稱分隔符
File myFile = new File("C:" + File.separator + "temp" + File.separator , "test.txt");
使用檔案輸入流來獲取workbook而不是新建workbook這樣就省去了設定格式的過程
在模板檔案中設定好表頭的內容和格式 以及列印設定 頁面設定
- 設定表頭在每頁開頭出現
之後的過程和之前一樣省去了佈局的大量時間 十分推薦使用 記得修改格式設定時不要單單修改本地模板,修改本地模板一定要記得重新上傳模板