easyexcel poi根据模板导出Excel

1.导入依赖

xml 复制代码
<!--    poi依赖-->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.0.1</version>
</dependency>
<!--    poi对于excel 2007的支持依赖-->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.0.1</version>
</dependency>
<!--    poi对于excel 2007的支持依赖-->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml-schemas</artifactId>
    <version>4.0.1</version>
</dependency>

2.代码实现

java 复制代码
package com.example.exceldemo;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.core.io.ClassPathResource;

import java.io.*;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

public class EasyExcelTest {

    public static void main(String[] args) throws Exception {
        InputStream fis = null;
        OutputStream outputStream= null;
        Workbook wb = null;
        try {
            String fileName = "测试单位"+ UUID.randomUUID() + ".xlsx";
            String filePath = "D:\\report\\"+fileName;
            //1.获取数据
            List<ExcelVo> list = new ArrayList<>();
            list.add(new ExcelVo(1,"1221","黄山"));
            list.add(new ExcelVo(2,"3333","河水"));
            list.add(new ExcelVo(3,"6666","青石"));

            //2.获取模板
            fis = new ClassPathResource("templates/report_template.xlsx").getInputStream();
            File file=new File(filePath);
            if (!file.exists()) {
                file.createNewFile();
            }
            outputStream = new FileOutputStream(file);

            //3.根据模板创建工作簿
            wb = new XSSFWorkbook(fis);

            //4.读取工作表
            Sheet sheet = wb.getSheetAt(0);
            CellStyle styles[] = new CellStyle[row.getLastCellNum()];

            //5.抽取第2行的公共样式 , 因为第一行 为标题 第2行是数据 下标为1
            Row row = sheet.getRow(1);
            CellStyle styles[] = new CellStyle[row.getLastCellNum()];
            Cell cell = null;
            for (int i = 0; i < row.getLastCellNum(); i++) {
                cell = row.getCell(i);
                styles[i] = cell.getCellStyle();
            }

            //5.构造单元格
            int rowIndex=1;
            //方式一 手动
            for (ExcelVo vo2:list) {
                //创建每一行,同excel的第二行开始
                row= sheet.createRow(rowIndex++);
                //第一列
                int i=0;
                cell = row.createCell(i++);
                cell.setCellStyle(styles[0]);
                cell.setCellValue(vo2.getId());//写入数据 序号

                //第二列
                cell = row.createCell(i++);
                cell.setCellStyle(styles[0]);
                cell.setCellValue(vo2.getCode());

                //第三列(注:最后一列不用i++,前面的必须i++)
                cell = row.createCell(i);
                cell.setCellStyle(styles[0]);
                cell.setCellValue(vo2.getName());
            }

            //方式二 动态
            for (ExcelVo t:list) {
                //创建每一行,同excel的第二行开始
                row = sheet.createRow(rowIndex++);

                Field[] fields=t.getClass().getDeclaredFields();//获取filed
                for (int i = 0; i < fields.length; i++) {
                    Field field=fields[i];
                    field.setAccessible(true);//设置私有属性可以访问
                    Object val = field.get(t);//获取值
                    if (val==null)val="";
                    cell = row.createCell(i);
                    cell.setCellStyle(styles[0]);//设置单元格样式
                    cell.setCellValue(val.toString());//写入数据
                }
            }

            wb.write(outputStream);//写入数据
        } catch (Exception e) {
            throw new Exception(e);
        } finally {
            fis.close();
            wb.close();
            outputStream.close();
        }
    }
}

3.模板

参考:https://blog.csdn.net/weixin_45742032/article/details/119593288?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-1-119593288-blog-86538258.235%5Ev38%5Epc_relevant_anti_t3_base&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-1-119593288-blog-86538258.235%5Ev38%5Epc_relevant_anti_t3_base&utm_relevant_index=2

相关推荐
Root_Hacker8 分钟前
include文件包含个人笔记及c底层调试
android·linux·服务器·c语言·笔记·安全·php
一嘴一个橘子13 分钟前
mybatis - 动态语句、批量注册mapper、分页插件
java
组合缺一14 分钟前
Json Dom 怎么玩转?
java·json·dom·snack4
危险、30 分钟前
一套提升 Spring Boot 项目的高并发、高可用能力的 Cursor 专用提示词
java·spring boot·提示词
kaico201835 分钟前
JDK11新特性
java
钊兵35 分钟前
java实现GeoJSON地理信息对经纬度点的匹配
java·开发语言
jiayong2340 分钟前
Tomcat性能优化面试题
java·性能优化·tomcat
秋刀鱼程序编程44 分钟前
Java基础入门(五)----面向对象(上)
java·开发语言
纪莫1 小时前
技术面:MySQL篇(InnoDB的锁机制)
java·数据库·java面试⑧股
Remember_9931 小时前
【LeetCode精选算法】滑动窗口专题二
java·开发语言·数据结构·算法·leetcode