使用Aspose.cells 设置多级下拉

  • 多级级联下拉代码使用
  • 参考案例1 使用三级下拉
  • 参考案列2 使用五级下拉


Aspose.cells jar包

链接:https://pan.baidu.com/s/1sJzVYyQkTVX7YtD9XRaxGg
提取码:YESH

或使用maven

<repositories>
        <repository>
            <id>AsposeJavaAPI</id>
            <name>Aspose Java API</name>
            <url>http://repository.aspose.com/repo/</url>
        </repository>
    </repositories>
    <dependencies>
        <dependency>
            <groupId>com.aspose</groupId>
            <artifactId>aspose-cells</artifactId>
            <version>21.10</version>
        </dependency>
        <dependency>
            <groupId>com.aspose</groupId>
            <artifactId>aspose-cells</artifactId>
            <version>21.10</version>
            <classifier>javadoc</classifier>
        </dependency>
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk15on</artifactId>
            <version>1.60</version>
        </dependency>
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcpkix-jdk15on</artifactId>
            <version>1.60</version>
        </dependency>
    </dependencies>

多级级联下拉代码使用

  1. 使用请参考main方法
  2. 拿来即用 请使用该方法
/**
*返回一个apose.cells的workBook格式 可以使用第三点说明的方法来保存文件
*/
static Workbook addDropDownValidationsToSheet(
            List<DropDownData> dropDownData,
            int fromRow,
            int endRow,
            char... column)
  1. Aspose.cells 提供workBook的save方法、可以以各种格式存储 文件转换太过于方便
    比如:调用workBook.save(“filePath”,SaveFormat .HTML );
    就可以将文件转换为html 并存放在指定的filePath下
/**
*fileName 存储路径加文件后缀
*saveFormat:如下
*/
public void save(String fileName, int saveFormat) ;
public void save(String fileName) throws Exception ;
public void save(String fileName, SaveOptions saveOptions);
public void save(OutputStream stream, SaveOptions saveOptions);
public void save(OutputStream stream, int saveFormat) ;
//源码参考
public final class SaveFormat {
    public static final int CSV = 1;
    public static final int XLSX = 6;
    public static final int XLSM = 7;
    public static final int XLTX = 8;
    public static final int XLTM = 9;
    public static final int XLAM = 10;
    public static final int TSV = 11;
    public static final int TAB_DELIMITED = 11;
    public static final int HTML = 12;
    public static final int M_HTML = 17;
    public static final int ODS = 14;
    public static final int EXCEL_97_TO_2003 = 5;
    public static final int SPREADSHEET_ML = 15;
    public static final int XLSB = 16;
    public static final int AUTO = 0;
    public static final int UNKNOWN = 255;
    public static final int PDF = 13;
    public static final int XPS = 20;
    public static final int TIFF = 21;
    public static final int SVG = 28;
    public static final int DIF = 30;
    public static final int NUMBERS = 56;
    public static final int MARKDOWN = 57;
    public static final int FODS = 59;
    public static final int SXC = 60;
    public static final int PPTX = 61;
    public static final int DOCX = 62;

    private SaveFormat() {
    }
}
  1. 工具类正文以及测试用例,参考main方法
import com.aspose.cells.*;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

/**
 * @Author :yeguojin
 * @Date :Created in 2021/10/25 16:02
 * @Description:Excel下拉设置 使用aspose.cell 插件
 * @Modified By:
 */
public class ExcelDorpDownValidate {
    private static final String DEFAULT_ERROR_TITLE = "error";
    private static final String DEFAULT_ERROR_MSG = "请填写下拉值!";

    private static final Integer DEFAULT_FROM_ROW = 0;

    private static final Integer DEFAULT_END_ROW = 1999;

    private Workbook workbook;
    private Worksheet targetSheet;
    private List<DropDownData> dropDownData;
    private Integer fromRow;
    private Integer endRow;
    private String errorTitle;
    private String errorMsg;
    private char[] column;

    public ExcelDorpDownValidate setWorkbook(Workbook workbook) {
        if (this.workbook == null) {
            this.workbook = workbook;
        }
        return this;
    }


    public ExcelDorpDownValidate setWorkbook(String workbookPath) throws Exception {
        if (this.workbook == null) {
            this.workbook = new Workbook(workbookPath);
        }
        return this;
    }

    public ExcelDorpDownValidate setWorkbook(InputStream workbookStream) throws Exception {
        if (this.workbook == null) {
            this.workbook = new Workbook(workbookStream);
        }
        return this;
    }

    public ExcelDorpDownValidate setWorksheet(Worksheet worksheet) {
        if (this.targetSheet == null) {
            this.targetSheet = worksheet;
        }
        return this;
    }

    public ExcelDorpDownValidate setWorksheet(int worksheetIndex) {
        if (this.workbook == null) {
            this.workbook = new Workbook();
        }
        if (this.targetSheet == null) {
            this.targetSheet = this.workbook.getWorksheets().get(worksheetIndex);
        }
        return this;
    }

    public ExcelDorpDownValidate setDropDownList(List<DropDownData> dropDownList) {
        this.dropDownData = dropDownList;
        return this;
    }

    public ExcelDorpDownValidate setFromRow(int fromRow) {
        this.fromRow = fromRow;
        return this;
    }

    public ExcelDorpDownValidate setEndRow(int endRow) {
        this.endRow = endRow;
        return this;
    }

    public ExcelDorpDownValidate setErrorTitle(String errorTitle) {

        this.errorTitle = errorTitle;
        return this;
    }

    public ExcelDorpDownValidate setErrorMsg(String errorMsg) {

        this.errorMsg = errorMsg;
        return this;
    }

    public ExcelDorpDownValidate setColumn(char... column) {
        this.column = column;
        return this;
    }

    public Workbook build() {
        if (this.workbook == null) {
            this.workbook = new Workbook();
        }
        if (this.targetSheet == null) {
            //默认取第一个sheet
            this.targetSheet = this.workbook.getWorksheets().get(0);
        }
        if (this.dropDownData == null || this.dropDownData.isEmpty()) {
            throw new RuntimeException("dropDownData is empty");
        }
        if (this.fromRow == null) {
            //默认在第一行开始
            this.fromRow = DEFAULT_FROM_ROW;
        }
        if (this.endRow == null) {
            //两千行结束
            this.endRow = DEFAULT_END_ROW;
        }
        if (this.errorTitle == null) {
            this.errorTitle = DEFAULT_ERROR_TITLE;
        }
        if (this.errorMsg == null) {
            this.errorMsg = DEFAULT_ERROR_MSG;
        }
        if (column == null) {
            throw new RuntimeException("column is null");
        }
        return addDropDownValidationsToSheet(workbook, targetSheet, dropDownData, fromRow, endRow, errorTitle, errorMsg, column);
    }

    /**
     * 使用aspose.cells 工具设置级联下拉不限制层数
     *
     * @param workbook     该工作薄
     * @param targetSheet  设置下拉数据的sheet
     * @param dropDownData 下拉数据对象
     * @param fromRow      开始位置 行位置下表 从零开始
     * @param endRow       结束位置 行位置下表 从零开始
     * @param column       需要设置级联下拉的位置列 如 'A'、‘B’
     * @param errorTitle   填错信息的提示
     * @param errorMsg     错误提示信息信息
     *                     <p>
     *                     column 有多少个则dropDownData就需要有多少层数据。
     *                     dropDownData的数据会新创建一个sheet放在最后的sheet里面 一级放一列 如有三层:放在 A、B、C三列下。
     *                     column 如果是 A、B、C 则 A是B的父集,B是C的父集,按照顺序类推
     *                     </p>
     */
    public static Workbook addDropDownValidationsToSheet(Workbook workbook,
                                                         Worksheet targetSheet,
                                                         List<DropDownData> dropDownData,
                                                         int fromRow,
                                                         int endRow,
                                                         String errorTitle,
                                                         String errorMsg,
                                                         char... column) {
        //最上层父集的名称
        String uppermostParentSetRangName = "range";
        //获取校验结合targetSheet
        ValidationCollection validations = targetSheet.getValidations();
        //通过workBook 创建新的sheet 用于存放下拉数据
        int workSheetIndex = workbook.getWorksheets().add();
        Worksheet worksheet = workbook.getWorksheets().get(workSheetIndex);
        //数据单元格
        Cells dataCells = worksheet.getCells();
        //创建队列 将第一层数据加入进去
        Queue<DropDownData> queue = new LinkedList<>();
        queue = createQueue(queue, dropDownData);

        //用于定位位置 记录设置的下拉数据是第几个
        int i = 0;
        List<Integer> size = new ArrayList<>();
        size.add(dropDownData.size());
        //用于记录使用多少个 儿子集合,最上层集合为第0个
        int index = 0;
        //创建最上层父集的下拉数据引用范围 参数解释:开始行、开始列、总行数、总列数
        //这里是从第一行第一列(0,0 表示的单元格第一行第一列)开始,总行数为dropDownData.size(),总列数为1列
        Range uppermostParentSet = dataCells.createRange(0, 0, dropDownData.size(), 1);
        uppermostParentSet.setName(uppermostParentSetRangName + index);
        dataCells.getRanges().add(uppermostParentSet);

        //设置名称管理器数据和引用位置
        //使用队列 保证效率为 O(n)
        //利用树形结构层序遍历
        int sizeSum = getSizeSum(size, index);//
        int location = getSizeSum(size, index - 1);//设置数据的行位置
        while (!queue.isEmpty()) {
            DropDownData poll = queue.poll();
            if (i >= sizeSum) {
                index++;
                sizeSum = getSizeSum(size, index);
                location = getSizeSum(size, index - 1);
            }
            Range setValueRang = dataCells.getRanges().get(index);
            setValueRang.get(index == 0 ? i : i - location, 0).setValue(poll.getCurrent());

            if (poll.children != null && !poll.children.isEmpty()) {
                queue = createQueue(queue, poll.children);
                size.add(poll.children.size());
                //只要有子集 就需要创建名称管理器下拉数据
                Range createChildren = dataCells.createRange(getSizeLastTime(size), 1, poll.children.size(), 1);
                createChildren.setName(poll.getCurrent());
                dataCells.getRanges().add(createChildren);
            }
            //每循环一次加一
            i++;
        }
        //设置校验空间 有多少个column就遍历多少次
        for (int i1 = 0; i1 < column.length; i1++) {
            //获取设置的列位置 转换成字符串
            String c = column[i1] + "";
            //设置CellArea区域 cellArea 使用的是字符 最小的是从1开始
            CellArea cellArea = CellArea.createCellArea("" + c + (fromRow + 1), c + (endRow + 1) + "");
            //创建校验Validation
            int add = validations.add(cellArea);
            Validation validation = validations.get(add);
            if (i1 == 0) {
                //设置最上层校验公式
                validation.setFormula1(uppermostParentSetRangName + i1);
            } else {
                //设置下一级校验公式
                validation.setFormula1(String.format("=INDIRECT(%s%s)", column[i1 - 1], (fromRow + 1)));
            }
            //设置是否下拉
            validation.setInCellDropDown(true);
            //设置校验类型
            validation.setType(ValidationType.LIST);
            //设置校验错误的提示信息 标题
            validation.setErrorTitle(errorTitle);
            //设置校验错误的提示信息 内容
            validation.setErrorMessage(errorMsg);
            //是否展示错误提示 是
            validation.setShowError(true);
            //设置警告风格
            validation.setAlertStyle(ValidationAlertType.STOP);
            //设置校验的区域 cellArea
            validation.addArea(cellArea);
        }
        return workbook;

    }

    /**
     * 获取前index个的加和
     *
     * @param integers
     * @param index
     * @return
     */
    private static int getSizeSum(List<Integer> integers, int index) {
        int m = 0;
        for (int i = 0; i < index + 1; i++) {
            m += integers.get(i);
        }
        return m;
    }

    /**
     * 获取上一次的加和
     *
     * @param integers
     * @return
     */
    private static int getSizeLastTime(List<Integer> integers) {
        int m = 0;
        for (int i = 0; i < integers.size() - 1; i++) {
            m += integers.get(i);
        }
        return m;
    }


    /**
     * 级联下拉数据格式 树形结构
     */
    static class DropDownData {
        String current;
        List<DropDownData> children;

        public DropDownData() {
        }

        public DropDownData(String current, List<DropDownData> children) {
            this.current = current;
            this.children = children;
        }

        public String getCurrent() {
            return current;
        }

        public void setCurrent(String current) {
            this.current = current;
        }

        public List<DropDownData> getChildren() {
            return children;
        }

        public void setChildren(List<DropDownData> children) {
            this.children = children;
        }

    }


    /**
     * 创建队列 没有指定大小 遍历第一层
     *
     * @param dropDownData
     * @return
     */
    public static Queue<DropDownData> createQueue(Queue<DropDownData> queue, List<DropDownData> dropDownData) {
        if (dropDownData == null || dropDownData.isEmpty()) {
            return null;
        }
        dropDownData.forEach(a -> {
            queue.offer(a);
        });
        return queue;
    }


}

参考案例1 使用三级下拉

Java使用bert JAVA使用easyexcel级联效果_后端

public static void main(String[] args) throws Exception {
        Workbook workbook = new Workbook();
        Worksheet worksheet = workbook.getWorksheets().get(0);
        List<DropDownData> dropDownData = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            DropDownData dropDownData1 = new DropDownData();
            dropDownData1.setCurrent("一级" + i);
            dropDownData.add(dropDownData1);

        }
        for (int i = 0; i < dropDownData.size(); i++) {
            List<DropDownData> dropDownData2 = new ArrayList<>();
            if (i < 5 || i == 9) {
                //测试大量数据
                for (int i1 = 0; i1 < 1000; i1++) {
                    DropDownData dropDownData1 = new DropDownData();
                    dropDownData1.setCurrent("二级" + i + i1);
                    dropDownData2.add(dropDownData1);
                }
                dropDownData.get(i).setChildren(dropDownData2);
            }
        }

        List<DropDownData> dropDownData3 = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            DropDownData dropDownData1 = new DropDownData();
            dropDownData1.setCurrent("三级测试二级一下拉" + i);
            dropDownData3.add(dropDownData1);
        }

        List<DropDownData> dropDownData4 = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            DropDownData dropDownData1 = new DropDownData();
            dropDownData1.setCurrent("三级测试二级四下拉" + i);
            dropDownData4.add(dropDownData1);
        }
        dropDownData.get(0).getChildren().get(0).setChildren(dropDownData3);
        dropDownData.get(0).getChildren().get(3).setChildren(dropDownData4);

        workbook = addDropDownValidationsToSheet(workbook, worksheet, dropDownData, 1, 100, "填写错误!", "请填入下拉值!", 'A', 'B', 'C');
        workbook.save("E:\\file01.xlsx");


    }

参考案列2 使用五级下拉

Java使用bert JAVA使用easyexcel级联效果_Java使用bert_02

//参考案列2 使用五级下拉
 public static void main(String[] args) throws Exception {
        Workbook workbook = new Workbook();
        Worksheet worksheet = workbook.getWorksheets().get(0);
        List<DropDownData> dropDownData1 = new ArrayList<>();
        /**
         * 四川省
         * 贵州省
         */
        String[] f1 = {
                "四川省",
                "贵州省",};
        for (String s : f1) {
            DropDownData dropDownData = new DropDownData();
            dropDownData.setCurrent(s);
            dropDownData1.add(dropDownData);
        }
        String[] f2 =
                {
                        "成都市",
                        "自贡市",
                        "攀枝花市",
                        "泸州市",
                        "德阳市",
                        "绵阳市",
                        "广元市",
                        "遂宁市",
                        "内江市",
                        "乐山市",
                        "南充市",
                        "眉山市",
                        "宜宾市",
                        "广安市",
                        "达州市",
                        "雅安市",
                        "巴中市",
                        "资阳市",
                        "阿坝藏族羌族自治州",
                        "甘孜藏族自治州",
                        "凉山彝族自治州",};

        List<DropDownData> dropDownData2 = new ArrayList<>();
        for (String s : f2) {
            DropDownData dropDownData = new DropDownData();
            dropDownData.setCurrent(s);
            dropDownData2.add(dropDownData);
        }
        dropDownData1.get(0).setChildren(dropDownData2);

        String[] f3 =
                {"市辖区",
                        "锦江区",
                        "青羊区",
                        "金牛区",
                        "武侯区",
                        "成华区",
                        "龙泉驿区",
                        "青白江区",
                        "新都区",
                        "温江区",
                        "双流区",
                        "郫都区",
                        "新津区",
                        "金堂县",
                        "大邑县",
                        "蒲江县",
                        "都江堰市",
                        "彭州市",
                        "邛崃市",
                        "崇州市",
                        "简阳市",};
        List<DropDownData> dropDownData3 = new ArrayList<>();
        for (String s : f3) {
            DropDownData dropDownData = new DropDownData();
            dropDownData.setCurrent(s);
            dropDownData3.add(dropDownData);
        }
        dropDownData1.get(0).getChildren().get(0).setChildren(dropDownData3);

        String[] f4 = {
                "锦官驿街道",
                "东湖街道",
                "锦华路街道",
                "春熙路街道",
                "书院街街道",
                "牛市口街道",
                "沙河街道",
                "狮子山街道",
                "成龙路街道",
                "柳江街道",
                "三圣街道",};
        List<DropDownData> dropDownData4 = new ArrayList<>();
        for (String s : f4) {
            DropDownData dropDownData = new DropDownData();
            dropDownData.setCurrent(s);
            dropDownData4.add(dropDownData);
        }
        dropDownData1.get(0).getChildren().get(0).getChildren().get(1).setChildren(dropDownData4);


        String[] f5 = {
                "水井坊社区居委会",
                "崇德里社区居委会",
                "合江亭社区居委会",
                "大慈寺社区居委会",
                "点将台社区居委会",
                "交子社区居委会",};
        List<DropDownData> dropDownData5 = new ArrayList<>();
        for (String s : f3) {
            DropDownData dropDownData = new DropDownData();
            dropDownData.setCurrent(s);
            dropDownData5.add(dropDownData);
        }
        dropDownData1.get(0).getChildren().get(0).getChildren().get(1).getChildren().get(0).setChildren(dropDownData5);


        workbook = addDropDownValidationsToSheet(workbook, worksheet, dropDownData1, 1, 100, "填写错误!", "请填入下拉值!", 'A', 'B', 'C', 'D', 'E');
        workbook.save("E:\\myTest\\file02.xlsx");
    }

创作不易,请打赏点赞