EaxyExcel导出多个sheet的数据

前言

最近做Excel的导出,有个需求是创建多个sheet导出,经过简短的学习和快速应用之后,在此记录分享给大家

效果

先瞅效果好不好
在这里插入图片描述

在这里插入图片描述

实现

导入依赖

 <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.7</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>30.1-jre</version>
        </dependency>

        <!-- springboot test启动器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

单元测试

上面引入了springboot的单元测试,在maven项目中,无论是导入依赖还是写单元测试都方便

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.WriteTable;
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.google.common.collect.Lists;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.junit.Test;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 动态表头,并设置宽度,字体,背景
 * 导出多个sheet
 * 用于发布csdn
 *
 * @date 01/22/2021 03:36
 */
public class Demo3MultiSheetForCSDN {

    /**
     * @throws IOException
     */
    @Test
    public void test() throws IOException {

        // 文件输出位置
        OutputStream out = new FileOutputStream("/Users/quanlinglong/Downloads/mergeDemo/demo" + System.currentTimeMillis() + ".xlsx");
        ExcelWriter writer = EasyExcelFactory
                .write(out)
                .registerWriteHandler(setConfigure())
                .build();

        // 写多个sheet,直接new,或者静态方法创建sheet
        WriteSheet sheet1 = new WriteSheet();
        sheet1.setSheetName("客户信息");
        sheet1.setSheetNo(0);
        // 用静态方法创建,注意,不同的sheet设置不同的sheetNo,
        WriteSheet sheet2 =
                EasyExcel.writerSheet(1).sheetName("客户信息2").build();

        // 创建一个表格,用于 Sheet 中使用
        WriteTable table = new WriteTable();
        table.setTableNo(1);
        // 动态添加表头,适用一些表头动态变化的场景
        table.setHead(head());
        // 写数据,写到多个sheet,可以传不同的数据
        writer.write(contentData(), sheet1, table);
        writer.write(contentData2(), sheet2, table);
        writer.finish();
        out.close();
    }



    private static List<List<String>> head() {
        List<List<String>> headTitles = Lists.newArrayList();
        String empty = " ";
        //第一列,1/2/3行
        headTitles.add(Lists.newArrayList(empty, "交通"));
        //第二列,1/2/3行
        headTitles.add(Lists.newArrayList(empty, "人口数"));
        // 第三列
        headTitles.add(Lists.newArrayList(empty, empty, "频道"));
        // 第四列及之后
        ArrayList<String> foodList = Lists.newArrayList("气温", "风力", "湿度");
        ArrayList<String> mealList = Lists.newArrayList("深圳", "北京", "上海");
        ArrayList<String> dateList = Lists.newArrayList("星期一(2021-01-25)", "星期二(2021-01-26)");
        // 根据实际需要,决定要渲染多少列
        dateList.forEach(date -> {
            mealList.forEach(meal -> {
                foodList.forEach(food -> {
                    headTitles.add(Lists.newArrayList(empty, date, meal, food));
                });
            });
        });
        return headTitles;
    }

    private static List<List<Object>> contentData() {
        List<List<Object>> contentList = Lists.newArrayList();
        //这里一个List<Object>才代表一行数据,需要映射成每行数据填充,横向填充(把实体数据的字段设置成一个List<Object>)
        contentList.add(Lists.newArrayList("骑车", "10", "苹果🍎", "25", "2级", "40%"));
        contentList.add(Lists.newArrayList("高铁", "20", "橙子🍊", "25", "2级", "40%"));
        return contentList;
    }

    private List<List<Object>> contentData2() {
        List<List<Object>> contentList = Lists.newArrayList();
        //这里一个List<Object>才代表一行数据,需要映射成每行数据填充,横向填充(把实体数据的字段设置成一个List<Object>)
        contentList.add(Lists.newArrayList("火车", "50", "西瓜", "25", "2级", "40%"));
        contentList.add(Lists.newArrayList("汽车", "20", "梨子", "25", "2级", "40%"));
        return contentList;
    }

    //配置字体,表头背景等
    private static HorizontalCellStyleStrategy setConfigure() {
        // 头的策略
        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
        // 背景色
        headWriteCellStyle.setFillForegroundColor(IndexedColors.YELLOW1.getIndex());
        WriteFont headWriteFont = new WriteFont();
        // 加粗
        headWriteFont.setBold(true);
//        headWriteFont.setFontHeightInPoints((short) 14);
        headWriteCellStyle.setWriteFont(headWriteFont);


        // 内容的策略
        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
        // 字体策略
        WriteFont contentWriteFont = new WriteFont();
        // 字体大小
//        contentWriteFont.setFontHeightInPoints((short) 14);
        contentWriteCellStyle.setWriteFont(contentWriteFont);
        //边框
        //导出数据垂直居中
        contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        //导出数据水平居中
        contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
        contentWriteCellStyle.setBorderLeft(BorderStyle.NONE);
        contentWriteCellStyle.setBorderTop(BorderStyle.NONE);
        contentWriteCellStyle.setBorderRight(BorderStyle.NONE);
        contentWriteCellStyle.setBorderBottom(BorderStyle.NONE);

        //设置 自动换行
        contentWriteCellStyle.setWrapped(true);
        //设置
        // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
        return new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
    }
}

EasyExcel创建sheet的方式,一种是创建实例,new一个sheet对象,另一种是调用它的静态方法,用了建造者模式build一下。写数据时,传进不同的List,实现每个sheet写不同的数据。

相关资料:
EasyExcel多sheet的导入和导出

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值