使用excel.EasyExcel实现导出有自定义样式模板的excel数据文件,粘贴即用!!!

客户要求导出的excel文件是有好看格式的,当然本文举例模板文件比较简单,内容丰富的模板可以自行设置,话不多说,第一步设置一个"好看"的excel文件模板

上面要注意的地方是{.变量名} ,这里的变量名对应的就是导出数据对象里面的变量名,一定要有"."

对象属性,不写"."就是填充单个属性,写了就是填充列表数据

先看代码目录结构

application.yml配置文件:

java 复制代码
server:
  port: 9009

springboot启动类代码:

java 复制代码
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

public class BootstrapApp {
    public static void main(String[] args) {
        SpringApplication.run(BootstrapApp.class, args);
    }
}

数据对象代码:

java 复制代码
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class User {
    private int id;
    @ExcelProperty(value = "姓名")
    private String name;
    @ExcelProperty(value = "年龄")
    private String age;
    @ExcelProperty(value = "兴趣爱好")
    private String love;
    @ExcelProperty(value = "备注")
    private String remark;
}

然后controller代码:

java 复制代码
import com.operation.excel.service.DoExcelService;
import lombok.extern.slf4j.Slf4j;
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;

@Slf4j
@RestController
@RequestMapping("/api")
public class ExcelController {

    @Autowired
    private DoExcelService doExcelService;
    @GetMapping("/export")
    public void export(HttpServletResponse response) throws Exception {
        log.info("开始导出自定义样式excel");
        doExcelService.export(response);
    }
}

然后是service代码

java 复制代码
import javax.servlet.http.HttpServletResponse;

public interface DoExcelService {
    void export(HttpServletResponse response) throws Exception;
}

service对应实现类代码:

java 复制代码
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import com.operation.excel.dto.User;
import com.operation.excel.service.DoExcelService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

@Service
@Slf4j
public class DoExcelServiceImpl implements DoExcelService {
    @Override
    public void export(HttpServletResponse response) throws Exception {
        // 1:设置响应参数
        setResponseHeader(response, "user_");
        // 2:获取待导出的数据合集
        List<User> productCoreParamList = getData();
        // 3:获取模板流
        InputStream templateStream = new ClassPathResource("template/export-user.xlsx").getInputStream();
        // 4:写入response导出excel
        EasyExcel.write(response.getOutputStream()).registerWriteHandler(setStyle()).withTemplate(templateStream).sheet().doFill(productCoreParamList);
    }
    //这里设置响应头的部分参数
    private void setResponseHeader(HttpServletResponse response, String fileName) throws Exception {
        try {
            // 修正文件扩展名为xlsx以匹配实际格式
            String fileNameStr = fileName + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + ".xlsx";
            String encodedFileName = URLEncoder.encode(fileNameStr, StandardCharsets.UTF_8.toString());
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setCharacterEncoding("UTF-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + encodedFileName);
        } catch (Exception e) {
            log.error("set response header error", e);
            throw new Exception("设置响应头失败: " + e.getMessage());
        }
    }
    
    // 这个方法是模拟需要导出的数据(实际是从数据库获取)
    private List<User> getData() {
        List<User> students = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            User student = new User();
            student.setId(i);
            student.setAge("A" + i);
            student.setName("B" + i);
            student.setLove(UUID.randomUUID().toString());
            student.setRemark(UUID.randomUUID().toString());
            students.add(student);
        }
        return students;
    }

    //这这个方法是设置填充的数据内容字体样式,也可以不设置
    private HorizontalCellStyleStrategy setStyle(){
        // 定义样式:自动换行
        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
        contentWriteCellStyle.setWrapped(true); // 关键:开启自动换行
        WriteFont writeFont = new WriteFont();
        writeFont.setFontName("Microsoft YaHei"); // 字体
        writeFont.setFontHeightInPoints((short) 12);// 字体大小
        contentWriteCellStyle.setWriteFont(writeFont);
        // 注册样式策略(全局生效)
        HorizontalCellStyleStrategy styleStrategy = new HorizontalCellStyleStrategy(
                null, // 头样式(默认)
                contentWriteCellStyle // 内容样式(自动换行)
        );
        return styleStrategy;
    }

postman验证效果:

response直接展示会乱码,所以选择save response 然后选择保存为文件也就是 save file

查看保存的文件:

总结:就是先准备一个好看的模板(设置变量),然后读模版流,然后向模板流中的sheet工作表填充数据,最后写入response前端获取

相关推荐
netho018 小时前
影刀RPA初级证书+ Excel 全自动数据看板
excel·rpa
2501_9307077820 小时前
使用C#代码设置 Excel 单元格的背景颜色和图案
excel
ms365copilot20 小时前
Excel Copilot聊天历史|关闭文件后,还能找回之前的AI分析对话
人工智能·excel·copilot
SL-staff21 小时前
规则引擎如何实现风控报告的自动化?JVS-Rules提供解决方案
大数据·自动化·excel·规则引擎·jvs-rules·风控报告·数据溯源
Mr.Java.21 小时前
本地测试全绿,上线 SQL 报错?Spring Boot 容器级 DT 测试实战指南(附Skills)
java·测试用例·springboot·testcontainers·dt·java测试skills·dt测试
2501_9336707921 小时前
内容电商运营岗位能力模型:SQL、Excel、投放数据与AI工具怎么准备
人工智能·sql·excel
苏渡苇1 天前
Spring Insight 里上报 Span 为什么用 JDK HttpClient 而不是 RestTemplate
java·后端·spring·spring cloud·springboot·性能监控
AIGS0011 天前
工艺参数散在Excel和纸质文件里,能不能统一管、随查随用
服务器·数据库·excel·经验沉淀·知识管理·工艺知识·本体语义
小刘在重生~1 天前
Django|Excel 批量上传、Form/ModelForm 文件上传、Media 媒体文件配置
python·django·excel
古少侠1 天前
用 DS随心转 把 AI 给的表格导出成能筛选、能统计的 Excel
人工智能·excel