poi操作excel下拉框联动

jar包
poi操作excel下拉框联动_第1张图片

package cn.kk.excel.city;

import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.io.FileUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.DataValidation;
import org.apache.poi.ss.usermodel.DataValidationConstraint;
import org.apache.poi.ss.usermodel.DataValidationHelper;
import org.apache.poi.ss.usermodel.Name;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddressList;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ExcelCityChange {
	public static void main(String[] args) {
		String file = "d:/excel021.xlsx";
		try {
			excelChange(file);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static void excelChange(String path) throws IOException {
		File file = new File(path);

		// 判断文件是否存在
		if (!file.exists()) {
			// 创建文件
			file.createNewFile();
		}

		Workbook workBook = null;

		// 根据文件名称后缀,创建excel模板
		if (file.getName().endsWith(".xls")) {
			workBook = new HSSFWorkbook();// .xls后缀模板
		} else if (file.getName().endsWith(".xlsx")) {
			workBook = new XSSFWorkbook();// .xlsx后缀模板
		}

		// 创建工作薄
		Sheet sheet = workBook.createSheet("sheet1");
		
//		设置表头
		Row row = sheet.createRow(0);
		row.createCell(0).setCellValue("省份");
		row.createCell(1).setCellValue("城市");
		row.createCell(2).setCellValue("县城");
		
//		省份
		String[] provinces = {"福建省","广东省"};
		
		setCitys(provinces,workBook);
		
		setCityChangeVals(provinces,workBook,sheet,path);
	
		
//		把excel写入到文件中
		OutputStream out = FileUtils.openOutputStream(file);
		workBook.write(out);
		out.close();
	}

	private static void setCitys(String[] provinces,Workbook workBook) {
		Sheet sheet = workBook.createSheet("联动信息");
		
//		城市
		String[] fuJianCitys = {"莆田市","厦门市","泉州市"};
		String[] guangDongCitys = {"珠海市","东莞市","惠州市"};
		
//		县城
		String[] puTianCountys = {"仙游县"};
		String[] xiaMenCountys = {"厦门"};
		String[] quanZhouCountys = {"惠安县","永春县","德化县"};
		String[] zhuHaiCountys = {"珠海"};
		String[] dongGuanCountys = {"东莞"};
		String[] huiZhouCountys = {"惠东县","龙门县","博罗县"};
		
		Map areaMap = new HashMap();
		areaMap.put("福建省", fuJianCitys);
		areaMap.put("广东省", guangDongCitys);
		areaMap.put("莆田市", puTianCountys);
		areaMap.put("厦门市", xiaMenCountys);
		areaMap.put("泉州市", quanZhouCountys);
		areaMap.put("珠海市", zhuHaiCountys);
		areaMap.put("东莞市", dongGuanCountys);
		areaMap.put("惠州市", huiZhouCountys);
		
		int rowCount = 0;//行数
		Row row = sheet.createRow(rowCount++);
		
		for (int i = 0; i < provinces.length; i++) {
			row.createCell(i).setCellValue(provinces[i]);
		}
		
		int i = 0;
		for (String key : areaMap.keySet()) {
			Row createRow = sheet.createRow(rowCount++);
			if (i == 0) {
				createRow.createCell(0).setCellValue(key);
				i++;
			}
			String[] values = areaMap.get(key);
			if (i > 0){
				for (String val : values) {
					createRow.createCell(i++).setCellValue(val);
				}
				i = 0;
			}
			
			// 添加名称管理器
			String range = getRange(1, rowCount, values.length);
			Name name = workBook.createName();
			// key不可重复,将父区域名作为key
			name.setNameName(key);
//			名称管理器引用数据位置
			String formula = "联动信息!" + range;
			name.setRefersToFormula(formula);
		}
	}
	/**
	 * 设置联动信息
	 * @param sheet
	 */
	private static void setCityChangeVals(String[] provinces,Workbook workBook,Sheet sheet,String file) {
		
		DataValidationHelper helper = sheet.getDataValidationHelper();
		// 设置下拉框选项的值
		DataValidationConstraint constraint = helper.createExplicitListConstraint(provinces);
//			设置下拉框位置
		CellRangeAddressList provRangeAddressList = new CellRangeAddressList(1, 10, 0, 0);
		DataValidation dataValidation = helper.createValidation(constraint, provRangeAddressList);
//			.xls后缀不用设置
		if (file.endsWith(".xlsx")) {
//				设置开启错误提示
			dataValidation.setShowErrorBox(true);
//				设置提示信息
			dataValidation.setShowPromptBox(true);
		}
		dataValidation.createErrorBox("错误提示","请从下拉框中选择");
		dataValidation.createPromptBox("提示","输入时提示信息");
		sheet.addValidationData(dataValidation);
		
		//设置有效性
		for(int j = 2;j < 10;j++){
			setDataValidation(file,"A" ,sheet,j,2);
			setDataValidation(file,"B" ,sheet,j,3);
		}
	}
	
	 /**
     * 设置有效性
     * @param start 主影响单元格所在列,即此单元格由哪个单元格影响联动
     * @param sheet
     * @param rowNum 行数
     * @param colNum 列数
     */
	private static void setDataValidation(String file, String start, Sheet sheet, int rowNum, int colNum) {
		// TODO Auto-generated method stub
		DataValidationHelper helper = sheet.getDataValidationHelper();
        DataValidation data_validation_list;
        data_validation_list = getDataValidationByFormula(file, "INDIRECT($" + (start + rowNum) + ")", rowNum, colNum,helper);
        sheet.addValidationData(data_validation_list);
	}
	
	/**
     * 加载下拉列表内容
     * @param formulaString
     * @param naturalRowIndex
     * @param naturalColumnIndex
     * @param dvHelper
     * @return
     */
	private static DataValidation getDataValidationByFormula(String file, String string, int rowNum, int colNum,
			DataValidationHelper helper) {
		// 加载下拉列表内容
        // 举例:若string = "INDIRECT($A$2)" 表示规则数据会从名称管理器中获取key与单元格 A2 值相同的数据,
		DataValidationConstraint constraint = helper.createFormulaListConstraint(string);
		
		int firstRow = rowNum -1;
        int lastRow = rowNum - 1;
        int firstCol = colNum - 1;
        int lastCol = colNum - 1;
		CellRangeAddressList regions = new CellRangeAddressList(firstRow,lastRow, firstCol, lastCol);
		
		DataValidation data_validation_list = helper.createValidation(constraint, regions);
//        data_validation_list.setEmptyCellAllowed(false);
        
        if (file.endsWith(".xlsx")) {
//			设置开启错误提示
			data_validation_list.setShowErrorBox(true);
//			设置提示信息
			data_validation_list.setShowPromptBox(true);
		}
        
        // 设置输入信息提示信息
        data_validation_list.createPromptBox("下拉选择提示", "请使用下拉方式选择合适的值!");
        // 设置输入错误提示信息
        //data_validation_list.createErrorBox("选择错误提示", "你输入的值未在备选列表中,请下拉选择合适的值!");
        return data_validation_list;
	}
	/**
	 * 
	 * @param start 偏移量,如果给0,表示从A列开始,1,就是从B列
	 * @param rowNum 第几行
	 * @param colCount 一共多少列
	 * @return 如果给入参 1,1,10. 表示从B1-K1。最终返回 $B$1:$K$1
	 */
	private static String getRange(int start, int rowNum, int colCount) {
//		开始列
		char rowStart = (char) ('A' + start);
		char end = (char) (rowStart + colCount - 1);
		return "$" + rowStart + "$" + rowNum + ":$" + end + "$" + rowNum;
	}
}

你可能感兴趣的:(java)