Java Excel省市区级联菜单设置

java实现导出省市区三级联动下拉excel 阅读详情

主要解决使用POI写excel,并且添加数据校验,以及省市区级联菜单设置,分Excel2003与Excel2007两个版本。

关于POI与Excel之间的一些关系,以及设计方面的一些思想说明:

      Java是一个面向对象的语言,在Java中用对象表达所有的事物,用对象来描述事物之间的关系。一个Excel文件其实可以分解成很多的对象,例如整个Excel就是一个大对象,然后分解之后可以看作是一个个SHEET对象组合起来的,接着SHEET对象又是由行对象ROW组合起来的,行对象又是由CELL对象组合起来的,等等。

      如果你想设置字体或者样式,那么有字体Font对象,将字体应用到单元格上,那么那个单元格就会使用什么字体了, 还有样式例如单元格边框,或者说前景色等就是样式对象Style控制的。

      如果你想加一点校验,这又该怎么解决呢?excel那么多单元格总不能全部添加同一种规则吧,所以需要一个表示范围的对象。即规则应用范围对象:CellRangeAddressList。范围有了,但是规则呢?所以还需要一个规则对象:DataValidationConstraint。我们将范围与规则组合在一起,应用到某个Sheet页上就完成了某一个Sheet页,指定单元格的数据校验了。

下面给了一个简答的示例图,可以帮助理解,该图对应是的2003版本的excel:


1、关于如何使用POI写2007的Excel

      以下主要介绍关于如何设置字体样式,单个单元格的数据校验,以及省市区级联菜单的设置。
1.1、Excel2007字体样式的设置
@Test
// 关于2007版本的样式设置
public void testSetStyle2007() {
	// 创建一个excel
	Workbook book = new XSSFWorkbook();
	// 在创建的excel上新建一个工作表,创建行,创建一个单元格,并设置单元格的值
	Sheet sheet = book.createSheet("第一张工作表");
	// 设置列宽,第一个参数代表列id(从0开始),第2个参数代表宽度值 参考 :"2012-08-10"的宽度为2500
	sheet.setColumnWidth(1, 7000);
	
	Row row = sheet.createRow(0);
	
	// 获取样式
	CellStyle style = book.createCellStyle();
	// 一、设置背景色:
	style.setFillForegroundColor((short)13);// 设置背景色
	style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
	
	// 二、设置边框:
	style.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 下边框
	style.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 左边框
	style.setBorderTop(HSSFCellStyle.BORDER_THIN);// 上边框
	style.setBorderRight(HSSFCellStyle.BORDER_THIN);// 右边框
	
	// 三、设置居中:
	style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中
	
	// 设置字体 1
	Font font = book.createFont();
	font.setFontName("微软雅黑");
	font.setFontHeightInPoints((short)10);// 设置字体大小
	
	style.setFont(font);// 选择需要用到的字体格式
	
	// 设置字体 2
	Font font2 = book.createFont();
	font2.setFontName("微软雅黑");
	font2.setColor(Font.COLOR_RED);
	font2.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 粗体显示
	font2.setFontHeightInPoints((short)12);
	
	// 如果单元格只有部分字体需要格式
	Cell cell = row.createCell(0);
	RichTextString text = new XSSFRichTextString("*社区名称");
	text.applyFont(0, 1, font2); // 0, 1 表示应用字体的范围
	cell.setCellValue(text); // 设置单元格的值
	
	// 将style应用到整个单元格
	cell = row.createCell(1);
	cell.setCellStyle(style);
	cell.setCellValue("管理面积(平方米)");
	
	FileOutputStream os = null;
	try {
		os = new FileOutputStream("D:/testSetStyle2007.xlsx");
		book.write(os);
	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		IOUtils.closeQuietly(os);
	}
}
      上面给出了关于2007版本中字体样式的的设置,如果仅仅只是想一部分应用样式,则可以使用RichTextString类。具体效果如下图:

1.2、Excel2007单元格数据校验
      单元格的数据校验分为两种,第一种为下拉式的给定范围,输入只能是范围中的选项。另外一种为数据校验,例如时间只能是某个范围内的,或者说数据只能是整数小数等。
@Test
// 单个单元格校验
public void testConstraintExcel2007() {
	Workbook book = new XSSFWorkbook();
	Sheet sheet = book.createSheet("第一张工作表");
	
	XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper((XSSFSheet)sheet);
	
	// 这里校验值准入输入0-100之间整数
	// 规则
	DataValidationConstraint dvConstraint = dvHelper.createIntegerConstraint(OperatorType.BETWEEN, "0", "100");
	
	// 范围
	CellRangeAddressList rangeAddressList = new CellRangeAddressList(0, 10, 0, 0);
	// 范围 + 规则
	DataValidation validation = dvHelper.createValidation(dvConstraint, rangeAddressList);
	validation.createErrorBox("error", "你必须输入一个整数");
	validation.setShowErrorBox(true);
	validation.setSuppressDropDownArrow(true);
	// 应用时间校验规则
	sheet.addValidationData(validation);
	
	// 下拉式校验这里需要调用setShowErrorBox,否则可能填错数据没有弹窗告警
	String[] provList = new String[] {"安徽省", "浙江省", "山西省"};
	DataValidationConstraint provConstraint = dvHelper.createExplicitListConstraint(provList);
	CellRangeAddressList provRangeAddressList = new CellRangeAddressList(0, 10, 1, 1);
	DataValidation provinceDataValidation = dvHelper.createValidation(provConstraint, provRangeAddressList);
	provinceDataValidation.createErrorBox("error", "请选择正确的省份");
	provinceDataValidation.setShowErrorBox(true);
	provinceDataValidation.setSuppressDropDownArrow(true);
	sheet.addValidationData(provinceDataValidation);
	
	FileOutputStream os = null;
	try {
		os = new FileOutputStream("D:/testConstraintExcel2007.xlsx");
		
		book.write(os);
	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		IOUtils.closeQuietly(os);
	}
}
      最终的效果如下,如果输入的数据异常,则提示说必须输入一个整数。具体效果如下:
1.3、省市区级联菜单的实现
      在Excel中有个东东叫做名称管理器,他类似于Java中的Map这种数据结构,根据Key就可以获取到Value了。级联操作的做法是首先我们将所有的省市区的信息按照一定的规则存到一个Sheet页中,我的存放规则是第一列存放Key,一个区域名称,之后的所有列存放该区域下的子区域名称。然后制作名称管理器,最后将该Sheet页隐藏起来。如果你要实现该功能,最好先学会如何在Excel中制作级联菜单。
@Test
public void testCascade2007() {
	// 查询所有的省名称
	List<String> provNameList = new ArrayList<String>();
	provNameList.add("安徽省");
	provNameList.add("浙江省");

	// 整理数据,放入一个Map中,mapkey存放父地点,value 存放该地点下的子区域
	Map<String, List<String>> siteMap = new HashMap<String, List<String>>();
	siteMap.put("浙江省", Lists.newArrayList("杭州市", "宁波市"));
	siteMap.put("安徽省", Lists.newArrayList("芜湖市", "滁州市"));
	siteMap.put("芜湖市", Lists.newArrayList("戈江区", "三山区"));
	siteMap.put("滁州市", Lists.newArrayList("来安县", "凤阳县"));

	// 创建一个excel
	Workbook book = new XSSFWorkbook();
	
	// 创建需要用户填写的数据页
	// 设计表头
	Sheet sheet1 = book.createSheet("sheet1");
	Row row0 = sheet1.createRow(0);
	row0.createCell(0).setCellValue("省");
	row0.createCell(1).setCellValue("市");
	row0.createCell(2).setCellValue("区");
	
	//创建一个专门用来存放地区信息的隐藏sheet页
	//因此也不能在现实页之前创建,否则无法隐藏。
	Sheet hideSheet = book.createSheet("site");
	book.setSheetHidden(book.getSheetIndex(hideSheet), true);

	int rowId = 0;
	// 设置第一行,存省的信息
	Row proviRow = hideSheet.createRow(rowId++);
	proviRow.createCell(0).setCellValue("省列表");
	for(int i = 0; i < provNameList.size(); i ++){
		Cell proviCell = proviRow.createCell(i + 1);
		proviCell.setCellValue(provNameList.get(i));
	}
	// 将具体的数据写入到每一行中,行开头为父级区域,后面是子区域。
	Iterator<String> keyIterator = siteMap.keySet().iterator();
	while(keyIterator.hasNext()){
		String key = keyIterator.next();
		List<String> son = siteMap.get(key);
		
		Row row = hideSheet.createRow(rowId++);
		row.createCell(0).setCellValue(key);
		for(int i = 0; i < son.size(); i ++){
			Cell cell = row.createCell(i + 1);
			cell.setCellValue(son.get(i));
		}
		
		// 添加名称管理器
		String range = getRange(1, rowId, son.size());
		Name name = book.createName();
		name.setNameName(key);
		String formula = "site!" + range;
		name.setRefersToFormula(formula);
	}
	
	XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper((XSSFSheet)sheet1);
	
	// 省规则
	DataValidationConstraint provConstraint = dvHelper.createExplicitListConstraint(provNameList.toArray(new String[]{}));
	CellRangeAddressList provRangeAddressList = new CellRangeAddressList(1, 1, 0, 0);
	DataValidation provinceDataValidation = dvHelper.createValidation(provConstraint, provRangeAddressList);
	provinceDataValidation.createErrorBox("error", "请选择正确的省份");
	provinceDataValidation.setShowErrorBox(true);
	provinceDataValidation.setSuppressDropDownArrow(true);
	sheet1.addValidationData(provinceDataValidation);
	
	
	// 市以规则,此处仅作一个示例
	// "INDIRECT($A$" + 2 + ")" 表示规则数据会从名称管理器中获取key与单元格 A2 值相同的数据,如果A2是浙江省,那么此处就是
	// 浙江省下的区域信息。
	DataValidationConstraint formula = dvHelper.createFormulaListConstraint("INDIRECT($A$" + 2 + ")");
	CellRangeAddressList rangeAddressList = new CellRangeAddressList(1,10,1,1);
	DataValidation cacse = dvHelper.createValidation(formula, rangeAddressList);
	cacse.createErrorBox("error", "请选择正确的市");
	sheet1.addValidationData(cacse);
	
	// 区规则
	formula = dvHelper.createFormulaListConstraint("INDIRECT($B$" + 2 + ")");
	rangeAddressList = new CellRangeAddressList(1,10,2,2);
	cacse = dvHelper.createValidation(formula, rangeAddressList);
	cacse.createErrorBox("error", "请选择正确的区");
	sheet1.addValidationData(cacse);
	
	
	FileOutputStream os = null;
	try {
        os = new FileOutputStream("D:/testCascade2007.xlsx");
        book.write(os);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
    	IOUtils.closeQuietly(os);
    }
}

/**
 * 
 * @param offset 偏移量,如果给0,表示从A列开始,1,就是从B列
 * @param rowId 第几行
 * @param colCount 一共多少列
 * @return 如果给入参 1,1,10. 表示从B1-K1。最终返回 $B$1:$K$1
 * 
 * @author denggonghai 2016年8月31日 下午5:17:49
 */
public String getRange(int offset, int rowId, int colCount) {
	char start = (char)('A' + offset);
	if (colCount <= 25) {
		char end = (char)(start + colCount - 1);
		return "$" + start + "$" + rowId + ":$" + end + "$" + rowId;
	} else {
		char endPrefix = 'A';
		char endSuffix = 'A';
		if ((colCount - 25) / 26 == 0 || colCount == 51) {// 26-51之间,包括边界(仅两次字母表计算)
			if ((colCount - 25) % 26 == 0) {// 边界值
				endSuffix = (char)('A' + 25);
			} else {
				endSuffix = (char)('A' + (colCount - 25) % 26 - 1);
			}
		} else {// 51以上
			if ((colCount - 25) % 26 == 0) {
				endSuffix = (char)('A' + 25);
				endPrefix = (char)(endPrefix + (colCount - 25) / 26 - 1);
			} else {
				endSuffix = (char)('A' + (colCount - 25) % 26 - 1);
				endPrefix = (char)(endPrefix + (colCount - 25) / 26);
			}
		}
		return "$" + start + "$" + rowId + ":$" + endPrefix + endSuffix + "$" + rowId;
	}
}
      最终的效果如下图:

2、关于如何使用POI写2003的Excel

2.1、样式的调整
      样式部分与2007没有什么大的区别,只是替换了部分实现类而已。
@Test
public void testSetStyle2003() {
	// 创建一个excel
	Workbook book = new HSSFWorkbook();
	// 在创建的excel上新建一个工作表,创建行,创建一个单元格,并设置单元格的值
	Sheet sheet = book.createSheet("第一张工作表");
	// 设置列宽,第一个参数代表列id(从0开始),第2个参数代表宽度值 参考 :"2012-08-10"的宽度为2500
	sheet.setColumnWidth(1, 7000);
	
	Row row = sheet.createRow(0);
	
	// 获取样式
	CellStyle style = book.createCellStyle();
	// 一、设置背景色:
	style.setFillForegroundColor((short)13);// 设置背景色
	style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
	
	// 二、设置边框:
	style.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 下边框
	style.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 左边框
	style.setBorderTop(HSSFCellStyle.BORDER_THIN);// 上边框
	style.setBorderRight(HSSFCellStyle.BORDER_THIN);// 右边框
	
	// 三、设置居中:
	style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中
	
	// 设置字体 1
	Font font = book.createFont();
	font.setFontName("微软雅黑");
	font.setFontHeightInPoints((short)10);// 设置字体大小
	
	style.setFont(font);// 选择需要用到的字体格式
	
	// 设置字体 2
	Font font2 = book.createFont();
	font2.setFontName("微软雅黑");
	font2.setColor(Font.COLOR_RED);
	font2.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 粗体显示
	font2.setFontHeightInPoints((short)12);
	
	// 如果单元格只有部分字体需要格式
	Cell cell = row.createCell(0);
	RichTextString text = new HSSFRichTextString("*社区名称");
	text.applyFont(0, 1, font2); // 0, 1 表示应用字体的范围
	cell.setCellValue(text); // 设置单元格的值
	
	// 将style应用到整个单元格
	cell = row.createCell(1);
	cell.setCellStyle(style);
	cell.setCellValue("管理面积(平方米)");
	
	FileOutputStream os = null;
	try {
		os = new FileOutputStream("D:/testSetStyle2003.xls");
		
		book.write(os);
	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		IOUtils.closeQuietly(os);
	}
}
2.2、单元格的数据校验
@Test
public void testConstraintExcel2003() {
	Workbook book = new HSSFWorkbook();
	Sheet sheet = book.createSheet("第一张工作表");
	
	// 只能输入时间,范围在2000年到2020年
	// 规则
	DVConstraint dateConstraint = DVConstraint.createDateConstraint(DataValidationConstraint.OperatorType.BETWEEN,
	        "2000-01-01", "2020-01-01", "yyyy-Mm-dd");
	// 范围
	CellRangeAddressList rangeAddressList = new CellRangeAddressList(0, 10, 0, 0);
	// 范围 + 规则
	DataValidation dataValidation = new HSSFDataValidation(rangeAddressList, dateConstraint);
	dataValidation.createErrorBox("error", "你必须输入一个日期");
	
	// 应用时间校验规则
	sheet.addValidationData(dataValidation);
	
	// 下拉式校验
	String[] provList = new String[] {"安徽省", "浙江省", "山西省"};
	DVConstraint provConstraint = DVConstraint.createExplicitListConstraint(provList);
	CellRangeAddressList provRangeAddressList = new CellRangeAddressList(0, 10, 1, 1);
	DataValidation provinceDataValidation = new HSSFDataValidation(provRangeAddressList, provConstraint);
	provinceDataValidation.createErrorBox("error", "请选择正确的省份");
	sheet.addValidationData(provinceDataValidation);
	
	FileOutputStream os = null;
	try {
		os = new FileOutputStream("D:/testConstraintExcel2003.xls");
		
		book.write(os);
	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		IOUtils.closeQuietly(os);
	}
}
2.3、级联菜单设置
@Test
// 2003 版本的级联测试
public void testCascade2003() {
	// 查询所有的省名称
	List<String> provNameList = new ArrayList<String>();
	provNameList.add("安徽省");
	provNameList.add("浙江省");

	// 整理数据,放入一个Map中,mapkey存放父地点,value 存放该地点下的子区域
	Map<String, List<String>> siteMap = new HashMap<String, List<String>>();
	siteMap.put("浙江省", Lists.newArrayList("杭州市", "宁波市"));
	siteMap.put("安徽省", Lists.newArrayList("芜湖市", "滁州市"));
	siteMap.put("芜湖市", Lists.newArrayList("戈江区", "三山区"));
	siteMap.put("滁州市", Lists.newArrayList("来安县", "凤阳县"));
	
	// 创建一个excel
	Workbook book = new HSSFWorkbook();
	
	// 创建一个专门用来存放地区信息的隐藏sheet页
	Sheet hideSheet = book.createSheet("site_sheet");
	book.setSheetHidden(book.getSheetIndex("site_sheet"), true);
	
	int rowId = 0;
	// 设置第一行,存省的信息
	Row proviRow = hideSheet.createRow(rowId++);
	proviRow.createCell(0).setCellValue("省列表");
	for (int i = 0; i < provNameList.size(); i++) {
		Cell proviCell = proviRow.createCell(i + 1);
		proviCell.setCellValue(provNameList.get(i));
	}
	// 将具体的数据写入到每一行中,行开头为父级区域,后面是子区域。
	Iterator<String> keyIterator = siteMap.keySet().iterator();
	while (keyIterator.hasNext()) {
		String key = keyIterator.next();
		List<String> son = siteMap.get(key);
		
		Row row = hideSheet.createRow(rowId++);
		row.createCell(0).setCellValue(key);
		for (int i = 0; i < son.size(); i++) {
			Cell cell = row.createCell(i + 1);
			cell.setCellValue(son.get(i));
		}
		
		// 添加名称管理器
		String range = getRange(1, rowId, son.size());
		Name name = book.createName();
		name.setNameName(key);
		String formula = "site_sheet!" + range;
		name.setRefersToFormula(formula);
	}
	
	// 创建需要用户填写的数据页
	// 设计表头
	Sheet sheet1 = book.createSheet("sheet1");
	Row row0 = sheet1.createRow(0);
	row0.createCell(0).setCellValue("省");
	row0.createCell(1).setCellValue("市");
	row0.createCell(2).setCellValue("区");
	
	// 省规则
	DVConstraint provConstraint = DVConstraint.createExplicitListConstraint(provNameList.toArray(new String[] {}));
	CellRangeAddressList provRangeAddressList = new CellRangeAddressList(1, 1, 0, 0);
	DataValidation provinceDataValidation = new HSSFDataValidation(provRangeAddressList, provConstraint);
	provinceDataValidation.createErrorBox("error", "请选择正确的省份");
	sheet1.addValidationData(provinceDataValidation);
	
	// 市以规则,此处仅作一个示例
	// "INDIRECT($A$" + 2 + ")" 表示规则数据会从名称管理器中获取key与单元格 A2 值相同的数据,如果A2是浙江省,那么此处就是
	// 浙江省下的区域信息。
	DVConstraint formula = DVConstraint.createFormulaListConstraint("INDIRECT($A$" + 2 + ")");
	CellRangeAddressList rangeAddressList = new CellRangeAddressList(1, 10, 1, 1);
	DataValidation cacse = new HSSFDataValidation(rangeAddressList, formula);
	cacse.createErrorBox("error", "请选择正确的市");
	sheet1.addValidationData(cacse);
	
	// 区规则
	formula = DVConstraint.createFormulaListConstraint("INDIRECT($B$" + 2 + ")");
	rangeAddressList = new CellRangeAddressList(1, 10, 2, 2);
	cacse = new HSSFDataValidation(rangeAddressList, formula);
	cacse.createErrorBox("error", "请选择正确的区");
	sheet1.addValidationData(cacse);
	
	FileOutputStream os = null;
	try {
		os = new FileOutputStream("D:/testCascade2003.xls");
		book.write(os);
	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		IOUtils.closeQuietly(os);
	}
}

/**
 * 
 * @param offset 偏移量,如果给0,表示从A列开始,1,就是从B列
 * @param rowId 第几行
 * @param colCount 一共多少列
 * @return 如果给入参 1,1,10. 表示从B1-K1。最终返回 $B$1:$K$1
 * 
 * @author denggonghai 2016年8月31日 下午5:17:49
 */
public String getRange(int offset, int rowId, int colCount) {
	char start = (char)('A' + offset);
	if (colCount <= 25) {
		char end = (char)(start + colCount - 1);
		return "$" + start + "$" + rowId + ":$" + end + "$" + rowId;
	} else {
		char endPrefix = 'A';
		char endSuffix = 'A';
		if ((colCount - 25) / 26 == 0 || colCount == 51) {// 26-51之间,包括边界(仅两次字母表计算)
			if ((colCount - 25) % 26 == 0) {// 边界值
				endSuffix = (char)('A' + 25);
			} else {
				endSuffix = (char)('A' + (colCount - 25) % 26 - 1);
			}
		} else {// 51以上
			if ((colCount - 25) % 26 == 0) {
				endSuffix = (char)('A' + 25);
				endPrefix = (char)(endPrefix + (colCount - 25) / 26 - 1);
			} else {
				endSuffix = (char)('A' + (colCount - 25) % 26 - 1);
				endPrefix = (char)(endPrefix + (colCount - 25) / 26);
			}
		}
		return "$" + start + "$" + rowId + ":$" + endPrefix + endSuffix + "$" + rowId;
	}
}

3、安利个工具类

      Google的guava,很强大的一个辅助工具Jar包,里面很多很实用的工具。案例中的Lists.newArrayList("杭州市", "宁波市"),一行代码就创建了一个List。

POI 导出Excel 下拉列表多级联动(以省市县三级联动为例) 一、主要步骤 1 创建workbook,创建要展示的sheet,即需要用户填写的sheet,设置表头等必须字段 2 创建隐藏sheet,列出下拉列表中需要展示的项信息 3 名称管理器设置name 4 利用名称管理器关联到隐藏sheet中信息 5 设置有效性,添加验证 二、详细步骤 可以先熟悉在excel文件中新建多级联动做法,可参照Excel多级下拉菜单联动自动匹配内容 ( 阅读详情

相关推荐

利用 easypoi 实现 Excel 三级联动下拉菜单的实战指南

本文提供了一份利用EasyPoi库在Java中实现Excel三级联动下拉菜单的实战指南。通过解析Excel名称管理器与INDIRECT函数的联动原理,详细介绍了如何构建数据树、创建隐藏Sheet、定义名称并设置数据验证,最终整合EasyPoi实现开箱即用的动态数据导出功能,有效解决数据录入中的级联选择难题。

brown的博客 219

利用级联选择器实现省市区三级联动【vue + elementUI Plus | uViewUI】

利用级联选择器实现省市区三级联动

qq_36687211的博客 7984

Java EasyExcel 动态多级联动下拉列表进阶:突破名称管理器限制的实战方案

本文深入探讨了Java EasyExcel实现动态多级联动下拉列表的进阶方案,突破了传统名称管理器和INDIRECT函数的限制。通过隐藏Sheet存储数据字典和动态构建数据验证规则,解决了特殊字符支持、同名项冲突和大数据量处理等痛点,提供了完整的实战代码和优化技巧。

weixin_30839881的博客 374

java实现excel多级联动

现在有一个需求,抽取一个方法,入参是文件路径、导入的省市区数据、指定插入列 ,在本地导入一个Excel,在这个Excel的指定列插入三级联动(省市区)。

weixin_54355236的博客 4115

中国各个省市区(县)级联数据

function filteCityLevel(list) { let provinces = [] // 所有的省份 let citys = [] // 所有的市 let areas = [] // 所有的区 list.forEach(item => { if(provinces.indexOf(item.name) < 0) { provinces.push(item.name) } if(item.city && i.

专注于技术,分享实战经验,探索技术边界,用代码构建更美的数字世界。 5239

省市区级联功能的实现与应用

本文还有配套的精品资源,点击获取 简介:省市区级联功能是地理信息系统和表单设计中常见的多级选择联动技术。它涉及前端的级联选择器、后端的数据库设计和查询,以及前端实现和性能优化。在本设计中,用户可逐级选择省份、城市、区县,确保数据精确性。本文将详细讲解省市区级联的选择器、MySQL数据库设计、查询数据获取、前端实现、优化策略、扩展性和应用场景。 1. 省市区级联的用...

weixin_35364187的博客 1209

vue实现省市区三级联动地址选择组件(附address文件)

昨天收到一个新的需求,需要选择地址,因此就要做一个省市区三级联动的组件来使用,在网上找了一些资源,然后进行了尝试,没想到就这么成功了!要记录一下方便后续使用。效果如下:下面就记录一下代码叭!

Vivien_CC的博客 1万+

Pixhawk+OpenMV实战:如何用Apriltag实现无人机自动降落(附避坑指南)

本文详细介绍了如何利用Pixhawk飞控和OpenMV摄像头,通过Apriltag视觉标签实现无人机的精准降落系统。从硬件搭建、参数配置到视觉处理代码优化,提供了完整的实战指南和避坑建议,帮助开发者快速实现厘米级精度的自动降落功能。

weixin_27076351的博客 481

Java Excel省市区级联菜单设置(使用POI写excel,并且添加数据校验)

需要引入的poi maven依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.14</version> </dependency> <d...

weixin_39209728的博客 2473

Clion编译stm32cube初始化工程时non constant or forward reference address expression for section .ARM.extab报错

相信应该有同学在看了稚晖君关于clion开发stm32的文章之后也想在自己PC上实现“优雅の嵌入式开发”遇到和我类似的问题。他的文章是22年写的,我个人猜测应当是版本更新导致的不适配。意思就是说 READONLY 只能在gcc11以后的版本中使用,gcc10及以前的版本将无法正确识别,也就有如下错误。或者就可以将gcc升级至最新的版本。记得在clion工具链中修改c,cpp编译器的位置。可以将文本括号中的 READONLY 全部删除。当时由于没有注意到这行注释导致在这里卡了好久。

2301_77256849的博客 2512

FPGA实战:AXI BRAM Controller配置避坑指南(Vivado 2023版)

本文详细解析了Vivado 2023环境下AXI BRAM Controller的配置技巧与避坑指南,涵盖AXI4协议转换、BRAM地址空间配置、信号异常处理及突发传输优化等核心内容。针对写时序冲突、跨时钟域处理等常见问题提供实用解决方案,帮助开发者提升FPGA系统性能与稳定性。

q1w3e5r7t9y的博客 341

Java Excel 多级菜单联动原理与实现(可扩展)

Java Excel 多级菜单联动原理与实现 通俗易懂

昔木的博客 5244

山东大学软件测试实验2——系统功能测试

​ 给出一个被测试的 Web 应用系统(SUT)。http://211.87.232.162:8080/注:友情链接不用延伸测试。针对被测试的 Web 应用系统进行功能测试,发现其存在的缺陷。 ​

m0_74033391的博客 2409

Java POI 设置Excel级联菜单demo

参考博客:https://blog.youkuaiyun.com/readiay/article/details/52397419 Apache的相关类的文档说明:http://poi.apache.org/apidocs/dev/org/apache/poi/hssf/usermodel/package-summary.html 此博客以省市区为例,展示了下拉列表,有效性验证,级联操作的示例,很详细。 ...

ddou_pan的博客 1522

线性回归LinearRegression

对视频中线性回归算法的相关内容进行总结与记录 文章目录一、理论基础二、实例2.1 一元线性回归2.1.1 推导过程2.1.2 代码实现(基于numpy)2.1.3 代码实现(基于sklearn)2.2 多元线性回归2.2.1 代码实现(基于numpy)2.2.2 代码实现(基于sklearn) 一、理论基础 回归 通常是指利用某个函数,尽可能把数据样本点“串”在一起,用于描述输入变量和输出变量间的变化关系 线性回归 特点:用来把数据“串”起来的那个函数是线性的 (一元线性回归(一个自变量) &a.

邱邱邱的博客 1068

MSPM0G3507电赛控制板设计:电机驱动与多传感器融合

微控制器是嵌入式控制系统的核心处理单元,其性能与外设集成度直接决定实时控制能力。基于Arm Cortex-M0+内核的MCU凭借低功耗、高性价比和丰富模拟资源,成为大学生电子设计竞赛等工程实践场景的主流选择。本文围绕MSPM0G3507展开,深入解析双路电机驱动(TB6612FNG)、多源传感采集(MPU6050+ADC电压监测)及抗干扰硬件架构等关键技术,强调电源隔离、信号完整性与鲁棒性设计对72小时封闭竞赛环境的关键支撑作用。典型应用涵盖巡线小车运动控制、姿态解算与蓝牙/Zigbee协同通信,为控制类赛

weixin_42588672的博客 542

java导出excel,选项级联下拉选

我自己修改了原代码,不过很好用 源代码 package com.cc.cs; import java.io.FileOutputStream; import java.util.HashMap; import java.util.Map; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel...

qq_39900178的博客 3835

(2)NPW(监控片)【中】---业务场景精讲

自己在日常工作当中,由于非产线人员出生,对NPW的知识一直一知半解,业务场景认识的不够透彻,做系统的时候很难理解甲方的NPW业务应用,特收集了不少关于NPW的一些业务场景,下面都是一些摘抄,大家关注我标红标粗的部分,

阿拉伯梳子的专栏 1588

记一次JAVA POI excel模板级联菜单生成过程

写程序经常会碰到一些奇葩需求,本次做产品导入模板被坑了好久,因为数据环境的不稳定,人工配置的模板数据变化模板没有及时更新,导入时的数据校验总是被测试提bug,因此才想着去做动态模板,避免以后忘记,还是记录下!话不多说上代码! /** * 创建省市区级联下拉框 * * @param workbook 工作簿 * @param sheetName shee...

Hehanson的博客 787

Multisim14.0仿真应用设计(十六)74LS138译码器应用仿真

74LS138为3线-8线译码器。

zhusl6688的博客 2982

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

POI 导出Excel 下拉列表多级联动

原文:https://blog.youkuaiyun.com/m0_37956938/article/details/78084503 一、主要步骤 1 创建workbook,创建要展示的sheet,即需要用户填写的sheet,设置表头等必须字段 2 创建隐藏sheet,列出下拉列表中需要展示的项信息 3 名称管理器设置name 4 利用名称管理器关联到隐藏sheet中信息 5 设置有效性,添加...

qq_38289633的博客 1471

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

zzzzzzzzzzzzzzzzzzzzzzzzzzz

级联操作的做法是首先我们将所有的省市区的信息按照一定的规则存到一个Sheet页中,我的存放规则是第一列存放Key,一个区域名称,之后的所有列存放该区域下的子区域名称。一个Excel文件其实可以分解成很多的对象,例如整个Excel就是一个大对象,然后分解之后可以看作是一个个SHEET对象组合起来的,接着SHEET对象又是由行对象ROW组合起来的,行对象又是由CELL对象组合起来的,等等。案例中的Lists.newArrayList("杭州市", "宁波市"),一行代码就创建了一个List。

qq_52443676的博客 1343

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java基于POI实现excel任意多级联动下拉列表——支持从数据库查询出多级数据后直接生成【附源码】...

Excel相关知识点 (1)名称管理器——Name Manager 【CoderBaby】首先需要创建多个名称(包含key及value),作为下拉列表的数据源,供后续通过名称引用。可通过菜单:“公式”---“名称管理器”找到,如下图: (2)数据验证——DataValidation 此处我们需要选List(序列),Source(来源)选项;可通过菜单:“数据”---“数据验证”...

GJLNaughtyCat的专栏 1944

Excel表格设计进阶:如何用EasyExcel实现带独立下拉的级联选择(省市区+联系方式)

本文详细介绍了如何利用EasyExcel框架实现Excel表格中复杂的级联下拉选择功能,重点讲解了省市区三级联动的构建方法,并集成了独立的联系方式下拉菜单。通过自定义SheetWriteHandler,在隐藏Sheet中组织数据并利用名称管理器与INDIRECT函数,实现了动态、规范的数据验证,从而提升数据录入的准确性与用户体验。

flower的专栏 440

poi导入excel表格实现联动效果

一、主要步骤  1 创建workbook,创建要展示的sheet,即需要用户填写的sheet,设置表头等必须字段  2 创建隐藏sheet,列出下拉列表中需要展示的项信息  3 名称管理器设置name  4 利用名称管理器关联到隐藏sheet中信息  5 设置有效性,添加验证  二、详细步骤  可以先熟悉在excel文件中新建多级联动做法,可参照Excel多级下拉菜单联动自动匹配内容  (http...

weixin_42107940的博客 1926

Excel黑科技!用Java代码生成带省市县三级联动的模板(EasyExcel+函数公式详解)

本文详细介绍了如何使用Java和EasyExcel构建高性能的省市县三级联动Excel模板。通过MATCH和OFFSET函数的巧妙组合,实现动态下拉菜单的智能联动,提升企业级应用中的数据导出效率。文章包含技术方案设计、关键步骤实现、性能优化技巧及企业级扩展方案,帮助开发者快速掌握这一实用技能。

weixin_30776273的博客 260
上一篇: Windows修改输入法全角半角快捷键
下一篇: 客户机操作系统已禁用 CPU。请关闭或重置虚拟机。
Readiay
博客等级 码龄14年 166粉丝 57原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值