POI根据表头模板导出excel数据,并指定单个单元格样式,多sheet。

最近的公司需求,因为Excel表头样式较为复杂,不易直接用poi写出。
需要的Excel为这种:在这里插入图片描述
直接模板导出不能成为这样。

   public void exportCheckCsdn(HttpServletResponse response) {//获取到MNR 和 MNR-DT 的List//        此处写 获取到指定list 的语句List<MnrExcelDTO> mnrExcelDTOS = new ArrayList<>();//sheet2,如果是单个sheet,不需要这个List<MnrDtExcelDTO> mnrDtExcelDTOS = new ArrayList<>();
//        list赋值//excel模板路径File fi = null;try {
//            这边写的模板在resources下的 templates 下fi = ResourceUtils.getFile("classpath:templates/MNR_Check_Result.xlsx");} catch (FileNotFoundException e) {e.printStackTrace();}XSSFWorkbook wb = null;try {//读取excel模板wb = new XSSFWorkbook(new FileInputStream(fi));} catch (IOException e) {e.printStackTrace();}XSSFSheet mnrSheet = wb.getSheetAt(0);XSSFSheet mnrSheetDt = wb.getSheetAt(1);//从第二行开始 sheet1的  ,因为第一行为模板for (int i = 2; i < mnrExcelDTOS.size() + 2; i++) {//获取行数据//根据字段名获取对应行数据MnrExcelDTO rowData = mnrExcelDTOS.get(i - 2);Row row = mnrSheet.getRow(i);if (row == null) {// 创建新行对象row = mnrSheet.createRow(i);}for (int j = 0; j < MnrExcelDTO.class.getDeclaredFields().length; j++) {// 获取当前单元格Cell cell = row.getCell(j);if (cell == null) {// 如果单元格不存在,创建一个新的单元格对象cell = row.createCell(j);}// 获取对应单元格的字段名称Field field = MnrExcelDTO.class.getDeclaredFields()[j];String fieldName = field.getName();// 获取字段对应的 getter 方法Method method = null;String cellValue = "";try {//获取get方法method = rowData.getClass().getMethod("get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1));// 调用 getter 方法获取字段的属性值Object value = method.invoke(rowData);if (null == value) {cellValue = "";} else {// 将值转换为字符串类型,并设置到单元格中cellValue = String.valueOf(value);}cell.setCellValue(cellValue);} catch (InvocationTargetException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}CellStyle redCellStyle = null;Object value = "";try {
//                        如果字段名称不等于ckStatus,则设置单元格的样式if (!"ckStatus".equals(fieldName)) {value = method.invoke(rowData);// 将值转换为字符串类型,并设置到单元格中cellValue = String.valueOf(value);cell.setCellValue(cellValue);}} catch (InvocationTargetException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}redCellStyle = wb.createCellStyle();// 重点:从现有样式克隆style,只修改Font,其它style不变redCellStyle.cloneStyleFrom(cell.getCellStyle());// 获取原有字体Font oldFont = wb.getFontAt(redCellStyle.getFontIndexAsInt());// 创建新字体Font redFont = wb.createFont();// 重点:保留原字体样式redFont.setFontName(oldFont.getFontName()); // 保留原字体redFont.setFontHeightInPoints(oldFont.getFontHeightInPoints()); // 保留原字体高度redFont.setBold(true); // 加粗redFont.setColor(IndexedColors.RED.getIndex());  // 字体颜色:红色// 设置红色字体redCellStyle.setFont(redFont);// 设置样式cell.setCellStyle(redCellStyle);}}//从第二行开始 sheet2的  ,因为第一行为模板   同上for (int i = 2; i < mnrDtExcelDTOS.size() + 2; i++) {//获取行数据//根据字段名获取对应行数据MnrDtExcelDTO rowData = mnrDtExcelDTOS.get(i - 2);Row row = mnrSheet.getRow(i);if (row == null) {// 创建新行对象row = mnrSheet.createRow(i);}for (int j = 0; j < MnrExcelDTO.class.getDeclaredFields().length; j++) {// 获取当前单元格Cell cell = row.getCell(j);if (cell == null) {// 如果单元格不存在,创建一个新的单元格对象cell = row.createCell(j);}// 获取对应单元格的字段名称Field field = MnrExcelDTO.class.getDeclaredFields()[j];String fieldName = field.getName();// 获取字段对应的 getter 方法Method method = null;String cellValue = "";try {//获取get方法method = rowData.getClass().getMethod("get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1));// 调用 getter 方法获取字段的属性值Object value = method.invoke(rowData);if (null == value) {cellValue = "";} else {// 将值转换为字符串类型,并设置到单元格中cellValue = String.valueOf(value);}cell.setCellValue(cellValue);} catch (InvocationTargetException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}CellStyle redCellStyle = null;Object value = "";try {
//                        如果字段名称不等于ckStatus,则设置单元格的样式//也可以加上其他的判断,比如字符串末尾有 er 字符后缀,表示处理失败,给他变色即可if (!"ckStatus".equals(fieldName)) {value = method.invoke(rowData);// 将值转换为字符串类型,并设置到单元格中cellValue = String.valueOf(value);cell.setCellValue(cellValue);}} catch (InvocationTargetException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}redCellStyle = wb.createCellStyle();// 重点:从现有样式克隆style,只修改Font,其它style不变redCellStyle.cloneStyleFrom(cell.getCellStyle());// 获取原有字体Font oldFont = wb.getFontAt(redCellStyle.getFontIndexAsInt());// 创建新字体Font redFont = wb.createFont();// 重点:保留原字体样式redFont.setFontName(oldFont.getFontName()); // 保留原字体redFont.setFontHeightInPoints(oldFont.getFontHeightInPoints()); // 保留原字体高度redFont.setBold(true); // 加粗redFont.setColor(IndexedColors.RED.getIndex());  // 字体颜色:红色// 设置红色字体redCellStyle.setFont(redFont);// 设置样式cell.setCellStyle(redCellStyle);}}ServletOutputStream outputStream = null;try {ExcelUtil.setResponse(response, "userName-today-check");outputStream = response.getOutputStream();wb.write(outputStream);outputStream.flush();outputStream.close();wb.close();} catch (IOException e) {e.printStackTrace();}}

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

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

相关文章

是德科技E9304A功率传感器

是德科技E9304A二极管功率传感器测量频率范围为9 kHz至6 GHz的平均功率&#xff0c;功率范围为-60至20 dBm。该传感器非常适合甚低频(VLF)功率测量。E系列E9304A功率传感器有两个独立的测量路径&#xff0c;设计用于EPM系列功率计。功率计自动选择合适的功率电平路径。为了避免…

【微信小程序二维码配置】微信公众平台配置二维码,小程序测试二维码,小程序动态二维码,然后扫码打开对应页面进行操作

微信小程序二维码 操作添加二维码地址配置配置项 生成二维码动态二维码生成 操作 微信公众平台地址&#xff1a;微信公众平台 选择 开发管理 – 开发设置 – 扫普通链接二维码打开小程序 添加二维码地址 配置 配置项 二维码规则: URL 为内含下载校验文件的服务器 URL, 可以…

HTML-基础知识-基本结构,注释,文档说明,字符编码(一)

1.超文本标记语言不分大小写。 2.超文本标签属性名和属性值不区分大小写。 3.超文本标签属性值重复&#xff0c;听取第一个。 4.html结构 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"vi…

uniapp项目如何引用安卓原生aar插件(避坑指南三)

官方文档说明&#xff1a;uni小程序SDK 【彩带- 避坑知识点】 如果引用原生aar插件&#xff0c;都配置好之后&#xff0c;云打包&#xff0c;报不包含此插件&#xff0c;除了检查以下步骤流程外&#xff0c;还要检查一下是否上打包的原生插件aar流程有问题。 1.第一步在uniapp项…

关于“Python”的核心知识点整理大全44

目录 ​编辑 15.3.4 模拟多次随机漫步 rw_visual.py 注意 15.3.5 设置随机漫步图的样式 15.3.6 给点着色 rw_visual.py 15.3.7 重新绘制起点和终点 rw_visual.py 15.3.8 隐藏坐标轴 rw_visual.py 15.3.9 增加点数 rw_visual.py 15.3.10 调整尺寸以适合屏幕 rw_vi…

Linux磁盘与文件管理

目录 一、磁盘介绍 1. 磁盘数据结构 2. 磁盘的接口类型 3. 磁盘在Linux上的表现形式 二、磁盘分区与MBR 1. 分区优缺点 2. 分区方式 3. MBR分区 4. GPT分区 三、文件系统 1. 文件系统的组成 2. 默认的文件系统 3. 文件系统的作用 4. 模拟破坏文件与修复文件 4…

C语言二维数值数组常用算法------------(C每日一编程)

--主、次对角线求和 --上、下三角求和 --N*N方阵转置 --杨辉三角 正文开始&#xff1a; 主对角线&#xff1a; 用两个双重for循环 int a[3][3], i, j, s 0; for (i 0; i < 3; i)for (j 0; j < 3; j)if (i j)s s a[i][j]; 次对角线&#xff1a; 用两个双重…

Next Station of Flink CDC

摘要&#xff1a;本文整理自阿里云智能 Flink SQL、Flink CDC 负责人伍翀&#xff08;花名&#xff1a;云邪&#xff09;&#xff0c;在 Flink Forward Asia 2023 主会场的分享。Flink CDC 是一款基于 Flink 打造一系列数据库的连接器。本次分享主要介绍 Flink CDC 开源社区在过…

uniapp实现前端银行卡隐藏中间的数字,及隐藏姓名后两位

Vue 实现前端银行卡隐藏中间的数字 主要应用了 filters过滤器 来实现效果 实现效果&#xff0c;如图&#xff1a; <template><div><div style"background-color: #f4f4f4;margin:50px 0 0 460px;width:900px;height:300px;"><p>原来&#…

python之Selenium WebDriver安装与使用

首先把python下载安装后&#xff0c;再添加到环境变量中&#xff0c;再打开控制台输入: pip install selenium 正常情况下是安装好的&#xff0c;检查一下“pip show selenium”命令&#xff0c;出现版本号就说明安装好了。 1&#xff1a;如果出现安装错误&#xff1a; 那就用“…

代码随想录 Leetcode27. 移除元素

题目&#xff1a; 代码(首刷看解析 2023年12月28日)&#xff1a; class Solution { public:int removeElement(vector<int>& nums, int val) {int n nums.size();int slowIndex 0;for(int fastIndex 0; fastIndex < n; fastIndex){if(val ! nums[fastIndex])…

电影“AI化”已成定局,华为、小米转战入局又将带来什么?

从华为、Pika、小米等联合打造电影工业化实验室、到Pika爆火&#xff0c;再到国内首部AI全流程制作《愚公移山》开机……业内频繁的新动态似乎都在预示着2023年国内电影开始加速进入新的制片阶段&#xff0c;国内AI电影热潮即将来袭。 此时以华为为首的底层技术科技企业加入赛…

leaflet学习笔记-地图缩略图(鹰眼)的添加(三)

介绍 地图缩略图控件有助于用户了解主窗口显示的地图区域在全球、全国、全省、全市等范围内的相对位置&#xff0c;也称为鹰眼图。Leaflet提供了好几种地图缩略图控件&#xff0c;本文介绍其中一个最常用控件&#xff0c;即插件Leaflet.MiniMap。 依赖添加 这些地图控件都可以…

使用机器学习进行语法错误检测/纠正

francescofranco_39234 一、说明 一般的学习&#xff0c;特别是深度学习&#xff0c;促进了自然语言处理。各种模型使人们能够执行机器翻译、文本摘要和情感分析——仅举几个用例。今天&#xff0c;我们将研究另一个流行的用途&#xff1a;我们将使用Gramformer构建一个用于机器…

React学习计划-React16--React基础(七)redux使用与介绍

笔记gitee地址 一、redux是什么 redux是一个专门用于做状态管理的js库&#xff08;不是react插件库&#xff09;它可以用在react、angular、vue的项目中&#xff0c;但基本与react配合使用作用&#xff1a;集中式管理react应用中多个组件共享的状态 二、什么情况下需要使用r…

sheng的学习笔记-卷积神经网络

源自吴恩达的深度学习课程&#xff0c;仅用于笔记&#xff0c;便于自行复习 导论 1&#xff09;什么是卷积神经网络 卷积神经网络&#xff0c;也就是convolutional neural networks &#xff08;简称CNN&#xff09;&#xff0c;使用卷积算法的神经网络&#xff0c;常用于计…

感染了后缀为.[sqlback@memeware.net].2700勒索病毒如何应对?数据能够恢复吗?

导言&#xff1a; 近期&#xff0c;[sqlbackmemeware.net].2700 勒索病毒成为网络安全的一大威胁。该勒索病毒采用高度复杂的加密算法&#xff0c;将用户文件加密并勒索赎金。了解该病毒的特征对于有效恢复被加密数据以及预防进一步感染至关重要。如果受感染的数据确实有恢复的…

linux 网络工具(一)

linux 网络工具 1. nmcli命令1.1 介绍1.2 networking 网络控制1.3 connection 连接管理1.4 device 设备管理1.5 nmcli 返回状态码 2. ifcfg命令家族2.1 ifconfig2.2 route2.3 netstat 3. 静态路由CentosUbuntu - netplanUbuntu - network-manager 1. nmcli命令 1.1 介绍 RHEL…

工具系列:TimeGPT_(6)同时预测多个时间序列

TimeGPT提供了一个强大的多系列预测解决方案&#xff0c;它涉及同时分析多个数据系列&#xff0c;而不是单个系列。该工具可以使用广泛的系列进行微调&#xff0c;使您能够根据自己的特定需求或任务来定制模型。 # Import the colab_badge module from the nixtlats.utils pac…

HTML简介、基本骨架、标签的关系、注释、路径

1 HTML HTML超文本标记语言 超文本——链接 标记——标记也叫标签&#xff0c;带尖括号<>的文本 标签语法&#xff1a; 标签成对出现&#xff0c;中间包裹内容 <>里面放英文字母(标签名) 结束标签比开始标签多/ 拓展&#xff1a; 双标签&#xff1a;成对出现的标签…