Java导出Excel完整例子+完整代码,使用easypoi导出Excel+通用工具类

前言:

在之前写Excel导入导出功能的时候,使用更多的可能是apache的poi,相信用过poi的应该都会感觉poi使用起来还是有点点麻烦的,所以,如果你是:不太熟悉poi的、不想写太多重复太多的、只是简单的导入导出的。那么相信我,使用easypoi绝对很适合。

easypoi,正如同它的名字一样,主打的功能就是容易,让一个没见接触过poi的人员,就可以很方便的写出Excel导出、Excel导入,通过简单的注解就可以完成以前复杂的写法。

so,今天就用easypoi来做一个导出Excel的完整案例,项目是SpringBoot的项目

一、引入pom依赖

<!-- excle导入导出依赖包 start -->
<dependency>
	<groupId>cn.afterturn</groupId>
	<artifactId>easypoi-base</artifactId>
	<version>3.2.0</version>
</dependency>
<dependency>
	<groupId>cn.afterturn</groupId>
	<artifactId>easypoi-web</artifactId>
	<version>3.2.0</version>
</dependency>
<dependency>
	<groupId>cn.afterturn</groupId>
	<artifactId>easypoi-annotation</artifactId>
	<version>3.2.0</version>
</dependency>
<!-- excle导入导出依赖包 end -->

注意:有的文章或者博客可能说可以不用上边三个依赖这么麻烦,直接用 easypoi-spring-boot-starter 一个依赖就可以了

但是,用easypoi-spring-boot-starter 这个可能会导致你的springboot项目jar包依赖冲突,所以还是推荐使用上边的三个依赖

二、定义需要导出的实体对象User

import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;

/**
 * 导出对应的实体类
 *
 * @author caoju
 */
@ExcelTarget("user")
@Data
public class User implements Serializable {

    @Excel(name = "id",width=7)
    private Integer id;

    @Excel(name = "姓名",width=15)
    private String name;

    @Excel(name = "性别",replace = { "男_1", "女_2" },width=10)
    private Integer sex;

    @Excel(name = "创建时间",exportFormat = "yyyy-MM-dd HH:mm:ss",width=25)
    private Date createTime;

}

三、Excel导出工具类 和 导出自定义样式类

不要看下面的两个类这么长,好像多复杂似的

别担心!就是个工具类而已啦~

你懂的,直接ctrl c、ctrl v(我也懂的,热爱编程的你,最喜欢的就是这个 c v大法,简单粗暴,不多bibi!hia hia hia~~~)

import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.TemplateExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import com.xiaoleilu.hutool.date.DateUtil;
import com.xiaoleilu.hutool.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * Excel导出工具类
 *
 * @author caoju
 */
@Slf4j
public class ExcelUtils {

    /** 允许导出的最大条数 */
    private static final Integer EXPORT_EXCEL_MAX_NUM = 10000;

    /**
     * 导出Excel
     *
     * @param workbook workbook流
     * @param fileName 文件名
     * @param response 响应
     */
    public static void exportExcel(Workbook workbook, String fileName, HttpServletResponse response) {
        //给文件名拼接上日期
        fileName = fileName + StrUtil.UNDERLINE + DateUtil.today();
        //输出文件
        try (OutputStream out = response.getOutputStream()) {
            //获取文件名并转码
            String name = URLEncoder.encode(fileName, "UTF-8");
            //设置编码
            response.setCharacterEncoding("UTF-8");
            //设置http响应头告诉浏览器,以下载的形式处理响应的数据
            response.setContentType("application/force-download");
            //设置下载文件的默认名称
            response.setHeader("Content-Disposition", "attachment;filename=" + name + ".xlsx");
            //输出表格
            workbook.write(out);
        } catch (IOException e) {
            log.error("文件导出异常,详情如下:", e);
        } finally {
            try {
                if (workbook != null) {
                    //关闭输出流
                    workbook.close();
                }
            } catch (IOException e) {
                log.error("文件导出异常,详情如下:", e);
            }
        }
    }

    /**
     * 获取导出的 Workbook对象
     *
     * @param title     大标题
     * @param sheetName 页签名
     * @param object    导出实体
     * @param list      数据集合
     * @return Workbook
     */
    public static Workbook getWorkbook(String title, String sheetName, Class object, List list) {
        //判断导出数据是否为空
        if (list == null) {
            list = new ArrayList<>();
        }
        //判断导出数据数量是否超过限定值
        if (list.size() > EXPORT_EXCEL_MAX_NUM) {
            title = "导出数据行数超过:" + EXPORT_EXCEL_MAX_NUM + "条,无法导出、请添加查询条件后再进行导出!";
            list = new ArrayList<>();
        }
        //导出参数
        ExportParams exportParams = new ExportParams(title, sheetName, ExcelType.XSSF);
        //设置导出样式,可以不设置使用默认的样式,这里用的是自定义样式
        exportParams.setStyle(ExcelStyle.class);
        //输出Workbook流
        return ExcelExportUtil.exportExcel(exportParams, object, list);
    }

    /**
     * 获取导出的 Workbook对象
     *
     * @param path 模板路径
     * @param map  导出内容map
     * @return Workbook
     */
    public static Workbook getWorkbook(String path, Map<String, Object> map) {
        //获取导出模板
        TemplateExportParams params = new TemplateExportParams(path);
        //设置导出样式
        params.setStyle(ExcelStyle.class);
        //输出Workbook流
        return ExcelExportUtil.exportExcel(params, map);
    }

}
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.afterturn.easypoi.excel.entity.params.ExcelForEachParams;
import cn.afterturn.easypoi.excel.export.styler.ExcelExportStylerDefaultImpl;
import cn.afterturn.easypoi.excel.export.styler.IExcelExportStyler;
import org.apache.poi.ss.usermodel.*;

/**
 * Excel导出自定义样式类
 *
 * @author caoju
 */
public class ExcelStyle extends ExcelExportStylerDefaultImpl implements IExcelExportStyler {

    private static final short STRING_FORMAT = (short) BuiltinFormats.getBuiltinFormat("TEXT");

    private static final short FONT_SIZE_TEN = 10;

    private static final short FONT_SIZE_ELEVEN = 11;

    private static final short FONT_SIZE_TWELVE = 12;

    /**
     * 大标题样式
     */
    private CellStyle headerStyle;

    /**
     * 每列标题样式
     */
    private CellStyle titleStyle;

    /**
     * 数据行样式
     */
    private CellStyle styles;

    public ExcelStyle(Workbook workbook) {
        super(workbook);
        this.init(workbook);
    }

    /**
     * 初始化样式
     *
     * @param workbook
     */
    private void init(Workbook workbook) {
        //大标题样式
        this.headerStyle = initHeaderStyle(workbook);
        //每列标题样式
        this.titleStyle = initTitleStyle(workbook);
        //数据行样式
        this.styles = initStyles(workbook);
    }

    /**
     * 大标题样式
     *
     * @param color
     * @return
     */
    @Override
    public CellStyle getHeaderStyle(short color) {
        return headerStyle;
    }

    /**
     * 每列标题样式
     *
     * @param color
     * @return
     */
    @Override
    public CellStyle getTitleStyle(short color) {
        return titleStyle;
    }

    /**
     * 数据行样式
     *
     * @param parity 可以用来表示奇偶行
     * @param entity 数据内容
     * @return 样式
     */
    @Override
    public CellStyle getStyles(boolean parity, ExcelExportEntity entity) {
        return styles;
    }

    /**
     * 获取样式方法
     *
     * @param dataRow 数据行
     * @param obj     对象
     * @param data    数据
     */
    @Override
    public CellStyle getStyles(Cell cell, int dataRow, ExcelExportEntity entity, Object obj, Object data) {
        return getStyles(true, entity);
    }

    /**
     * 模板使用的样式设置
     */
    @Override
    public CellStyle getTemplateStyles(boolean isSingle, ExcelForEachParams excelForEachParams) {
        return null;
    }

    /**
     * 初始化--大标题样式
     *
     * @param workbook
     * @return
     */
    private CellStyle initHeaderStyle(Workbook workbook) {
        CellStyle style = getBaseCellStyle(workbook);
        style.setFont(getFont(workbook, FONT_SIZE_TWELVE, true));
        return style;
    }

    /**
     * 初始化--每列标题样式
     *
     * @param workbook
     * @return
     */
    private CellStyle initTitleStyle(Workbook workbook) {
        CellStyle style = getBaseCellStyle(workbook);
        style.setFont(getFont(workbook, FONT_SIZE_ELEVEN, false));
        //背景色 POI IndexedColors 编码 与 颜色枚举类 对照 : https://blog.csdn.net/ju_362204801/article/details/106079171
        style.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex());
        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        return style;
    }

    /**
     * 初始化--数据行样式
     *
     * @param workbook
     * @return
     */
    private CellStyle initStyles(Workbook workbook) {
        CellStyle style = getBaseCellStyle(workbook);
        style.setFont(getFont(workbook, FONT_SIZE_TEN, false));
        style.setDataFormat(STRING_FORMAT);
        return style;
    }

    /**
     * 基础样式
     *
     * @return
     */
    private CellStyle getBaseCellStyle(Workbook workbook) {
        CellStyle style = workbook.createCellStyle();
        //下边框
        style.setBorderBottom(BorderStyle.THIN);
        //左边框
        style.setBorderLeft(BorderStyle.THIN);
        //上边框
        style.setBorderTop(BorderStyle.THIN);
        //右边框
        style.setBorderRight(BorderStyle.THIN);
        //水平居中
        style.setAlignment(HorizontalAlignment.CENTER);
        //上下居中
        style.setVerticalAlignment(VerticalAlignment.CENTER);
        //设置自动换行
        style.setWrapText(true);
        return style;
    }

    /**
     * 字体样式
     *
     * @param size   字体大小
     * @param isBold 是否加粗
     * @return
     */
    private Font getFont(Workbook workbook, short size, boolean isBold) {
        Font font = workbook.createFont();
        //字体样式
        font.setFontName("宋体");
        //是否加粗
        font.setBold(isBold);
        //字体大小
        font.setFontHeightInPoints(size);
        return font;
    }

}

再说一下哈,上边面两个类虽然很长,但就是个工具类而已啦~

不多说!你懂的!直接ctrl c、ctrl v

四、测试导出方法的Controller

import com.google.common.collect.Lists;
import com.qtyc.utils.ExcelUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.List;

/**
 * 导出Excel测试Controller
 * 
 * @author caoju
 */
@RestController
public class ExcelExportController {

    /**
     * 导出Excel测试
     */
    @RequestMapping(value = "/exportExcelTest", method = RequestMethod.GET)
    public void exportExcelTest(HttpServletResponse response) {
        List<User> personList = this.findUser();
        ExcelUtils.exportExcel(ExcelUtils.getWorkbook("用户信息列表", "用户信息", User.class, personList), "用户信息列表导出", response);
    }

    /**
     * 模拟数据库查询返回用户信息
     */
    private List<User> findUser() {
        List<User> list = Lists.newArrayList();
        User user = new User();
        user.setId(10);
        user.setName("张三");
        user.setSex(1);
        user.setCreateTime(new Date());
        list.add(user);
        User user1 = new User();
        user1.setId(26);
        user1.setName("李四");
        user1.setSex(1);
        user1.setCreateTime(new Date());
        list.add(user1);
        User user2 = new User();
        user2.setId(28);
        user2.setName("王丽");
        user2.setSex(2);
        user2.setCreateTime(new Date());
        list.add(user2);
        return list;
    }    

}

五、测试

浏览器输入:http://localhost:8082/exportExcelTest

可以看到浏览器左下角弹出了下载窗口,自动下载了Excel

打开下载的文件夹可以看到刚才下载的Excel

打开Excel看下里边的内容

可以看到咱们想要导出的内容已经导出了,其中的标题,表头,以及每行每列的背景颜色,字体等等都可以通过代码根据自己的需求来自定义的。它的颜色设置是个枚举类,但是通过枚举类不能够直观的看到对应的颜色,所以我写了一篇博客,上边有颜色枚举类对应的颜色,看起来很直观,需要的话,可以打开看看:easypoi或者POI导出Excel时 IndexedColors 编码枚举值 与 颜色 对照

觉得对你有帮助的话,可以点个关注,点个赞,3Q~

猜你喜欢

转载自blog.csdn.net/ju_362204801/article/details/106090643