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*/@Overridepublic CellStyle getHeaderStyle(short color) {return headerStyle;}/*** 每列标题样式* @param color* @return*/@Overridepublic CellStyle getTitleStyle(short color) {return titleStyle;}/*** 数据行样式* @param b* @param excelExportEntity* @return*/@Overridepublic CellStyle getStyles(boolean b, ExcelExportEntity excelExportEntity) {return styles;}/*** 获取行样式方法* @param cell* @param i* @param entity* @param o* @param o1* @return*/@Overridepublic CellStyle getStyles(Cell cell, int i, ExcelExportEntity entity, Object o, Object o1) {return getStyles(true,entity);}@Overridepublic 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中设置了sheetNamemap.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);}

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pytest-yaml 测试平台.新增项目和用例

基于pytest-yaml-yoyo 框架写的接口测试平台&#xff0c;在web网页平台上维护yaml测试用例&#xff0c;执行用例&#xff0c;并查看allure报告。 pytest-yaml-yoyo 框架简介 pytest-yaml-yoyo 框架是上海-悠悠 2023年自主开发的pytest结合yaml框架。gitee项目地址https://gite…

综合指南:如何创建有效的知识地图?

知识地图是知识管理中的重要工具&#xff0c;使企业能够有效地利用其资产。它促进了解决问题、新人整合和组织学习。此外&#xff0c;它还提高了生产力&#xff0c;实现了数据驱动的决策&#xff0c;并优化了流程。通过捕获和组织有价值的知识资产&#xff0c;它确保了专业知识…

前后端分离vue+Nodejs社区志愿者招募管理系统

1、首页 1)滑动的社区照片册 使用轮播图&#xff0c;对社区的活动纪念与实时事件宣传。 每个图片附有文字链接&#xff0c;点击跳转对应社区要闻具体页。 2)社区公告栏 日常的社区公告以及系统说明在此区域中进行说明与展示。 2、志愿活动 1)志愿活动发布 想发布需要登录 2)志愿…

【C语言】【堆排序实现TOPK问题】写一个堆排序,并且在一百万个数中找出最大的前K个

1.堆排序的实现&#xff1a; 如果要升序输出&#xff0c;则实现大堆 如果要降序输出&#xff0c;则实现小堆 逻辑&#xff1a;&#xff08;升序输出&#xff09; 将堆顶的元素和最后一个元素交换位置&#xff0c;此时左子树和右子树分别仍是大堆的顺序&#xff0c;交换位置后…

【matlab程序】matlab画螺旋图|旋转图

%% 数学之美====》螺旋线 % 海洋与大气科学 % 20231205 clear;clc;close all; n=10; t=0:0.01:2pin; R=1; xx=nan(length(t),1);yy=nan(length(t),1); for i=1:length(t) xx(i)=Rcos(t(i)); yy(i)=Rsin(t(i)); R=R+1; end figure set(gcf,‘position’,[50 50 1200 1200],‘col…

中文手写数字数据识别

实验环境 python3.7torch1.13.1cu117 torchaudio0.13.1cu117 torchvision0.14.1数据下载地址&#xff1a;Mnist中文手写数字数据集Python资源-CSDN文库 这些汉字包括&#xff1a; 零、一、二、三、四、五、六、七、八、九、十、百、千、万、亿 总共15个汉字&#xff0c;分别…

浅谈ArrayBuffer、Blob和File、FileReader

ArrayBuffer、Blob和File都是JavaScript中处理二进制数据的对象。 ArrayBuffer 用于表示一个通用的、固定长度的原始二进制数据缓冲区。它不能直接操作缓冲区中的数据&#xff0c;而需要通过一个类型化数组TypedArray&#xff08;如Int8Array、Uint8Array等&#xff09;或者一…

linux 中crontab 定时任务计划创建时间文件夹示例

1.创建一个sh脚本 /usr/bin/mkdir 是mkdir命令的路径 /usr/bin/chmod 是chmod命令的路径 2.编辑定时任务 crontab -e

爆款开放式耳机哪一款性价比最高?3款热门机型推荐,小白速看

随着生活水平的提升&#xff0c;越来越多的人对蓝牙耳机的需求不再局限于简单的音乐欣赏。他们对耳机的要求越来越高&#xff0c;包括音质表现、舒适度、环境感知等方面也有极大的期待&#xff0c;正是因为这样&#xff0c;开放式耳机应运而生。 身为一个数码测评小博主&#x…

C++ 12.5作业

以下是一个简单的比喻&#xff0c;将多态概念与生活中的实际情况相联系&#xff1a; 比喻&#xff1a;动物园的讲解员和动物表演 想象一下你去了一家动物园&#xff0c;看到了许多不同种类的动物&#xff0c;如狮子、大象、猴子等。现在&#xff0c;动物园里有一位讲解员&…

音乐律动效果

先上图 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>音乐律动效果</title><style>* {margin: 0;padding: 0;}li {list-style: none;}.container .img {width: 200px;height: 200…

Git介绍与安装使用

目录 1.Git初识 1.1提出问题 1.2如何解决--版本控制器 1.3注意事项 2.Git安装 2.1Linux-centos安装 2.2Linux-ubuntu安装 2.3Windows安装 3.Git基本操作 3.1创建Git本地仓库 3.2配置Git 4.认识⼯作区、暂存区、版本库 1.Git初识 1.1提出问题 不知道你工作或学习时…

VBA技术资料MF92:将多个Excel表插入Word文档的不同位置

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

从零开始,轻松实现Python接口自动化测试(基于PyCharm)

1.接口清单整理 &#xff08;1&#xff09;请求&#xff1a; 请求URL请求方法请求参数请求报文 &#xff08;2&#xff09;响应 状态码响应数据 2.用例设计 &#xff08;1&#xff09;单接口测试用例 模板&#xff1a;id、模块、接口名称、请求URL、用例名称、请求方法、…

解决typescript报错:找不到名称xxx

现象&#xff1a; 原因&#xff1a;在同时导入默认导出和命名导出时&#xff0c;默认导出必须放在命名导出之前 下面的就是原始文件&#xff1a; 默认导出指&#xff1a; export default导出类型&#xff0c; import时无需大括号 命名导出指&#xff1a; 仅有export关键字…

优化汽车产业用户营运:精细化策略

近年来随着互联网时代新技术浪潮的冲击&#xff0c;商业社会中各种原生边界不断被打破&#xff0c;新的消费需求、新的商业模式、新的竞争挑战层出不穷。各行业往往面临重重困境与迷思&#xff0c;学会如何精细化运营用户显得尤为重要。立即阅读阅文&#xff0c;详细了解其中用…

手动创建spring bean并注入

文章目录 前言一、jar包中,相同class不同类加载器加载的时候是同一个class嘛&#xff1f;二、利用ConfigurableListableBeanFactory手动注册bean注册bean,并自动注入依赖bean根据类型获取注入的bean,两个bean是一个吗? 三、同一份字节码,class隔离,bean隔离总结 前言 注入一个…

python打包exe,打包好后,启动exe报错找不到paddleocr

目录 1、安装pyinstaller 2、生成脚本文件的.spce文件 3、资源文件配置 4、生成exe文件 5、使用了paddleocr启动exe后报错 6、配置.spce文件 7、重新生成exe文件 8、关于图片找不到的问题 参考&#xff1a;PaddleOCR打包exe--Pyinstaller_paddleocr 打包exe_mjiansun的博…

JS初步了解this

什么是环境对象&#xff1f; 环境对象&#xff1a;指的是函数内部特殊的变量this&#xff0c;它代表着当前函数运行时所处的环境 作用&#xff1a;弄清楚this的指向&#xff0c;可以让我们代码更简洁 在普通函数中&#xff1a; // 每个函数里面都有this 普通函数的this指向wind…

面试多线程八股文十问十答第三期

面试多线程八股文十问十答第三期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1.介绍一下自旋锁 重量级锁竞争时&#xff0c;尝试获取锁的线程不会立即阻塞&…