一、概述
同学们新年快乐,好久不见,甚是想念。今天带大家了解一个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; }}
效果
(完~)