快速实现导出Excel

前言·:

如何实现这个功能

1.使用Apache提供POI组件实现

2.使用现成的,简单的第三方工具库(避免重复造轮子)

①.Hutool工具库中的Excel工具类

②.EasyExcel阿里开源的基于Java的简单,省内存的读写Excel工具库

实现方式一:

使用Hutool工具库实现导出Excel:

1.添加依赖

<!--hutool 导出 Excel 工具组件-->

<dependency>

<groupId>cn.hutool</groupId>

<artifactId>hutool-all</artifactId>

<version>5.1.0</version>

</dependency>

<!--POI组件-->

<dependency>

<groupId>org.apache.poi</groupId>

<artifactId>poi-ooxml</artifactId>

<version>4.1.0</version>

</dependency>

2.使用工具类实现导出Excel

import cn.hutool.core.collection.CollUtil;import cn.hutool.poi.excel.ExcelUtil;import cn.hutool.poi.excel.ExcelWriter;import cn.hutool.poi.excel.StyleSet;import org.apache.poi.ss.usermodel.CellStyle;import org.apache.poi.ss.usermodel.Font;import java.util.ArrayList;import java.util.Date;import java.util.LinkedHashMap;import java.util.List;import java.util.Map;

public classHutoolExcelUtils{

    /**

    * 导出Excel

    *

    * @param args

    */    public static void main(String[] args) {

        ArrayList<Map<String, Object>> rows = CollUtil.newArrayList(data());

        ExcelWriter writer = null;

        try {

            String path = "E:/QQPCmgr/Desktop/";

            String excelName = "Hutool" + System.currentTimeMillis() + ".xlsx";

            // 通过工具类创建writer,固定的文件输出路径            writer = ExcelUtil.getWriter(path + excelName);

            // 定义第一行合并单元格样式            CellStyle headCellStyle = writer.getHeadCellStyle();

            // 设置内容字体            Font font = writer.createFont();

            // 字体加粗            font.setBold(true);

            // 字体颜色            font.setColor(Font.COLOR_RED);

            headCellStyle.setFont(font);

            // 设置第 0 列的单元格的宽度,列数从零开始计算            writer.setColumnWidth(0, 20);

            writer.setColumnWidth(1, 20);

            writer.setColumnWidth(2, 20);

            // 定义数据行的样式            StyleSet style = writer.getStyleSet();

            // 设置单元格文本内容自动换行            style.setWrapText();

            // 合并单元格后的标题行(第一行),使用默认标题样式            writer.merge(rows.get(0).size() - 1, "导出测试:TEST");

            // 一次性写出内容,使用默认样式,强制输出标题            writer.write(rows, true);

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            if (writer != null) {

                // 记住关闭 writer,释放内存                writer.close();

            }

        }

    }

    /**

    * 构造 导出的数据

    *

    * @return

    */    public static List<Map<String, Object>> data() {

        // 导出的数据        ArrayList<Map<String, Object>> rows = new ArrayList<>();

        for (int i = 0; i < 10; i++) {

            Map<String, Object> row = new LinkedHashMap<>();

            row.put("字符串标题", "字符串" + i);

            row.put("日期标题", new Date());

            row.put("数字标题", 0.56);

            rows.add(row);

        }

        return rows;

    }

}

注意:

~修改代码中导出Excel的路径path

~导出excel的样式是灵活的,可以自行设置

这个例子,只实现了部分的样式设置,不适合导出大数据量。

实现方式二:

EasyExcel是一个基于Java的简单,省内存的读写Excel的阿里开源项目,

是一个快速,简单避免OOM的java处理Excel工具。

测试结果:64M内存1分钟内读取75M(46W行25列)的Excel;除此之外还有急速模式能更快,但是内存会用在100M多一点。

1.首先添加依赖

<!-- 阿里开源的 excel 工具类库 -->

<dependency>

<groupId>com.alibaba</groupId>

<artifactId>easyexcel</artifactId>

<version>2.2.6</version>

</dependency>

注意:此依赖不能和poi-ooxml依赖在一起用,否则运行时会报类找不到异常

2.使用工具类实现导出Excel

①,导出的数据模板类

import com.alibaba.excel.annotation.ExcelIgnore;import com.alibaba.excel.annotation.ExcelProperty;import com.alibaba.excel.annotation.write.style.ColumnWidth;import com.alibaba.excel.annotation.write.style.ContentFontStyle;import com.alibaba.excel.annotation.write.style.ContentRowHeight;import com.alibaba.excel.annotation.write.style.ContentStyle;import com.alibaba.excel.annotation.write.style.HeadFontStyle;import com.alibaba.excel.annotation.write.style.HeadRowHeight;import com.alibaba.excel.annotation.write.style.HeadStyle;import org.apache.poi.ss.usermodel.FillPatternType;import java.util.Date;

// 标题行 背景设置成红色 IndexedColors.RED.getIndex()@HeadStyle(fillPatternType = FillPatternType.SOLID_FOREGROUND, fillForegroundColor = 10)// 标题行 字体设置成20@HeadFontStyle(fontHeightInPoints = 20)@ContentRowHeight(25)// 文本内容行的高度@HeadRowHeight(30)// 标题行的高度@ColumnWidth(20)// 全局的列宽

public classDemoData{

    // 字符串的列内容 背景设置成天蓝 IndexedColors.SKY_BLUE.getIndex()    @ContentStyle(fillPatternType = FillPatternType.SOLID_FOREGROUND, fillForegroundColor = 40)    // 字符串的列内容 字体设置成20    @ContentFontStyle(fontHeightInPoints = 20)    @ExcelProperty({"导出测试:TEST","字符串标题"})    private String string;

    @ColumnWidth(30)    @ExcelProperty({"导出测试:TEST","日期标题"})    private Date date;

    @ExcelProperty({"导出测试:TEST","数字标题"})    private Double doubleData;

    /**

    * 忽略这个字段

    */    @ExcelIgnore    private String ignore;

    public String getString() {

        return string;

    }

    public void setString(String string) {

        this.string = string;

    }

    public Date getDate() {

        return date;

    }

    public void setDate(Date date) {

        this.date = date;

    }

    public Double getDoubleData() {

        return doubleData;

    }

    public void setDoubleData(Double doubleData) {

        this.doubleData = doubleData;

    }

    public String getIgnore() {

        return ignore;

    }

    public void setIgnore(String ignore) {

        this.ignore = ignore;

    }

}

注意:该数据模板中使用了大量的自定义注解,通过使用注解可以使代码更加的优雅,简洁。https://mp.weixin.qq.com/s?__biz=Mzk0NjE3NDQyOA==&mid=2247483917&idx=1&sn=94cd9159db42e8033084f88cbd4a2dc5&chksm=c30b62bef47ceba85e2e6b5e65d232746efc437a42ffa3821ed20c23b5d56f45863df76bf048&token=1434981870&lang=zh_CN#rd(自定义注解的魅力)

②.实现数据导出到Excel

import com.alibaba.excel.EasyExcel;

import java.util.ArrayList;

import java.util.Date;

import java.util.List;

public classEasyExcelUtils{

    public static void main(String[] args) {

        // 导出Excel的路径        String path = "E:/QQPCmgr/Desktop/";

        // 导出Excel路径 + 文件名称        String filename = path + "EasyExcel" + System.currentTimeMillis() + ".xlsx";

        /**

        * 导出excel

        * filename:导出excel全路径

        * DemoData.class:导出excel时的 数据模版

        * 模板:指的是导出excel的sheet页

        * data():构造的DemoData.class数据模版的数据集合

        */        EasyExcel.write(filename, DemoData.class).sheet("模板").doWrite(data());

    }

    /**    * 构造 导出的数据    *    *@return*/    private static List<DemoData> data() {

        List<DemoData> list = new ArrayList<DemoData>();

        for (int i = 0; i < 10; i++) {

            DemoData data = new DemoData();

            data.setString("字符串" + i);

            data.setDate(new Date());

            data.setDoubleData(0.56);

            list.add(data);

        }

        return list;

    }

}

拓展:

EasyExcel导出Excel的其他功能

(1)通过设置 只导出模版数据中的指定列数据

(2)通过设置 将模版数据中的列数据导出到Excel中指定的列上

(3)可以将导出的数据分多个批次导入到同一个Excel中,避免大数据量时的内存溢出问题

(4)导出数据的自定义格式转换,例如:日志、数字的格式转换等

(5)支持将图片导出到Excel中

(6)支持根据已有的Excel模版样式 将数据导出Excel

(7)支持单元格合并、表格方式导出、自动列宽、设置单元格下拉、超链接等、以及插入批注

(8)除了上面的导出Excel功能之外,EasyExcel还支持 读取Excel数据、Web客户端的上传、下载等 ;

官方文档地址: https://www.yuque.com/easyexcel/doc/easyexcel

项目代码地址: https://github.com/alibaba/easyexcel

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,013评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,205评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,370评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,168评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,153评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,954评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,271评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,916评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,382评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,877评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,989评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,624评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,209评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,199评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,418评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,401评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,700评论 2 345

推荐阅读更多精彩内容