废话少说,直接上代码:
1 package com.fst.attachment.controller; 2 3 import java.io.FileOutputStream; 4 5 import org.apache.poi.hssf.usermodel.DVConstraint; 6 import org.apache.poi.hssf.usermodel.HSSFDataValidation; 7 import org.apache.poi.hssf.usermodel.HSSFSheet; 8 import org.apache.poi.hssf.usermodel.HSSFWorkbook; 9 import org.apache.poi.ss.usermodel.DataValidation; 10 import org.apache.poi.ss.usermodel.DataValidationConstraint; 11 import org.apache.poi.ss.usermodel.DataValidationHelper; 12 import org.apache.poi.ss.usermodel.Name; 13 import org.apache.poi.ss.usermodel.Sheet; 14 import org.apache.poi.ss.usermodel.Workbook; 15 import org.apache.poi.ss.util.CellRangeAddressList; 16 import org.apache.poi.xssf.streaming.SXSSFWorkbook; 17 import org.apache.poi.xssf.usermodel.XSSFDataValidation; 18 import org.apache.poi.xssf.usermodel.XSSFDataValidationConstraint; 19 import org.apache.poi.xssf.usermodel.XSSFDataValidationHelper; 20 import org.apache.poi.xssf.usermodel.XSSFSheet; 21 import org.apache.poi.xssf.usermodel.XSSFWorkbook; 22 23 public class TestPOIDropDown { 24 25 public static void main(String[] args) throws Exception { 26 // 创建枚举项 27 int len = 200; 28 String[] datas = new String[len]; 29 for (int i = 0; i < len; i++) { 30 datas[i] = i + "我是下拉框枚举项---"; 31 } 32 33 // ----------------生成-------------------------------- 34 // 方法一:使用createExplicitListConstraint实现,缺陷为: 35 // 只能满足较少枚举项的下拉框,最好不要超过20个,具体个数根据枚举字段长度而定。 36 // Workbook workbook = HSSFSetDropDown(datas); 37 // Workbook workbook = XSSFSetDropDown(datas); 38 // Workbook workbook = SXSSFSetDropDown(datas); 39 /* 40 * 简单比较HSSF、XSSF、SXSSF: - 由于新的XSSF支持Excel 2007 OOXML(.xlsx)文件是基于XML的, 41 * 因此处理它们的内存占用量高于旧版HSSF支持的(.xls)二进制文件。 - 42 * SXSSF(3.8-beta3之后支持)在生成非常大的电子表格时使用, 相较于XSSF,其在某个时间点只能访问有限数量的行。 43 * http://poi.apache.org/components/spreadsheet/ 44 */ 45 46 // 方法二:使用createFormulaListConstraint实现,其适用于较多枚举项的下拉框, 47 // 实现步骤大致为:创建一个隐藏的sheet,并往里放入枚举项,然后在第一个sheet内增加关联关系 48 Workbook workbook = XSSFSetDropDownAndHidden(datas); 49 50 // 输出 51 FileOutputStream stream = new FileOutputStream("d:\\testDropDown.xlsx"); 52 workbook.write(stream); 53 stream.close(); 54 } 55 56 57 /** 58 * 使用createFormulaListConstraint实现下拉框 59 * @param formulaString 60 * @return 61 */ 62 public static Workbook XSSFSetDropDownAndHidden(String[] formulaString) { 63 Workbook workbook = new XSSFWorkbook(); 64 Sheet sheet = workbook.createSheet("下拉列表测试"); 65 // 创建sheet,写入枚举项 66 Sheet hideSheet = workbook.createSheet("hiddenSheet"); 67 for (int i = 0; i < formulaString.length; i++) { 68 hideSheet.createRow(i).createCell(0).setCellValue(formulaString[i]); 69 } 70 // 创建名称,可被其他单元格引用 71 Name category1Name = workbook.createName(); 72 category1Name.setNameName("hidden"); 73 // 设置名称引用的公式 74 // 使用像'A1:B1'这样的相对值会导致在Microsoft Excel中使用工作簿时名称所指向的单元格的意外移动, 75 // 通常使用绝对引用,例如'$A$1:$B$1'可以避免这种情况。 76 // 参考: http://poi.apache.org/apidocs/dev/org/apache/poi/ss/usermodel/Name.html 77 category1Name.setRefersToFormula("hiddenSheet!" + "$A$1:$A$" + formulaString.length); 78 // 获取上文名称内数据 79 DataValidationHelper helper = sheet.getDataValidationHelper(); 80 DataValidationConstraint constraint = helper.createFormulaListConstraint("hidden"); 81 // 设置下拉框位置 82 CellRangeAddressList addressList = new CellRangeAddressList(0, 200, 0, 0); 83 DataValidation dataValidation = helper.createValidation(constraint, addressList); 84 // 处理Excel兼容性问题 85 if (dataValidation instanceof XSSFDataValidation) { 86 // 数据校验 87 dataValidation.setSuppressDropDownArrow(true); 88 dataValidation.setShowErrorBox(true); 89 } else { 90 dataValidation.setSuppressDropDownArrow(false); 91 } 92 // 作用在目标sheet上 93 sheet.addValidationData(dataValidation); 94 // 设置hiddenSheet隐藏 95 workbook.setSheetHidden(1, true); 96 return workbook; 97 } 98 99 100 /** 101 * 使用较早版本的 HSSF用户模型设置表格下拉框 缺陷:下拉框数据量超过一定数量时,系统抛异常。 102 * 103 * @param formulaString 104 * 105 */ 106 public static Workbook HSSFSetDropDown(String[] formulaString) { 107 HSSFWorkbook workbook = new HSSFWorkbook(); 108 HSSFSheet sheet = workbook.createSheet("下拉列表测试"); 109 // 加载下拉列表内容 110 DVConstraint constraint = DVConstraint.createExplicitListConstraint(formulaString); 111 // 设置数据有效性加载在哪个单元格上。 112 // 四个参数分别是:起始行、终止行、起始列、终止列 113 CellRangeAddressList regions = new CellRangeAddressList(0, 200, 0, 0); 114 // 数据有效性对象 115 DataValidation dataValidation = new HSSFDataValidation(regions, constraint); 116 sheet.addValidationData(dataValidation); 117 return workbook; 118 } 119 120 /** 121 * 使用 XSSF用户模型设置表格下拉框,多用来处理xlsx后缀的excel 缺陷:下拉框数据量超过一定数量时,文件打不开。 122 * 123 * @param formulaString 124 * 125 */ 126 public static Workbook XSSFSetDropDown(String[] formulaString) { 127 XSSFWorkbook workbook = new XSSFWorkbook(); 128 XSSFSheet sheet = workbook.createSheet("下拉列表测试"); 129 XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper(sheet); 130 XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint) dvHelper 131 .createExplicitListConstraint(formulaString); 132 CellRangeAddressList addressList = null; 133 XSSFDataValidation validation = null; 134 for (int i = 0; i < 500; i++) { 135 addressList = new CellRangeAddressList(i, i, 0, 0); 136 validation = (XSSFDataValidation) dvHelper.createValidation(dvConstraint, addressList); 137 // 07默认setSuppressDropDownArrow(true); 138 // validation.setSuppressDropDownArrow(true); 139 // validation.setShowErrorBox(true); 140 sheet.addValidationData(validation); 141 } 142 return workbook; 143 } 144 145 /** 146 * 使用 SXSSF用户模型设置表格下拉框 缺陷:下拉框数据量超过一定数量时,文件打不开。 147 * 148 * @param formulaString 149 * 150 */ 151 public static Workbook SXSSFSetDropDown(String[] formulaString) { 152 SXSSFWorkbook workbook = new SXSSFWorkbook(); 153 Sheet sheet = workbook.createSheet("下拉列表测试"); 154 // 加载下拉列表内容 155 DataValidationHelper helper = sheet.getDataValidationHelper(); 156 DataValidationConstraint constraint = helper.createExplicitListConstraint(formulaString); 157 // 设置下拉框位置 158 CellRangeAddressList addressList = null; 159 addressList = new CellRangeAddressList(0, 500, 0, 0); 160 DataValidation dataValidation = helper.createValidation(constraint, addressList); 161 // 处理Excel兼容性问题 162 if (dataValidation instanceof XSSFDataValidation) { 163 // 数据校验 164 dataValidation.setSuppressDropDownArrow(true); 165 dataValidation.setShowErrorBox(true); 166 } else { 167 dataValidation.setSuppressDropDownArrow(false); 168 } 169 sheet.addValidationData(dataValidation); 170 return workbook; 171 } 172 173 }
参考
http://poi.apache.org/apidocs/dev/org/apache/poi/ss/usermodel/Name.html
http://poi.apache.org/components/spreadsheet/
最后
转帖请注明出处,谢谢
---------------------
版权声明:本文为CSDN博主「Fei___」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/fei565789229/article/details/85016091