Java使用POI生成带验证数据的Excel(POI创建带下拉数据的单元格)

本文介绍了如何使用Java的Apache POI库为Excel表格添加数据验证,以限制用户输入,例如在性别和身份字段实现下拉选择。通过创建Excel模板并设置单元格的数据验证规则,可以确保用户只能从预定义的选项中选择,从而提高数据质量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概述

同学们新年快乐,好久不见,甚是想念。今天带大家了解一个Java常用的工具库POI的使用细节。

POI的教程确实已经烂大街了, 百度一搜一把,这里对POI的使用不做过多的介绍,使用步骤比较固定就是那几步比较简单。今天说说实际项目中的一个痛点场景:用户使用Excel上传数据,做过类似需求的同学应该知道,用户输入的东西根本不可控,经常一顿乱输入,后台对数据校验做的再好,也不能完美解决。这里可以通过给Excel添加数据验证功能单元格下拉选择数据),避免用户的无效输入。

二、添加POI依赖

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.0</version>
</dependency>

三、使用

POI的基础使用:创建工作簿、创建工作表、创建行、创建单元格、设置样式、生成Excel文件的API可以参考其他教程学习,请先了解后再看下面内容,后面会有完整代码。

  1. 创建验证内容对象;
  2. 创建单元格范围对象(指定范围:通常是一列);
  3. 使用验证内容对象和校验范围对象创建验证规则对象,可以设置错误提示内容;
  4. 将规则对象添加到工作表。

关键代码如下:(validData是需要验证的字符串数组,index是的第几列索引)

// 设置验证数据内容
DVConstraint constraint = DVConstraint.createExplicitListConstraint(validData);
// 设置需要验证的单元格范围(范围:1-60000行的第几列到第几列设置)
CellRangeAddressList rangeAddressList = new CellRangeAddressList(1, 60000, index, index);
// 创建数据验证规则对象
DataValidation dataValidation = new HSSFDataValidation(rangeAddressList, constraint);
// 设置验证对象错误提示内容
dataValidation.createErrorBox("error", "请选择正确的数据");
// 将工作表添加验证对象
sheet.addValidationData(dataValidation);

四、实践

需求:创建个人信息的Excel模板,里面的性别和身份需要设置可下拉的验证数据

代码比较简单直接上完整代码

public class ExcelTest {

    public static void main(String[] args) throws IOException {
        ExcelTest test = new ExcelTest();
        test.createExcel();
    }

    public void createExcel() throws IOException {
        //创建工作簿对象
        HSSFWorkbook wb = new HSSFWorkbook();
        // 创建工作表
        HSSFSheet sheet = wb.createSheet("个人信息");
        // 设置默认列宽
        sheet.setDefaultColumnWidth(18);

        // 表头数据
        String[] tileList = new String[]{"姓名", "年龄", "性别", "身份"};

        // 创建表头行-并设置表头内容
        HSSFRow row = sheet.createRow(0);
        // 创建样式
        HSSFCellStyle style = getHeaderStyle(wb);
        HSSFCell cell = null;
        for (int i = 0; i < tileList.length; i++) {
            String title = tileList[i];
            // 创建单元格
            cell = row.createCell(i);
            // 设置单元格内容
            cell.setCellValue(title);
            // 设置单元格样式
            cell.setCellStyle(style);
        }

        // ***********下面是重点********
        // 设置性别下拉数据
        String[] sixData = {"男", "女", "不男不女", "其他"};
        // 添加数据验证
        setDataValid(sheet, sixData, 2);

        // 设置身份下拉数据
        String[] faceData = {"高富帅", "白富美", "矮穷帅", "黑穷美", "矮穷丑"};
        // 添加数据验证
        setDataValid(sheet, faceData, 3);
        // ***********上面是重点********

        FileOutputStream out = new FileOutputStream(new File("D:\\123.xls"));
        wb.write(out);
        wb.close();

    }

    private void setDataValid(HSSFSheet sheet, String[] validData, int index) {
        // 设置验证数据内容
        DVConstraint constraint = DVConstraint.createExplicitListConstraint(validData);
        // 设置需要验证的单元格范围(范围:1-60000行的第几列到第几列设置)
        CellRangeAddressList rangeAddressList = new CellRangeAddressList(1, 60000, index, index);
        // 创建数据验证规则对象
        DataValidation dataValidation = new HSSFDataValidation(rangeAddressList, constraint);
        // 设置验证对象错误提示内容
        dataValidation.createErrorBox("error", "请选择正确的数据");
        // 将工作表添加验证对象
        sheet.addValidationData(dataValidation);
    }

    // 设置单元格样式
    private static HSSFCellStyle getHeaderStyle(HSSFWorkbook wb) {
        HSSFCellStyle cellStyle = wb.createCellStyle();
        cellStyle.setAlignment(HorizontalAlignment.CENTER);//水平居中
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
        //cellStyle.setWrapText(true);//自动换行

        HSSFFont font = wb.createFont();
        font.setFontName("宋体");//设置字体名称
        font.setFontHeightInPoints((short) 12);//字体大小
        font.setBold(true);
        cellStyle.setFont(font);
        return cellStyle;
    }


}

效果

(完~)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值