首先,瞭解poi是什麼?前端
1、基本概念java
Apache POI是Apache軟件基金會的開放源碼函式庫,POI提供API給Java程序對Microsoft Office格式檔案讀和寫的功能。工具
2、基本結構this
HSSF - 提供讀寫Microsoft Excel格式檔案的功能。spa
XSSF - 提供讀寫Microsoft Excel OOXML格式檔案的功能。excel
HWPF - 提供讀寫Microsoft Word格式檔案的功能。code
HSLF - 提供讀寫Microsoft PowerPoint格式檔案的功能。orm
HDGF - 提供讀寫Microsoft Visio格式檔案的功能。server
一開始模仿公司項目的代碼,使用一些工具類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; }
此 downloadExcel 方法可做爲參考,須要更改的有:
固然,將數據寫回客戶端,還有另外一種方式,寫到 HttpServletResponse response 的輸出流,可自行選擇。
最後,此篇文章只是實現簡單的excel表格,須要更加具體詳細的設置,可自行查看API
廣州蘆葦科技Java開發團隊
蘆葦科技-廣州專業互聯網軟件服務公司
抓住每一處細節 ,創造每個美好
關注咱們的公衆號,瞭解更多
想和咱們一塊兒奮鬥嗎?lagou搜索「 蘆葦科技 」或者投放簡歷到 server@talkmoney.cn 加入咱們吧
關注咱們,你的評論和點贊對咱們最大的支持