Skip to content

导出excel

GeXiangDong edited this page Jan 5, 2019 · 4 revisions

pom文件增加依赖

    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi</artifactId>
      <version>3.17</version>
    </dependency>
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml</artifactId>
      <version>3.17</version>
    </dependency>

做一个excel模板文件放到src/main/resources目录下

最好再建个子目录,使用模板调格式会方便很多(宽度、字体、数字格式等等)

Controller里增加方法

    @ResponseBody
    @GetMapping("/export")
    public ResponseEntity<byte[]> exportExcel() throws Exception{
        logger.trace("exportExcel");
        HttpHeaders responseHeaders = new HttpHeaders();
        responseHeaders.setContentDispositionFormData("attachment",new String("导出的文件名.xlsx".getBytes(), "ISO8859-1"));
        responseHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);

        //中文文件名需要用iso8859-1编码
        InputStream templateIs = this.getClass().getResourceAsStream("/excel-templates/templet.xlsx");
        XSSFWorkbook workbook = new XSSFWorkbook(templateIs);
        XSSFSheet sheet = workbook.getSheetAt(0);

        List<SampleItem> list = getDataList();

        CellStyle cellStyle = workbook.createCellStyle();
        CreationHelper createHelper = workbook.getCreationHelper();
        cellStyle.setDataFormat(createHelper.createDataFormat().getFormat("yyyy/mm/dd"));

        for (int i=0; i<list.size(); i++) {
            SampleItem si = list.get(i);

            XSSFRow row = sheet.createRow(i + 1);

            Cell cell1 = row.createCell(0);
            cell1.setCellValue(si.getDate());
            cell1.setCellStyle(cellStyle);

            Cell cell2 = row.createCell(1);
            cell2.setCellValue(si.getName());

            Cell cell3 = row.createCell(2);
            cell3.setCellValue(si.getScore());
        }

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        workbook.write(bos);
        workbook.close();
        return new ResponseEntity<byte[]>(bos.toByteArray(), responseHeaders, HttpStatus.OK);
    }