You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Java如何直接读取Excel表单控件(单选框、复选框等)的值?

在Java中用Apache POI直接读取Excel表单控件的值

我之前也踩过这个坑,Apache POI对Excel表单控件的直接读取支持确实不算直观,不过折腾了一阵后还是找到了可行的方案,下面分不同控件类型给你详细说明:

一、单选按钮(Radio Button)

单选按钮在POI中对应XSSFRadioButton(.xlsx格式)或HSSFRadioButton(.xls格式),可以通过遍历工作表的控件集合来获取,直接读取其选中状态:

import org.apache.poi.xssf.usermodel.*;
import java.io.FileInputStream;
import java.io.IOException;

public class ReadRadioButtons {
    public static void main(String[] args) throws IOException {
        XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream("your-file.xlsx"));
        XSSFSheet sheet = workbook.getSheetAt(0);

        // 遍历工作表中的所有控件
        for (XSSFControl control : sheet.getControls()) {
            if (control instanceof XSSFRadioButton) {
                XSSFRadioButton radioBtn = (XSSFRadioButton) control;
                System.out.println("单选按钮文本: " + radioBtn.getText());
                System.out.println("是否选中: " + radioBtn.isSelected());
                // 可选:获取关联的单元格(如果有的话)
                System.out.println("关联单元格: " + radioBtn.getLinkedCellReference());
            }
        }
        workbook.close();
    }
}

二、复选框(Checkbox)

复选框的处理逻辑和单选按钮类似,对应XSSFCheckboxHSSFCheckbox,可以直接读取选中状态:

import org.apache.poi.xssf.usermodel.*;
import java.io.FileInputStream;
import java.io.IOException;

public class ReadCheckboxes {
    public static void main(String[] args) throws IOException {
        XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream("your-file.xlsx"));
        XSSFSheet sheet = workbook.getSheetAt(0);

        for (XSSFControl control : sheet.getControls()) {
            if (control instanceof XSSFCheckbox) {
                XSSFCheckbox checkbox = (XSSFCheckbox) control;
                System.out.println("复选框文本: " + checkbox.getText());
                System.out.println("是否选中: " + checkbox.isSelected());
                System.out.println("关联单元格: " + checkbox.getLinkedCellReference());
            }
        }
        workbook.close();
    }
}

三、下拉列表(Dropdown List)

这里要分两种情况:一种是表单控件类型的下拉列表XSSFComboBox),另一种是通过数据验证创建的下拉列表。

1. 表单控件下拉列表

直接读取控件的选项和关联单元格的选中值:

import org.apache.poi.xssf.usermodel.*;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;

public class ReadComboBoxes {
    public static void main(String[] args) throws IOException {
        XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream("your-file.xlsx"));
        XSSFSheet sheet = workbook.getSheetAt(0);

        for (XSSFControl control : sheet.getControls()) {
            if (control instanceof XSSFComboBox) {
                XSSFComboBox comboBox = (XSSFComboBox) control;
                System.out.println("下拉列表文本: " + comboBox.getText());

                // 获取下拉选项集合
                XSSFDataValidation dataValidation = comboBox.getDataValidation();
                if (dataValidation != null) {
                    XSSFDataValidationConstraint constraint = dataValidation.getValidationConstraint();
                    if (constraint.getValidationType() == XSSFDataValidationConstraint.LIST_TYPE) {
                        String[] options = constraint.getExplicitListValues();
                        System.out.println("下拉选项: " + Arrays.toString(options));
                    }
                }

                // 获取当前选中的值(表单控件的选中值实际存储在关联单元格中)
                XSSFCell linkedCell = sheet.getRow(comboBox.getLinkedCellReference().getRow())
                        .getCell(comboBox.getLinkedCellReference().getCol());
                if (linkedCell != null) {
                    System.out.println("当前选中值: " + linkedCell.getStringCellValue());
                }
            }
        }
        workbook.close();
    }
}

2. 数据验证下拉列表

如果是通过Excel的数据验证功能创建的下拉列表,需要遍历工作表的数据验证规则来获取:

import org.apache.poi.xssf.usermodel.*;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;

public class ReadDataValidationDropdowns {
    public static void main(String[] args) throws IOException {
        XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream("your-file.xlsx"));
        XSSFSheet sheet = workbook.getSheetAt(0);

        // 遍历数据验证规则
        for (XSSFDataValidation dv : sheet.getDataValidations()) {
            XSSFDataValidationConstraint constraint = dv.getValidationConstraint();
            if (constraint.getValidationType() == XSSFDataValidationConstraint.LIST_TYPE) {
                String[] options = constraint.getExplicitListValues();
                System.out.println("数据验证下拉选项: " + Arrays.toString(options));

                // 获取该数据验证应用的单元格范围
                for (XSSFDataValidationConstraint.ValidationCellAddress cellAddr : dv.getValidationCellAddresses()) {
                    XSSFCell cell = sheet.getRow(cellAddr.getRow()).getCell(cellAddr.getCol());
                    if (cell != null) {
                        System.out.println("单元格 " + cellAddr.formatAsString() + " 的选中值: " + cell.getStringCellValue());
                    }
                }
            }
        }
        workbook.close();
    }
}

注意事项

  • 建议使用Apache POI 4.1.2及以上的稳定版本,旧版本对表单控件的支持存在较多bug,可能无法正确读取控件状态。
  • 如果遍历sheet.getControls()找不到目标控件,可以尝试遍历工作表的绘图形状:
    for (XSSFShape shape : sheet.getDrawingPatriarch().getShapes()) {
        if (shape instanceof XSSFControlShape) {
            XSSFControl control = ((XSSFControlShape) shape).getControl();
            // 后续处理逻辑和之前一致
        }
    }
    
  • 部分旧版本Excel保存的文件,控件的选中状态可能仅同步到关联单元格,这种情况下还是需要结合读取单元格的方式来获取值。

内容的提问来源于stack exchange,提问作者user1302909

火山引擎 最新活动