jar包
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;
}
}