springBoot 通过模板导出Excel文档的实现

发布于:2025-06-08 ⋅ 阅读:(17) ⋅ 点赞:(0)

springBoot 通过模板导出Excel文档的实现是我们常用的功能,今天我们分享一下:

1、pom.xml中引用包

<dependencies>
    <!-- SpringBoot Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <!-- Apache POI - Excel 处理 -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>4.1.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>4.1.2</version>
    </dependency>
    
    <!-- 日期格式化工具 -->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.12.0</version>
    </dependency>
</dependencies>

2、用户实体

package com.example.demo.entity;

import lombok.Data;

import java.util.Date;

@Data
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String gender;
    private Date createTime;
}

3、控制层代码

package com.example.demo.controller;

import com.example.demo.entity.User;
import com.example.demo.service.ExcelExportService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@RestController
@RequestMapping("/api/excel")
public class ExcelExportController {

    @Autowired
    private ExcelExportService excelExportService;

    @GetMapping("/export")
    public void exportUsers(HttpServletResponse response) throws IOException {
        // 模拟数据
        List<User> userList = createSampleUsers();
        
        // 导出Excel
        excelExportService.exportUsersWithTemplate(userList, response);
    }

    private List<User> createSampleUsers() {
        List<User> userList = new ArrayList<>();
        
        User user1 = new User();
        user1.setId(1L);
        user1.setName("张三");
        user1.setAge(25);
        user1.setGender("男");
        user1.setCreateTime(new Date());
        
        User user2 = new User();
        user2.setId(2L);
        user2.setName("李四");
        user2.setAge(30);
        user2.setGender("女");
        user2.setCreateTime(new Date(System.currentTimeMillis() - 86400000));
        
        userList.add(user1);
        userList.add(user2);
        
        return userList;
    }
}

4、业务层代码

package com.example.demo.service;

import com.example.demo.entity.User;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

@Service
public class ExcelExportService {

    public void exportUsersWithTemplate(List<User> userList, HttpServletResponse response) throws IOException {
        // 设置响应头
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        String fileName = URLEncoder.encode("用户信息_" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + ".xlsx", "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName);

        // 读取模板文件
        ClassPathResource resource = new ClassPathResource("templates/user_template.xlsx");
        InputStream inputStream = resource.getInputStream();
        Workbook workbook = new XSSFWorkbook(inputStream);
        Sheet sheet = workbook.getSheetAt(0); // 获取第一个工作表

        // 获取模板中的样式(假设模板第1行为表头)
        Row headerRow = sheet.getRow(0);
        CellStyle[] cellStyles = new CellStyle[headerRow.getLastCellNum()];
        for (int i = 0; i < cellStyles.length; i++) {
            cellStyles[i] = headerRow.getCell(i).getCellStyle();
        }

        // 从第2行开始写入数据
        int rowNum = 1;
        for (User user : userList) {
            Row row = sheet.createRow(rowNum++);
            
            // 创建单元格并设置值
            createCell(row, 0, user.getId(), cellStyles[0]);
            createCell(row, 1, user.getName(), cellStyles[1]);
            createCell(row, 2, user.getAge(), cellStyles[2]);
            createCell(row, 3, user.getGender(), cellStyles[3]);
            
            // 日期格式化
            if (user.getCreateTime() != null) {
                createCell(row, 4, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(user.getCreateTime()), cellStyles[4]);
            }
        }

        // 输出文件
        OutputStream outputStream = response.getOutputStream();
        workbook.write(outputStream);
        workbook.close();
        outputStream.flush();
        outputStream.close();
    }

    private void createCell(Row row, int column, Object value, CellStyle style) {
        Cell cell = row.createCell(column);
        cell.setCellStyle(style);
        
        if (value == null) {
            cell.setCellValue("");
            return;
        }
        
        if (value instanceof String) {
            cell.setCellValue((String) value);
        } else if (value instanceof Integer) {
            cell.setCellValue((Integer) value);
        } else if (value instanceof Long) {
            cell.setCellValue((Long) value);
        } else {
            cell.setCellValue(value.toString());
        }
    }
}

5、创建Excel 模板

在 src/main/resources/templates 目录下创建 user_template.xlsx 文件,设置表头如下:

调用后端接口导出excel文档。

到此,springBoot 通过模板导出Excel文档的实现分享完成,下篇分享视频和图片的上传下载等功能,敬请期待!