【下拉列表值超过255问题】poi生成excel设置单列-解决方案

poi生成2003以下版本excel(.xls后缀文件)

注意:该版本生成的会存在兼容性问题,下述会进行说明。

  • 项目引用poi库的依赖 (略过)

  • 构造生成excel模板方法

    // 传入下拉列表数组值,构造信息模板	
      public static Workbook generateExcel(String[] typeArrays) {
      	Workbook wb = new HSSFWorkbook();
      	// 创建模板工作表
      	Sheet sheet = wb.createSheet("test");
      	// 创建下拉列表值存储工作表并设置值
      	genearteOtherSheet(wb, typeArrays);
    
      	// 创建模板列信息并绑定下拉列表值
      	Row row = sheet.createRow(0);
      	// 设置列信息样式
      	setStyle(wb, sheet, 0);
      	setStyle(wb, sheet, 1);
      	// 绑定列信息
      	Cell nameCell = row.createCell((int) 0);
                  nameCell.setCellValue("名称");
                  Cell typeCell = row.createCell((int) 1);
                  typeCell.setCellValue("类型");
    
      	// 设置下拉列表直绑定对哪一页起作用
      	        sheet.addValidationData(SetDataValidation("typelist!$A$1:$A$" + typeArrays.length, 1, 0, typeArrays.length, 0));	
    
      	// 隐藏作为下拉列表值的Sheet
      	wb.setSheetHidden(wb.getSheetIndex("typelist"), 1);
    
      	return wb;
      }
    
      // 创建下拉列表值存储工作表并设置值
      public static void genearteOtherSheet(Workbook wb, String[] typeArrays) {
          // 创建下拉列表值存储工作表
          Sheet sheet = wb.createSheet("typelist");
      // 循环往该sheet中设置添加下拉列表的值
          for (int i = 0; i < typeArrays.length; i++) {
              Row row = sheet.createRow(i);
              Cell cell = row.createCell((int) 0);
              cell.setCellValue(typeArrays[i]);
          }
      }
    
      // 设置列信息样式
      public static void setStyle(Workbook wb, Sheet sheet,int colNum) {
      	CellStyle cellStyle = wb.createCellStyle();
          cellStyle.setAlignment(CellStyle.ALIGN_CENTER);
          DataFormat format = wb.createDataFormat();
          cellStyle.setDataFormat(format.getFormat("@"));
    
          sheet.setDefaultColumnStyle(colNum, cellStyle);
      } 
    
      // 设置并引用其他Sheet作为绑定下拉列表数据
      public static DataValidation SetDataValidation(String strFormula, int firstRow, int firstCol, int endRow, int endCol) {
      	// 表示A列1-59行作为下拉列表来源数据
          // String formula = "typelist!$A$1:$A$59" ;
          // 原顺序为 起始行 起始列 终止行 终止列
          CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol);
      	// add
          DVConstraint constraint = DVConstraint.createFormulaListConstraint(strFormula);
      	// add
          DataValidation dataValidation = new HSSFDataValidation(regions, constraint);
    
      	return dataValidation;
      }
    
      public static void main(String[] args) throws Exception {
          List<String> typelist = new ArrayList<String>();
          for (int i = 0; i < 200; i++) {
              typelist.add("T" + (0 + i));
          }
          String[] typeArrays = typelist.toArray(new String[typelist.size()]);
          Workbook wb = generateExcel(typeArrays);
          File tempFile = new File("C:\\Users\\gqd\\Desktop\\test.xls");
          OutputStream os = new FileOutputStream(tempFile);
    
          wb.write(os);
          os.close();
      }

  • 问题点

    • 单元格下拉选择值,保存提示引用兼容性问题
    • 强制保存后,重新打开,下拉列无法获取引用并取值

poi生成2007以上版本excel(.xlsx后缀文件)

  • 项目引用poi库的依赖 (略过)

  • 构造生成excel模板方法

    // 传入下拉列表数组值,构造信息模板	
      public static Workbook generateExcel(String[] typeArrays) {
      	Workbook wb = new XSSFWorkbook();
      	// 创建模板工作表
      	Sheet sheet = wb.createSheet("test");
      	// 创建下拉列表值存储工作表并设置值
      	genearteOtherSheet(wb, typeArrays);
    
      	// 创建模板列信息并绑定下拉列表值
      	Row row = sheet.createRow(0);
      	// 设置列信息样式 -- 当前样式对于列信息未居中
      	setStyle(wb, sheet, 0);
      	setStyle(wb, sheet, 1);
      	// 绑定列信息
          Cell nameCell = row.createCell((int) 0);
          nameCell.setCellValue("名称");
          Cell typeCell = row.createCell((int) 1);
          typeCell.setCellValue("类型");
    
      	// 设置下拉列表直绑定对哪一页起作用
          sheet.addValidationData(SetDataValidation(wb, "typelist!$A$1:$A$" + typeArrays.length, 1, 0, typeArrays.length, 0));	
    
      	// 隐藏作为下拉列表值的Sheet
          wb.setSheetHidden(wb.getSheetIndex("typelist"), 1);
    
      	return wb;
      }
    
      // 创建下拉列表值存储工作表并设置值
      public static void genearteOtherSheet(Workbook wb, String[] typeArrays) {
          // 创建下拉列表值存储工作表
          Sheet sheet = wb.createSheet("typelist");
          // 循环往该sheet中设置添加下拉列表的值
          for (int i = 0; i < typeArrays.length; i++) {
              Row row = sheet.createRow(i);
              Cell cell = row.createCell((int) 0);
              cell.setCellValue(typeArrays[i]);
          }
      }
    
      // 设置列信息样式
      public static void setStyle(Workbook wb, Sheet sheet,int colNum) {
          CellStyle cellStyle = wb.createCellStyle();
          cellStyle.setAlignment(CellStyle.ALIGN_CENTER);
          DataFormat format = wb.createDataFormat();
          cellStyle.setDataFormat(format.getFormat("@"));
    
          sheet.setDefaultColumnStyle(colNum, cellStyle);
      } 
    
      // 设置并引用其他Sheet作为绑定下拉列表数据
      public static DataValidation SetDataValidation(Workbook wb, String strFormula, int firstRow, int firstCol, int endRow, int endCol) {
      	// 表示A列1-59行作为下拉列表来源数据
          // String formula = "typelist!$A$1:$A$59" ;
          // 原顺序为 起始行 起始列 终止行 终止列
          CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol);
          DataValidationHelper dvHelper = new XSSFDataValidationHelper((XSSFSheet) wb.getSheet("typelist"));
      	DataValidationConstraint formulaListConstraint = dvHelper.createFormulaListConstraint(strFormula);
      	DataValidation dataValidation = dvHelper.createValidation(formulaListConstraint, regions);
    
      	return dataValidation;
      }
    
      public static void main(String[] args) throws Exception {
          List<String> typelist = new ArrayList<String>();
          for (int i = 0; i < 200; i++) {
              typelist.add("T" + (0 + i));
          }
          String[] typeArrays = typelist.toArray(new String[typelist.size()]);
          Workbook wb = generateExcel(typeArrays);
          File tempFile = new File("C:\\Users\\gqd\\Desktop\\test.xlsx");
          OutputStream os = new FileOutputStream(tempFile);
    
          wb.write(os);
          os.close();
      }

  • 完美解决该问题

上述生成excel模板仅限于解决当前问题,如有兴趣,自己封装

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值