mitao
2025-02-21 31573d6180d15ef65ed0df9c2732495f40b12663
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
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;
    }
}