使用poi解决导出excel内下拉框枚举项较多的问题

废话少说,直接上代码:

package com.fst.attachment.controller;

import java.io.FileOutputStream;

import org.apache.poi.hssf.usermodel.DVConstraint;
import org.apache.poi.hssf.usermodel.HSSFDataValidation;
import org.apache.poi.hssf.usermodel.HSSFSheet;
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.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddressList;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFDataValidation;
import org.apache.poi.xssf.usermodel.XSSFDataValidationConstraint;
import org.apache.poi.xssf.usermodel.XSSFDataValidationHelper;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class TestPOIDropDown {

	public static void main(String[] args) throws Exception {
		// 创建枚举项
		int len = 200;
		String[] datas = new String[len];
		for (int i = 0; i < len; i++) {
			datas[i] = i + "我是下拉框枚举项---";
		}

		// ----------------生成--------------------------------
		// 方法一:使用createExplicitListConstraint实现,缺陷为:
		// 只能满足较少枚举项的下拉框,最好不要超过20个,具体个数根据枚举字段长度而定。
		// Workbook workbook = HSSFSetDropDown(datas);
		// Workbook workbook = XSSFSetDropDown(datas);
		// Workbook workbook = SXSSFSetDropDown(datas);
		/*
		 * 简单比较HSSF、XSSF、SXSSF: - 由于新的XSSF支持Excel 2007 OOXML(.xlsx)文件是基于XML的,
		 * 因此处理它们的内存占用量高于旧版HSSF支持的(.xls)二进制文件。 -
		 * SXSSF(3.8-beta3之后支持)在生成非常大的电子表格时使用, 相较于XSSF,其在某个时间点只能访问有限数量的行。
		 * http://poi.apache.org/components/spreadsheet/
		 */

		// 方法二:使用createFormulaListConstraint实现,其适用于较多枚举项的下拉框,
		// 实现步骤大致为:创建一个隐藏的sheet,并往里放入枚举项,然后在第一个sheet内增加关联关系
		Workbook workbook = XSSFSetDropDownAndHidden(datas);

		// 输出
		FileOutputStream stream = new FileOutputStream("d:\\testDropDown.xlsx");
		workbook.write(stream);
		stream.close();
	}
	

	/**
	 * 使用createFormulaListConstraint实现下拉框
	 * @param formulaString
	 * @return
	 */
	public static Workbook XSSFSetDropDownAndHidden(String[] formulaString) {
		Workbook workbook = new XSSFWorkbook();
		Sheet sheet = workbook.createSheet("下拉列表测试");
		// 创建sheet,写入枚举项
		Sheet hideSheet = workbook.createSheet("hiddenSheet");
		for (int i = 0; i < formulaString.length; i++) {
			hideSheet.createRow(i).createCell(0).setCellValue(formulaString[i]);
		}
		// 创建名称,可被其他单元格引用
		Name category1Name = workbook.createName();
		category1Name.setNameName("hidden");
		// 设置名称引用的公式
		// 使用像'A1:B1'这样的相对值会导致在Microsoft Excel中使用工作簿时名称所指向的单元格的意外移动,
		// 通常使用绝对引用,例如'$A$1:$B$1'可以避免这种情况。
		// 参考: http://poi.apache.org/apidocs/dev/org/apache/poi/ss/usermodel/Name.html
		category1Name.setRefersToFormula("hiddenSheet!" + "$A$1:$A$" + formulaString.length);
		// 获取上文名称内数据
		DataValidationHelper helper = sheet.getDataValidationHelper();
		DataValidationConstraint constraint = helper.createFormulaListConstraint("hidden");
		// 设置下拉框位置
		CellRangeAddressList addressList = new CellRangeAddressList(0, 200, 0, 0);
		DataValidation dataValidation = helper.createValidation(constraint, addressList);
		// 处理Excel兼容性问题
		if (dataValidation instanceof XSSFDataValidation) {
			// 数据校验
			dataValidation.setSuppressDropDownArrow(true);
			dataValidation.setShowErrorBox(true);
		} else {
			dataValidation.setSuppressDropDownArrow(false);
		}
		// 作用在目标sheet上
		sheet.addValidationData(dataValidation);
		// 设置hiddenSheet隐藏
		workbook.setSheetHidden(1, true);
		return workbook;
	}
	

	/**
	 * 使用较早版本的 HSSF用户模型设置表格下拉框 缺陷:下拉框数据量超过一定数量时,系统抛异常。
	 * 
	 * @param formulaString
	 * 
	 */
	public static Workbook HSSFSetDropDown(String[] formulaString) {
		HSSFWorkbook workbook = new HSSFWorkbook();
		HSSFSheet sheet = workbook.createSheet("下拉列表测试");
		// 加载下拉列表内容
		DVConstraint constraint = DVConstraint.createExplicitListConstraint(formulaString);
		// 设置数据有效性加载在哪个单元格上。
		// 四个参数分别是:起始行、终止行、起始列、终止列
		CellRangeAddressList regions = new CellRangeAddressList(0, 200, 0, 0);
		// 数据有效性对象
		DataValidation dataValidation = new HSSFDataValidation(regions, constraint);
		sheet.addValidationData(dataValidation);
		return workbook;
	}

	/**
	 * 使用 XSSF用户模型设置表格下拉框,多用来处理xlsx后缀的excel 缺陷:下拉框数据量超过一定数量时,文件打不开。
	 * 
	 * @param formulaString
	 * 
	 */
	public static Workbook XSSFSetDropDown(String[] formulaString) {
		XSSFWorkbook workbook = new XSSFWorkbook();
		XSSFSheet sheet = workbook.createSheet("下拉列表测试");
		XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper(sheet);
		XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint) dvHelper
				.createExplicitListConstraint(formulaString);
		CellRangeAddressList addressList = null;
		XSSFDataValidation validation = null;
		for (int i = 0; i < 500; i++) {
			addressList = new CellRangeAddressList(i, i, 0, 0);
			validation = (XSSFDataValidation) dvHelper.createValidation(dvConstraint, addressList);
			// 07默认setSuppressDropDownArrow(true);
			// validation.setSuppressDropDownArrow(true);
			// validation.setShowErrorBox(true);
			sheet.addValidationData(validation);
		}
		return workbook;
	}

	/**
	 * 使用 SXSSF用户模型设置表格下拉框 缺陷:下拉框数据量超过一定数量时,文件打不开。
	 * 
	 * @param formulaString
	 * 
	 */
	public static Workbook SXSSFSetDropDown(String[] formulaString) {
		SXSSFWorkbook workbook = new SXSSFWorkbook();
		Sheet sheet = workbook.createSheet("下拉列表测试");
		// 加载下拉列表内容
		DataValidationHelper helper = sheet.getDataValidationHelper();
		DataValidationConstraint constraint = helper.createExplicitListConstraint(formulaString);
		// 设置下拉框位置
		CellRangeAddressList addressList = null;
		addressList = new CellRangeAddressList(0, 500, 0, 0);
		DataValidation dataValidation = helper.createValidation(constraint, addressList);
		// 处理Excel兼容性问题
		if (dataValidation instanceof XSSFDataValidation) {
			// 数据校验
			dataValidation.setSuppressDropDownArrow(true);
			dataValidation.setShowErrorBox(true);
		} else {
			dataValidation.setSuppressDropDownArrow(false);
		}
		sheet.addValidationData(dataValidation);
		return workbook;
	}

}

poi 版本

在这里插入图片描述

参考

最后

  • 转帖请注明出处,谢谢
  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用POI导出Excel设置下框可以通过以下步骤实现: 1. 创建下列表数据源。可以使用org.apache.poi.ss.usermodel.DataValidationHelper类中的createExplicitListConstraint方法创建下列表数据源。 例如: DataValidationHelper dvHelper = sheet.getDataValidationHelper(); CellRangeAddressList addressList = new CellRangeAddressList(1, 10, 0, 0); String[] strings = {"选项1", "选项2", "选项3"}; DataValidationConstraint dvConstraint = dvHelper.createExplicitListConstraint(strings); DataValidation validation = dvHelper.createValidation(dvConstraint, addressList); sheet.addValidationData(validation); 上面的代码创建了一个下列表数据源,该数据源包含三个选项:选项1、选项2和选项3。该数据源将应用于第1行到第10行的第1列单元格。 2. 设置单元格格式为下列表格式。可以使用org.apache.poi.ss.usermodel.Cell类中的setCellValue方法将单元格的值设置为下列表数据源中的一个选项。 例如: Cell firstCell = sheet.getRow(1).createCell(0); firstCell.setCellValue("选项1"); 3. 保存Excel文件。最后,使用org.apache.poi.ss.usermodel.Workbook类中的write方法将Excel文件保存到磁盘。 例如: FileOutputStream fileOut = new FileOutputStream("workbook.xls"); workbook.write(fileOut); fileOut.close(); 上面的代码将Excel文件保存到名为“workbook.xls”的文件中。 注意:上面的代码仅供示例参考,具体实现应根据具体需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值