一、概述
同学们新年快乐,好久不见,甚是想念。今天带大家了解一个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可以参考其他教程学习,请先了解后再看下面内容,后面会有完整代码。
- 创建验证内容对象;
- 创建单元格范围对象(指定范围:通常是一列);
- 使用验证内容对象和校验范围对象创建验证规则对象,可以设置错误提示内容;
- 将规则对象添加到工作表。
关键代码如下:(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;
}
}
效果
(完~)