使用poi解决导出excel内下拉框枚举项较多的问题

废话少说,直接上代码:

  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

猜你喜欢

转载自www.cnblogs.com/zouhao/p/11346243.html