manailin
2021-06-14 b1eb51c980efb4db207223ce86ddc459916dff7c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package com.panzhihua.common.utlis;
 
import org.apache.poi.hssf.usermodel.DVConstraint;
import org.apache.poi.hssf.usermodel.HSSFDataValidation;
import org.apache.poi.ss.usermodel.Name;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddressList;
 
public final class ExcelSelectListUtil {
    private ExcelSelectListUtil() {
        throw new IllegalStateException("Utility class");
    }
    /**
     * firstRow 開始行號 根据此项目,默认为2(下标0开始)
     * lastRow  根据此项目,默认为最大65535
     * firstCol 区域中第一个单元格的列号 (下标0开始)
     * lastCol 区域中最后一个单元格的列号
     * strings 下拉内容
     * */
    public static void selectList(Workbook workbook, int firstCol, int lastCol, String[] strings){
        int charLenth = stringArrayLength(strings);
        int arraylLenth=strings.length;
        if(charLenth+arraylLenth>=255){
        Sheet sheet = workbook.getSheetAt(0);
        //解决下拉超过255个字符的问题
        String hiddenSheet="hidden"+firstCol;
        Sheet category1Hidden = workbook.createSheet(hiddenSheet);
        for (int i = 0, length = strings.length; i < length; i++) {
            // 循环赋值(为了防止下拉框的行数与隐藏域的行数相对应来获取>=选中行数的数组,将隐藏域加到结束行之后)
            category1Hidden.createRow(i).createCell(0).setCellValue(strings[i]);
        }
        Name category1Name = workbook.createName();
        category1Name.setNameName(hiddenSheet);
        category1Name.setRefersToFormula(hiddenSheet+"!$A$1:$A$" + strings.length);
        // A1:A代表隐藏域创建第?列createCell(?)时。以A1列开始A行数据获取下拉数组
        //  生成下拉列表
        //  只对(x,x)单元格有效
        CellRangeAddressList cellRangeAddressList = new CellRangeAddressList(2, 65535, firstCol, lastCol);
        //  生成下拉框内容
        DVConstraint dvConstraint = DVConstraint.createFormulaListConstraint(hiddenSheet);
        HSSFDataValidation dataValidation = new HSSFDataValidation(cellRangeAddressList, dvConstraint);
        //  对sheet页生效
        workbook.setSheetHidden(1,true);
        sheet.addValidationData(dataValidation);
        }else{
            Sheet sheet = workbook.getSheetAt(0);
            //  生成下拉列表
            //  只对(x,x)单元格有效
            CellRangeAddressList cellRangeAddressList = new CellRangeAddressList(2, 65535, firstCol, lastCol);
            //  生成下拉框内容
            DVConstraint dvConstraint = DVConstraint.createExplicitListConstraint(strings);
            HSSFDataValidation dataValidation = new HSSFDataValidation(cellRangeAddressList, dvConstraint);
            //  对sheet页生效
            sheet.addValidationData(dataValidation);
        }
    }
 
    private static int stringArrayLength(String[] args){
        int rs=0;
        for( int i=0 ; i<args.length ; i++ ){
            rs+=args[i].length();
        }
        return rs;
    }
}