IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 使用EasyExcel做自定义表头的excel文件导出 -> 正文阅读

[移动开发]使用EasyExcel做自定义表头的excel文件导出

作者:token keyword

如题所示

项目中需要做表格导出功能,且表头为复杂的动态表头,决定采用EasyExcel来进行操作

demo使用到的依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>2.2.10</version>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.0.1</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>compile</scope>
</dependency>
<dependency>
    <groupId>org.assertj</groupId>
    <artifactId>assertj-core</artifactId>
    <version>RELEASE</version>
    <scope>compile</scope>
</dependency>

具体代码展示如下:

package excelExport;

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 org.assertj.core.util.Lists;
import org.junit.Test;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;

/**
 * @author: 骑猪撞地球QAQ
 * @date: 2022/3/18 15:44
 * @content:
 */
public class ExcelImport {

    @Test
    public void test() throws IOException {
        // 文件输出位置
        OutputStream out = new FileOutputStream("d://测试导出.xlsx");
        ExcelWriter writer = EasyExcelFactory.write(out).build();

        // 动态添加表头
        WriteSheet sheet1 = new WriteSheet();
        sheet1.setSheetName("测试导出sheet1");
        sheet1.setSheetNo(0);
        // 创建一个表格,用于 Sheet 中使用
        WriteTable table = new WriteTable();
        table.setTableNo(1);
        table.setHead(head());
        // 写数据
        writer.write(contentData(), sheet1, table);
        writer.finish();
        out.close();
    }
	
	/**
     * 生成动态表头,表头数据可以当做参数传入
     *
     * @return 表头list
     */
    private static List<List<String>> head() {
        List<List<String>> headTitles = Lists.newArrayList();
//        String warZone = "战区", base = "基地", personal = "个人", empty = " ", total = "合计", invoiceAmount = "开票额(亿元)", invoiceQuantity = "开票量(吨)", subtotal = "小计";
        String warZone = "表头1", base = "表头2", personal = "表头3", total = "合计", invoiceAmount = "子项1", invoiceQuantity = "子项2", subtotal = "小计";

        //第一列,1/2/3行
        headTitles.add(Lists.newArrayList(warZone));
        headTitles.add(Lists.newArrayList(base));
        headTitles.add(Lists.newArrayList(personal));
        headTitles.add(Lists.newArrayList(total, invoiceAmount, invoiceAmount));
        headTitles.add(Lists.newArrayList(total, invoiceQuantity, invoiceQuantity));

        // 可动态获取
        List<String> channelList = Lists.newArrayList("动态渠道1", "动态渠道2");
        // 可动态获取
        List<String> orderDetailed = Lists.newArrayList(subtotal, "order1", "order2", "order3");
        channelList.forEach(channel -> {
            orderDetailed.forEach(title -> {
                headTitles.add(Lists.newArrayList(channel, title, invoiceAmount, invoiceAmount));
                headTitles.add(Lists.newArrayList(channel, title, invoiceQuantity, invoiceQuantity));
            });
        });
        return headTitles;
    }
	
	 /**
     * 导入数据封装,需要导出数据进行传参
     *
     * @return 导出数据集合
     */
    private static List<List<Object>> contentData() {
        List<List<Object>> contentList = Lists.newArrayList();
        // 这里一个List<Object>代表一行数据,需要映射成每行数据填充,横向填充(把实体数据的字段设置成一个List<Object>)
        contentList.add(Lists.newArrayList("测试", "测试A", "测试B", "100", 999, 999, 666.66, "200", "测试", "测试", "测试", "测试", "测试", "测试", "测试", "测试", "测试", "测试", "测试", "测试", "测试"));
        contentList.add(Lists.newArrayList("测试", "测试A1", "测试B1", "2002", 888, 888, 888.88, "测试", "测试", "测试", "测试", "测试", "测试", "测试", "测试", "测试", "测试", "测试", "测试", "测试", "测试"));
        return contentList;
    }

}

生成表格如下所示:在这里插入图片描述

poi
结构支持Excel版本读写行数读写速度格式内存占用
HSSFexcel2003 版本<=65536行
XSSFexcel2007 版本<=65536行Microsoft Excel OOXML
SXSSFexcel2007 版本<=65536行介于HSSF 和XSSFMicrosoft Excel OOXML比较高
EasyExcel
easyExcel内存占用读写行数读写速度
2.0.0以上版本比较低(重写POI对07Excel的解析)>65536(无限制,单sheet最大支持1048576行)非常快

在这里插入图片描述

后记:

EasyExcel是阿里出的一套基于POI的快速、简单避免OOM的java处理Excel工具,避免OOM的主要原因是EasyExcel在写入的时候是逐行进行,而非全部进行。所以在导出效率上是不如POI的,数据量较小且对效率要求较高,建议使用POI进行导出,但数据量大、对效率要求不高的时候建议使用EasyExcel,简单易上手。 注:太初级的东西大家可以看B站狂神的课,地址如下:讲的还是比较好的,而且都是干货,废话比较少。 https://www.bilibili.com/video/BV1Ua4y1x7BK?spm_id_from=333.337.search-card.all.click

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-22 20:44:56  更:2022-03-22 20:45:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 19:56:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码