河曲智叟 发表于 2025-2-12 12:30:14

EasyExcel 通过模板填凑数据

EasyExcel 通过模板填凑数据两种方式:1、直接通过模板填充。2、通过IO流填充。
模板示例
注意:单个字段填充只写字段名即可,数据集填充需要在字段前加.
{title}姓名昵称手机号{.username}{.nickname}{.phone}代码示例:
package com.service.single.example.excel;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.fill.FillConfig;
import com.service.single.entity.SystemUser;

import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
* @Author: 一休
* @Date: 2025/2/10
*/
public class ExcelTemplate {

    public static void main(String[] args) throws IOException {
      // 准备数据
      List<SystemUser> users = new ArrayList<>();
      SystemUser user1 = new SystemUser();
      user1.setUsername("张三");
      user1.setNickname("zhangsan");
      user1.setPhone("11111");
      users.add(user1);
      SystemUser user2 = new SystemUser();
      user2.setUsername("张三");
      user2.setNickname("zhangsan");
      user2.setPhone("11111");
      users.add(user2);
      // 单个字段填充,使用map格式
      Map<String, Object> otherData = new HashMap<>();
      otherData.put("title", "系统用户表");
      // 模板文件路径
      String templateFileName = "src/main/resources/template.xlsx";
      DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
      String formattedDateTime = LocalDateTime.now().format(formatter);
      // 输出文件路径
      String outputFileName = "src/main/resources/filled_template_" + formattedDateTime + ".xlsx";
      // 输出文件路径
      String outputFileName1 = "src/main/resources/filled_template1_" + formattedDateTime + ".xlsx";

      // 1、直接通过文件模板填充
      try (ExcelWriter excelWriter = EasyExcel.write(outputFileName).withTemplate(templateFileName).build();) {
            // 创建写入工作表
            WriteSheet writeSheet = EasyExcel.writerSheet().build();
            // 每次使用 list 参数时创建新行。
            FillConfig fillConfig = FillConfig.builder().forceNewRow(true).build();
            // 针对某个字段填充
            excelWriter.fill(otherData, fillConfig, writeSheet);
            // 填充集合
            excelWriter.fill(users, fillConfig, writeSheet);
      }


      // 2、通过IO流填充
      try (
                // 使用 try-with-resources 管理输入流
                InputStream inputStream = Files.newInputStream(Paths.get(templateFileName));
                InputStream templateInputStream = new BufferedInputStream(inputStream);
                ByteArrayOutputStream outputStream = new ByteArrayOutputStream()
      ) {
            try (
                  // 创建 ExcelWriter 对象
                  ExcelWriter excelWriter = EasyExcelFactory.write(outputStream).excelType(ExcelTypeEnum.XLSX).withTemplate(templateInputStream).build()
            ) {
                WriteSheet writeSheet = EasyExcelFactory.writerSheet().sheetNo(0).build();
                WriteSheet writeSheet1 = EasyExcelFactory.writerSheet().sheetNo(1).build();
                FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
                // 针对某个字段填充
                excelWriter.fill(otherData, fillConfig, writeSheet);
                // 填充集合
                excelWriter.fill(users, fillConfig, writeSheet);
            // 指定sheet填充数据
                excelWriter.fill(users, fillConfig, writeSheet1);
            }

            try (
                  FileOutputStream fileOutputStream = new FileOutputStream(outputFileName1)
            ) {
                outputStream.writeTo(fileOutputStream);
                // 刷新 FileOutputStream 缓冲区,确保数据全部写入文件
                fileOutputStream.flush();
                System.out.println("文件生成成功: " + outputFileName1);
            }
      }
    }
}
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: EasyExcel 通过模板填凑数据