【POI-EXCEL-下拉框】POI导出excel下拉框数据太多导致下拉框不显示BUG修复

RT

最近在线上遇到一个很难受的BUG,我一度以为是我代码逻辑出了问题,用了Arthas定位分析之后,开始坚定了信心:大概率是POI的API有问题,比如写入数据过多。
在这里插入图片描述
PS:上图为正常的下拉框。但是,当下拉选项过多时(跟多少无关,而是跟字节数有关),会导致下拉框内容显示失败

解决办法

功夫不负有心人,根据百度找到了这篇文章《ava POI 利用隐藏sheet实现导出下拉数据太多为空》。

解决思路是:

  1. 使用隐藏sheet来实现下拉框,抛弃旧有的方法

翻译成我这边的代码之后,如下:

创建下拉框单例:

import cn.hutool.core.collection.CollectionUtil;
import org.apache.poi.ss.usermodel.DataValidation;
import org.apache.poi.ss.usermodel.DataValidationConstraint;
import org.apache.poi.ss.usermodel.DataValidationHelper;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddressList;
import org.apache.poi.xssf.usermodel.XSSFDataValidation;
import org.apache.poi.xssf.usermodel.XSSFDataValidationConstraint;
import org.apache.poi.xssf.usermodel.XSSFDataValidationHelper;
import org.apache.poi.xssf.usermodel.XSSFSheet;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;/*** @author feng.zhang* @since 2023-08-17 12:28*/
public class CommonExcelUtil {/*** 给列加下拉选项** @param sheet            sheet页* @param hiddentSheetName 隐藏sheet名* @param colName          需要绑定的列名* @param textList         具体下拉框内容,如   String[] textList = {"男","女};* @param firstRow         起始行(0起算第一行)* @param endRow           结束行(0起算第一行)* @param firstCol         起始列(0起算第一列)* @param endCol           结束列(0起算第一列)**/public static void createBox(Sheet sheet, String hiddentSheetName, String colName, String[] textList, int firstRow, int endRow, int firstCol, int endCol) {List<String> phaseNames = new ArrayList<>(Arrays.asList(textList));int row = CollectionUtil.isEmpty(phaseNames) ? 1 : phaseNames.size();String strFormula = hiddentSheetName + "!$" + colName + "$1:$" + colName + "$" + row;XSSFDataValidationConstraint hiddentConstraint = new XSSFDataValidationConstraint(DataValidationConstraint.ValidationType.LIST, strFormula);// 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol);// 数据有效性对象DataValidationHelper help = new XSSFDataValidationHelper((XSSFSheet) sheet);DataValidation validation = help.createValidation(hiddentConstraint, regions);sheet.addValidationData(validation);}
}

调用处代码:

private void setTopLevel(Workbook workbook) {String[] array = getDataArray();// 创建隐藏sheetfinal String hiddenSheetName = "hiddenSheetA";final String colName = "A";if (array.length > 0) {workbook.createSheet(hiddenSheetName);workbook.setSheetHidden(workbook.getSheetIndex(workbook.getSheet(hiddenSheetName)), true);Sheet sheet = workbook.getSheet(hiddenSheetName);//sheet.getLastRowNum无法区分 有一行和没有 所以这里先建一行sheet.createRow(0);int colNum = Integer.valueOf(colName.charAt(0)) - 65;Row row; //创建数据行sheet.setColumnWidth(colNum, 4000); //设置每列的列宽for (int j = 0; j < array.length; j++) {if (sheet.getLastRowNum() < j) {row = sheet.createRow(j); //创建数据行} else {row = sheet.getRow(j);}//设置对应单元格的值row.createCell(colNum).setCellValue(array[j]);}}CommonExcelUtil.createBox(workbook.getSheetAt(0), hiddenSheetName, colName, array, 2, topLevelArr.size() + 1000, 6, 6);}

感谢

感谢【博客园】大佬【作者:二次元的程序猿】的文章《ava POI 利用隐藏sheet实现导出下拉数据太多为空》

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

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

相关文章

2000-2021年上市公司产融结合度量数据

2000-2021年上市公司产融结合度量数据 1、时间&#xff1a;2000-2021年 2、指标&#xff1a;股票代码、年份、是否持有银行股份、持有银行股份比例、是否持有其他金融机构股份、产融结合 3、来源&#xff1a;上市公司年报 4、范围&#xff1a;上市公司 5、样本量&#xff…

react-hook-form。 useFieldArray Controller 必填,报错自动获取较多疑问记录

背景 动态多个数据Controller包裹时候&#xff0c;原生html标签input可以add时候自动获取焦点&#xff0c;聚焦到最近不符合要求的元素上面 matiral的TextField同样可以可是x-date-pickers/DatePicker不可以❌ 是什么原因呢&#xff0c;内部提供foucs&#xff1f;&#xff1f;属…

arcpy.describe

描述 根据输入的数据&#xff0c;返回输入数据的属性 arcpy.da.Describe与arcpy.Describe返回的数据是一样的但是返回的的类型不一样&#xff0c;arcpy.da.Describe返回的是字典&#xff0c;arcpy.Describe返回的是string 如果要访问数据对象不存在的属性&#xff0c;将返回…

对话式AI驱动的计算机辅助设计【CAD】

大型语言模型 (LLM) 为 CAD 软件公司提供了通过对话式 AI 增强设计工作流程的新机会。 工程师无需浏览复杂的菜单&#xff0c;而是可以用简单的语言描述需求并接收由集成数据支持的智能响应。 例如&#xff0c;工程师可以通过询问“2 盎司以下的铝支架”来查询零件数据库。 LL…

Python数据可视化入门指南

Matplotlib和Plotly是两个在Python中广泛使用的数据可视化库&#xff0c;它们具有丰富的API和功能&#xff0c;用于创建各种类型的图表和图形。在本篇博客中&#xff0c;我们将介绍它们的主要特点和基本用法。 Matplotlib 主要特点&#xff1a; 高度自定义&#xff1a; Matp…

赋能制造业高质量发展,释放采购数字化新活力——企企通亮相武汉2023国际智能制造创新论坛

摘要 “为应对成本上升、供应端不稳定、供应链上下游协同困难、决策无数据依据等问题&#xff0c;利用数字化手段降本增效、降低潜在风险十分关键。在AI等先进技术发展、供应链协同效应和降本诉求等机遇的驱动下&#xff0c;采购供应链数字化、协同化成为企业激烈竞争的优先选…

省钱兄短剧短视频视频滑动播放模块源码支持微信小程序h5安卓IOS

# 开源说明 开源省钱兄短剧系统的播放视频模块&#xff08;写了测试弄了好久才弄出来、最核心的模块、已经实战了&#xff09;&#xff0c;使用uniapp技术&#xff0c;提供学习使用&#xff0c;支持IOSAndroidH5微信小程序&#xff0c;使用Hbuilder导入即可运行 #注意&#xff…

远程IO在激光行业:实现高效、精准控制的解决方案

激光机简介 激光机是激光雕刻机、激光切割机和激光打标机的总称。激光机利用其高温的工作原理作用于被加工材料表面&#xff0c;同时根据输入到机器内部的图形&#xff0c;绘制出客户要求的图案、文字等。激光机根据用途可分为激光切割机和激光雕刻机。其中&#xff0c;激光切割…

arcpy.AddIDMessage

描述 使用 AddIDMessage 函数编写任何标准错误或警告消息。 示例 代码 def _raise_conda_import_error():#使用 AddIDMessage 函数编写任何标准错误或警告消息。arcpy.AddIDMessage("ERROR", 260005)exit(260005) #检测导入的包是否存在错误&#xff0c;如果导入…

Python爬虫实战案例——第七例

文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff01;严禁将文中内容用于任何商业与非法用途&#xff0c;由此产生的一切后果与作者无关。若有侵权&#xff0c;请联系删除。 目标&#xff1a;LI视频采集 地址&#xff1a;aHR0cHM6Ly93d3cucGVhcnZpZGVv…

顺序表练习

顺序表练习 图解插入与删除&#xff0c;详见相关内容&#xff1a;顺序存储结构的插入与删除 //顺序表的定义、创建、插入、删除、查找 //定义&#xff1a;结构体中数组、表长 //创建:输入元素&#xff0c;表长 //插入&#xff1a;判断表是否已满、判断位序合法性 //插入位序k…

51单片机晶体管数字编码

51单片机 单片机型号&#xff1a;STC86C52RC/LE52RC 晶体管 数字编码 数字P0P1P2P3P4P5P6P7011111100101100000211011010311110010401100110510110110610111110711100000811111110911110110 00011 11110x3F10000 01100x0620101 10110x5B30100 11110x4F40110 01100x6650110 110…