java easyPOI导出一对多数据,设置边框,字体,字体大小

java easyPOI导出一对多数据,设置边框,字体,字体大小
需求总是千奇百怪,解决的方式也可以是多种多样。
今天碰到导出excel是一对多结构的,以往导出的数据都是一条一条的,所以采用的是比较方便简单的方法easyExcel,今天猛然碰到一对多导出虽然用easyExcel也可以,但是相对比较麻烦,没有easyPOI快捷,之前有自己写过导出excel一个表格一个表格画,但是太麻烦。今天正好需求不急,就慢慢研究用easypoi导出,写出通用方法,以后遇到类似的就好办多了,直接调方法。废话不多说,先上效果图:
在这里插入图片描述

首先是实体中设置:

public class YjwzStockInVO extends TYjwzStockIn implements Serializable {
	//注意:needMerge = true 必加,不然合并的单元格,边框不会合并,需要导出的实体加@Excel注解,不需要导出的字段加@ExcelIgnore注解排除
    @Excel(needMerge = true,name = "状态名称")
    @ApiModelProperty(value = "状态名称")
    private String ztmc;

    @Excel(needMerge = true,name = "一级品类")
    @ApiModelProperty(value = "一级物资名称")
    private String wzOnemc;

    @Excel(needMerge = true,name = "二级品类")
    @ApiModelProperty(value = "二级物资名称")
    private String wzTwomc;

    @Excel(needMerge = true,name = "三级品类")
    @ApiModelProperty(value = "三级物资名称")
    private String wzThreemc;

    @Excel(needMerge = true,name = "四级品类")
    @ApiModelProperty(value = "四级物资名称")
    private String wzRourmc;

    @Excel(needMerge = true,name = "数据来源")
    @ApiModelProperty(value = "数据来源:1:市应急平台,2:人工新增")
    @DataBindDict(sourceField = "#sjly", sourceFieldCombination = "sjly")
    private String sjlymc;

    @ExcelCollection(name = "应急物资明细")
    @ApiModelProperty(value = "应急物资详情")
    private List<YjwzStockInDtlVO> dtlList;
}

子类:

public class YjwzStockInDtlVO extends TYjwzStockInDtl implements Serializable {

    @Excel(name = "单据类型")
    @ApiModelProperty(value = "单据类型:1:采购入库,2:调拨入库")
    @DataBindDict(sourceField = "#djlx", sourceFieldCombination = "lx")
    private String djlxmc;

    @Excel(name = "入库质检")
    @ApiModelProperty(value = "入库质检:1:已检验入库,2:未检验入库")
    @DataBindDict(sourceField = "#rkzj", sourceFieldCombination = "zjlx")
    private String rkzjmc;

    @Excel(name = "质检结果")
    @ApiModelProperty(value = "质检结果:1:合格,2:不合格")
    @DataBindDict(sourceField = "#zjjg", sourceFieldCombination = "zjjg")
    private String zjjgmc;

    @Excel(name = "存储期单位")
    @ApiModelProperty(value = "存储期单位:1:年,2:月")
    @DataBindDict(sourceField = "#ccqdw", sourceFieldCombination = "ccqdw")
    private String ccqdwmc;
}

然后是工具类准备:
1)首先是设置字体样式的工具类:

package com.sydata.zt.common.excel;

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

/**
 * @Author xx
 * @Date 2023/12/5 17:37
 * @Description: poi导出excel样式设置工具
 * @Version 1.0
 */
public class ExcelStyleUtil implements IExcelExportStyler {

    private static final short STRING_FORMAT = (short) BuiltinFormats.getBuiltinFormat("TEXT");
    private static final short FONT_SIZE_TEN = 9;
    private static final short FONT_SIZE_ELEVEN = 10;
    private static final short FONT_SIZE_TWELVE = 10;

    /**
     * 大标题样式
     */
    private CellStyle headerStyle;
    /**
     * 每列标题样式
     */
    private CellStyle titleStyle;
    /**
     * 数据行样式
     */
    private CellStyle styles;


    public ExcelStyleUtil(Workbook workbook){
        this.init(workbook);
    }

    /**
     * 初始化样式
     * @param workbook
     */
    private void init(Workbook workbook) {
        this.headerStyle = initHeaderStyle(workbook);
        this.titleStyle = initTitleStyle(workbook);
        this.styles = initStyles(workbook);
    }

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

    /**
     * 初始化小标题样式
     * @param workbook
     * @return
     */
    private CellStyle initTitleStyle(Workbook workbook) {
        CellStyle style = getBaseCellStyle(workbook);
        style.setFont(getFont(workbook,FONT_SIZE_ELEVEN,Boolean.TRUE));
        return style;
    }

    /**
     * 数据行样式
     * @param workbook
     * @return
     */
    private CellStyle initStyles(Workbook workbook) {
        CellStyle style = getBaseCellStyle(workbook);
        style.setDataFormat(STRING_FORMAT);
        return style;
    }

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

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

    /**
     * 数据行样式
     * @param b
     * @param excelExportEntity
     * @return
     */
    @Override
    public CellStyle getStyles(boolean b, ExcelExportEntity excelExportEntity) {
        return styles;
    }

    /**
     * 获取行样式方法
     * @param cell
     * @param i
     * @param entity
     * @param o
     * @param o1
     * @return
     */
    @Override
    public CellStyle getStyles(Cell cell, int i, ExcelExportEntity entity, Object o, Object o1) {
        return getStyles(true,entity);
    }

    @Override
    public CellStyle getTemplateStyles(boolean b, ExcelForEachParams excelForEachParams) {
        return null;
    }

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

        return style;
    }

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

        return font;
    }
}

2)然后导出excel工具类

package com.sydata.zt.common.excel;

import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import com.alibaba.excel.util.ListUtils;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.formula.functions.T;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.util.CollectionUtils;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Method;
import java.net.URLEncoder;
import java.util.*;

/**
 * @author hm
 * @date 2023/3/14 17:33
 */
public class EasyExcelGeneralUtil {
    /**
     * 设置response编码
     */
    public static void setResponseContentType(HttpServletResponse response, String fileName) throws UnsupportedEncodingException {
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8") + ".xlsx");
        response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
    }


    public static void exportExcelByEasyPoi(HttpServletResponse response, String fileName, List<Object> vos, Class<?> classType) throws IOException {
        ExportParams exportParams = new ExportParams();
        // 设置sheet得名称
        exportParams.setSheetName(fileName);
        //设置边框,字体,字体大小
        exportParams.setStyle(ExcelStyleUtil.class);

        Map<String, Object> map = new HashMap<>();
        // title的参数为ExportParams类型,目前仅仅在ExportParams中设置了sheetName
        map.put("title", exportParams);
        // 模版导出对应得实体类型的class文件
        map.put("entity", classType);
        // sheet中要填充得数据
        map.put("data", vos);

        List<Map<String, Object>> sheetsList = new ArrayList<>();
        sheetsList.add(map);
        //创建excel文件的方法
        Workbook workbook = ExcelExportUtil.exportExcel(sheetsList, ExcelType.HSSF);
        //通过response输出流直接输入给客户端
        ServletOutputStream outputStream = response.getOutputStream();
        workbook.write(outputStream);
        outputStream.flush();
        outputStream.close();
    }

}

准备工作已完成,接下来就可以愉快的导出了:

@SneakyThrows
    @PostMapping("/export")
    @ApiOperation(value = "导出")
    public void export(HttpServletRequest request, HttpServletResponse response,@RequestBody YjwzStockInDTO yjwzStockInDTO){
        request.getSession();
        String fileName = "文件名称";

        EasyExcelGeneralUtil.setResponseContentType(response,fileName);
		//设置的分页最多能导出10000条数据
        yjwzStockInDTO.setPageNum(1);
        yjwzStockInDTO.setPageSize(10000);

		//查库得到需要导出的数据
        List<Object> vos = (List<Object>) stockInService.page(yjwzStockInDTO).getRows();

        EasyExcelGeneralUtil.exportExcelByEasyPoi(response,fileName,vos,YjwzStockInVO.class);
    }

好了,完整的过程就是这样了,直接掉接口导出就可以了。如有不足之处还请多多指导!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/219895.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

全网最新最全面的Appium自动化:Appium常用操作之设备操作

设备基本操作 前置条件&#xff1a; 示例代码&#xff1a; from appium import webdriver # 导入appium 驱动包 # 1、定义一个DesiredCapabilities配置的字典 des {automationName:appium,platformName:Android, # 平台的名称&#xff0c;iOS,Android,FirefoxOSplatformV…

打开游戏提示缺少(或找不到)XINPUT1_3.DLL怎么解决

在电脑使用过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是xinput1_3.dll丢失。那么&#xff0c;xinput1_3.dll是什么文件&#xff1f;它对电脑有什么影响&#xff1f;本文将详细介绍xinput1_3.dll丢失的原因以及五个详细的解决方法&#xff0c;帮助大家…

初识Protobuf与Protobuf的安装

目录 一、Protobuf 1.回顾序列化 2.Protobuf的特性 3.Protobuf的下载 ①ProtoBuf 在 window 下的安装 ②ProtoBuf 在 Linux 下的安装 一、Protobuf 1.回顾序列化 我们在先前的学习中也遇到过序列化。所谓序列化我的理解是&#xff0c;将复杂的对象以特定的方式转换以便于…

vue3-vite-ts:编写Rollup插件并使用 / 优化构建过程

一、vue3-vite-ts项目&#xff0c;编写Rollup插件并使用的意义 在使用Vue3 Vite TypeScript这种技术栈时&#xff0c;可以使用Rollup插件来优化构建过程&#xff0c;例如使用rollup-plugin-typescript2插件来编译TypeScript代码&#xff0c;使用rollup-plugin-vue插件来处理…

go-fastfds部署心得

我是windows系统安装 Docker Desktop部署 docker run --name go-fastdfs&#xff08;任意的一个名称&#xff09; --privilegedtrue -t -p 3666:8080 -v /data/fasttdfs_data:/data -e GO_FASTDFS_DIR/data sjqzhang/go-fastdfs:lastest docker run&#xff1a;该命令用于运…

基于深度学习YoloV8的火焰烟雾检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介简介YoloV8模型火焰烟雾检测系统模型训练实时检测 应用领域 二、功能三、系统四. 总结 一项目简介 # 基于深度学习YoloV8的火焰烟雾检测系统介绍 简介 深…

【Unity3D】Android打包报错AAPT2:xxx Linkxxx

Gradle Plugin 与Gradle版本不匹配问题 或 相关依赖库下载不完全问题&#xff1b; 使用镜像即可解决 也可以离线&#xff08;离线过于复杂 你能找到方法那最好是离线Maven) 仓库服务 找最新可用的镜像url&#xff0c;替换google()和jcenter()&#xff0c; 可以直接使用publ…

StoneDB-8.0-V2.2.0 企业版正式发布!性能优化,稳定性提升,持续公测中!

​ 11月&#xff0c;StoneDB 新版本如期而至&#xff0c;这一个月来我们的研发同学加班加点&#xff0c;持续迭代&#xff1a;在 2.2.0 版本中&#xff0c;我们针对用户提出的需求和做出了重量级更新&#xff0c;修复了一些已知和用户反馈的 Bug&#xff0c;同时对部分代码进行…

如何计算光伏电站的发电量?

光伏电站的发电量是衡量其性能和经济效益的关键指标。准确地预测和计算光伏电站的发电量对于投资决策、系统设计和优化至关重要。以下是一些计算光伏电站发电量的主要步骤和方法&#xff1a; 1、确定光伏电站的规模和配置 了解光伏电站的组件数量、类型、功率等级以及安装位置…

Win10点关机后马上又进入桌面解决方法

Win10点了关机&#xff0c;马上闪一下就又重新进入了桌面&#xff0c;关不了机怎么办&#xff1f;强制关机虽然是可行&#xff0c;但不能每一次都强制关机。下面给大家带来的win10不能关机的解决方法&#xff0c;希望能帮助到大家。 速印机&#xff08;理想、荣大等&#xff09…

用php和mysql制作一个网站

当使用PHP和MySQL制作网站时&#xff0c;我们可以利用PHP的强大功能来与MySQL数据库进行交互&#xff0c;从而实现动态网页的创建和数据存取。下面是一个关于如何使用PHP和MySQL制作网站的简单说明&#xff0c;以及一些示例代码。 ​ 1、R5Ai智能助手 chatgpt国内版本 :R5Ai智…

集成测试如何做?

今天学习下如何进行集成测试。 什么是集成测试? 集成测试被定义为一种测试类型&#xff0c;其中软件模块在逻辑上集成并作为一个组进行测试。一个典型的软件项目由多个软件模块组成&#xff0c;由不同的程序员编码。此级别测试的目的是在集成这些软件模块时&#xff0c;暴露…

羊大师带大家探寻,南北地区冬季饮食的差异

羊大师带大家探寻&#xff0c;南北地区冬季饮食的差异 南北地区的冬季饮食有着明显的不同。随着气温的骤降&#xff0c;人们的餐桌上也逐渐变得丰盛起来。精心准备的美食不仅温暖了身心&#xff0c;更能带来满满的幸福感。接下来&#xff0c;让小编羊大师带大家一起走进南北饮…

软件测试,缺少项目实战怎么办?

解决办法 你可以进行一个简单的web测试。 以我目前的认知和经验&#xff0c;悄悄告诉你&#xff1a;政府网站大概率会有bug。 在著此文时&#xff0c;我随便找了个地方政府网站&#xff0c;点了进去。 http://www.yibin.gov.cn/en/ybsq/201905/t20190513_976652.html 大家…

猜数字游戏--数据控制流

#随机生成一个1~100之间的数字作为基准数&#xff0c;每次通过键盘输入一个数&#xff0c;如果输入数和基准数相同&#xff0c;则成功过关&#xff0c;猜中则退出游戏。 import randombase_number random.randint(1, 100) # 生成基准数guess_times 0 # 初始化猜测次数whil…

基于Python+OpenCV的车道线和车辆检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 本文将介绍如何使用Python编程语言结合OpenCV库进行车道线和车辆检测。这种技术常用于计算机视觉领域&#xff0c;特…

Windows使用Redis

Windows使用Redis 前言一、安装wsl2&#xff08;Windows Subsystem for Linux&#xff09;二、在wsl中下载并安装Redis一主二仆哨兵模式 前言 主要是记录一下&#xff0c;免得自己忘了。 一、安装wsl2&#xff08;Windows Subsystem for Linux&#xff09; Redis官网中说&…

Course2-Week1-神经网络

Course2-Week1-神经网络 文章目录 Course2-Week1-神经网络1. 神经网络概述1.1 欢迎来到Course21.2 神经元和大脑1.3 引入神经网络-需求预测1.4 神经网络的其他示例-图像感知 2. 神经网络的数学表达式2.1 单层的神经网络-需求预测2.3 前向传播的神经网络-手写数字识别 3. Tensor…

YOLOv4 学习笔记

文章目录 前言一、YOLOv4贡献和改进二、YOLOv4核心概念三、YOLOv4网络架构四、YOLOv4数据增强五、YOLOv4的损失函数总结 前言 在近年来的目标检测领域&#xff0c;YOLOv4的出现标志着一个重要的技术突破。YOLOv4不仅继承了YOLO系列快速、高效的特点&#xff0c;还引入了一系列…

【LeetCode热题100】【双指针】接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] …