POI的使用及導出excel報表

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

廣州蘆葦科技Java開發團隊

蘆葦科技-廣州專業互聯網軟件服務公司

抓住每一處細節 ,創造每一個美好

關注我們的公衆號,瞭解更多

想和我們一起奮鬥嗎?lagou搜索“ 蘆葦科技 ”或者投放簡歷到 [email protected] 加入我們吧

關注我們,你的評論和點贊對我們最大的支持

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章