POI的使用及匯出excel報表
首先,瞭解poi是什麼?
一、基本概念
Apache POI是Apache軟體基金會的開放原始碼函式庫,POI提供API給Java程式對Microsoft Office格式檔案讀和寫的功能。
二、基本結構
HSSF - 提供讀寫Microsoft Excel格式檔案的功能。
XSSF - 提供讀寫Microsoft Excel OOXML格式檔案的功能。
HWPF - 提供讀寫Microsoft Word格式檔案的功能。
HSLF - 提供讀寫Microsoft PowerPoint格式檔案的功能。
HDGF - 提供讀寫Microsoft Visio格式檔案的功能。
概念先了解這麼多,具體可自行谷歌
一開始模仿公司專案的程式碼,使用一些工具類ExcelHelper、ExportUtil 來建立excel,並匯出,部分程式碼如下:
// ...
ExcelHelper.writeExcel(fileName, excelVOList, ProblemLiveVO.class, null, titles);
ExportUtil.exportToClient(response, ContentType.MULTIPART_FORM_DATA.toString(), ParamsUtil.EXCEL, fileName, true);
複製程式碼
後來發現,用此方式不太合適,一般我們要做報表的話,產品經理會先給一個報表模板,我們可以將此報表模板做得美觀一些(設定好表頭顏色等),然後先用poi讀取這份模板,再新增修改,最後直接匯出到客戶端。這樣效率也更高。其實poi的使用是比較簡單的,可參考以下程式碼:(有詳細註釋)
@Transactional(propagation = Propagation.REQUIRED, readOnly = true)
public ResponseEntity<byte[]> downloadExcel() {
// 1.封裝資料到 List(此處需按實際情況封裝資料)
List<ReportFinancial> list = reportFinancialDao.findAll();
try {
// 2.讀取報表模板
URL resource = this.getClass().getClassLoader()
.getResource("excel/NiceReportForm.xlsx");
Assert.notNull(resource, "讀取不到財務報表模板");
String path = resource.getPath();
FileInputStream fis = new FileInputStream(path);
String fileName = "財務報表" + new SimpleDateFormat("yyyyMMddHHmmss")
.format(new Date()) + ".xlsx";
// 建立Workbook
XSSFWorkbook workbook = new XSSFWorkbook(fis);
// 讀取sheet1
XSSFSheet sheet = workbook.getSheetAt(0);
// 設定表格居中
XSSFCellStyle cellStyle = workbook.createCellStyle();
cellStyle.setAlignment(HorizontalAlignment.CENTER);
// 3.向excel中新增資料
int rowLine = 2; // 2即為第三行, 從0開始算, 根據實際情況設定
for (ReportFinancial report : list) {
XSSFRow row = sheet.createRow(rowLine++);
row.createCell(0).setCellValue(report.getReportFinancialId());
row.createCell(1).setCellValue(report.getNickName());
row.createCell(2).setCellValue(report.getMoney());
row.createCell(3).setCellValue(report.getCreateTime());
// ...根據實際資料新增
// 設定以上新增的表格資料居中
for (int i = 0; i < row.getPhysicalNumberOfCells(); i++) {
row.getCell(i).setCellStyle(cellStyle);
}
}
// 4.將workbook中的資料寫到輸出流中
ByteArrayOutputStream baos = new ByteArrayOutputStream();
workbook.write(baos);
baos.close();
// 5.設定請求頭, 返回一個ResponseEntity
HttpHeaders headers = new HttpHeaders();
headers.set(HttpHeaders.CONTENT_ENCODING, "UTF-8");
headers.setContentDispositionFormData("attachment", fileName);
headers.setPragma(fileName);
headers.setCacheControl("No-cache");
headers.setDate("Expires", 0);
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
return new ResponseEntity<>(baos.toByteArray(), headers, HttpStatus.CREATED);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
複製程式碼
- 此部分程式碼為Service層的程式碼,返回值為ResponseEntity<byte[]>,Controller層直接將ResponseEntity返回就可以了,前端訪問此介面就能下載excel檔案。
- 此 downloadExcel 方法可作為參考,需要更改的有:
- 第一步,根據實際情況封裝資料
- 第二步,模板報表的位置,我是放在resources/excel下
- 第三步,將實際資料新增到表格的某行某列中 row.createCell(0).setCellValue( )
當然,將資料寫回客戶端,還有另一種方式,寫到 HttpServletResponse response 的輸出流,可自行選擇。
最後,此篇文章只是實現簡單的excel表格,需要更加具體詳細的設定,可自行檢視API
huanglp
廣州蘆葦科技Java開發團隊
蘆葦科技-廣州專業網際網路軟體服務公司
抓住每一處細節 ,創造每一個美好
關注我們的公眾號,瞭解更多
想和我們一起奮鬥嗎?lagou搜尋“ 蘆葦科技 ”或者投放簡歷到 server@talkmoney.cn 加入我們吧
關注我們,你的評論和點贊對我們最大的支援