快速实现导出Excel

前言·:

如何实现这个功能

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

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

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

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

实现方式一:

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

1.添加依赖

cn.hutool

hutool-all

5.1.0

org.apache.poi

poi-ooxml

4.1.0

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> 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> data() {

        // 导出的数据        ArrayList> rows = new ArrayList<>();

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

            Map 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.首先添加依赖

com.alibaba

easyexcel

2.2.6

注意:此依赖不能和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 data() {

        List list = new ArrayList();

        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

你可能感兴趣的:(快速实现导出Excel)