Apache POI匯出Excel的方法相較於JasperReports沒有那麼直觀,沒有GUI介面可以使用,因此Excel中哪一格要顯示什麼值,都要靠單元格的座標(第幾行、第幾列),需要想像一下報表的布局。
Apache POI中,可以由下列的介面來操作Excel。
因此將資料寫入Excel的時候,要知道第幾行、第幾列,以及要寫入什麼資料。
直接由一個範例來看看如何利用這些介面寫入資料。
第一步先查詢要匯出的資料,資料放在StudentCourseScoreReportModel物件中。
@Data
@AllArgsConstructor
@NoArgsConstructor
public class StudentCourseScoreReportModel {
private String studentNumber;
private String fullName;
private String grade;
private String courseDesc;
private String departmentDesc;
private Integer score;
private String testDate;
}
// 查詢學生考試成績資料資料
List<StudentCourseScoreReportModel> studentCourseScoreReportModelList = reportDemoService.getStudentCourseScoreData();
如果有固定的欄位名稱要顯示,我會先放在一個陣列中。
// 欄位名稱
String[] columnNames = {"學號", "科系", "年級", "姓名", "課程", "成績", "考試日期"};
大致上的步驟如下,第幾步可以對應註解來看:
close()
方法釋放資源。Workbook的實現類別,有實作AutoCloseable介面,因此可以用try-with-resources自動關閉createSheet()
方法建立工作簿中的試算表,參數為試算表名稱createRow()
方法建立試算表中的列,參數就是列數,但是 第一列是從0開始
createCell()
方法建立列中的單元格,參數是行數,一樣 第一(直)行是從0開始
createRow()
與createCell()
的參數都先設為0,以setCellValue()
方法設定單元格的值write()
方法將ByteArrayOutputStream寫入工作簿,就完成啦try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
// 1.建立Workbook
Workbook workbook = new XSSFWorkbook();) {
// 2.建立excel sheet(參數為sheetname)
Sheet sheet = workbook.createSheet("學生考試成績表");
// 3.建立列物件(參數為列數,從0開始)
Row titleRow = sheet.createRow(0);
// 4.建立此列的單元格物件
Cell titleCell = titleRow.createCell(0);
// 設定cell的內容
titleCell.setCellValue("XX大學 學生考試成績表");
// 5.第2列作為欄位名稱
Row columnTitleRow = sheet.createRow(1);
for (int k = 0; k < columnNames.length; k++) {
Cell contentCell = columnTitleRow.createCell(k);
contentCell.setCellValue(columnNames[k]);
}
// 6.遍歷列的資料
for (int i = 0; i < studentCourseScoreReportModelList .size(); i++) {
StudentCourseScoreReportModel model = studentCourseScoreReportModelList .get(i);
// i+2因為第1列是標題,第2列是欄位名稱
Row contentRow = sheet.createRow(i + 2);
// 7.行的資料
for (int j = 0; j < columnNames.length; j++) {
Cell contentCell = contentRow.createCell(j);
switch (j) {
case 0:
contentCell.setCellValue(model.getStudentNumber());
break;
case 1:
contentCell.setCellValue(model.getDepartmentDesc());
break;
case 2:
contentCell.setCellValue(model.getGrade());
break;
case 3:
contentCell.setCellValue(model.getFullName());
break;
case 4:
contentCell.setCellValue(model.getCourseDesc());
break;
case 5:
contentCell.setCellValue(model.getScore());
break;
case 6:
contentCell.setCellValue(model.getTestDate());
break;
}
}
}
// 8.寫入ByteArrayOutputStream 匯出Excel
workbook.write(bos);
} catch (Exception e) {
// 寫入失敗
throw new RuntimeException(e);
}
結果就會如下圖
我自己在剛開始接觸Apache POI的時候是覺得以「匯出」這個功能來說,需要想一下才能設定,沒有Jaspersoft Studio直接有畫面來的直覺,如果要做有子報表的那種報表就會很複雜,比較適合較單純的報表匯出。不過Apache POI可以做到讀取Office文件,算是一大優勢。