poi生成excel設置單列爲下拉列表值超過255問題解決方案

poi生成2003如下版本excel(.xls後綴文件)

注意:該版本生成的會存在兼容性問題,下述會進行說明。數組

  • 項目引用poi庫的依賴 (略過)excel

  • 構造生成excel模板方法code

    // 傳入下拉列表數組值,構造信息模板	
      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();
      }
  • 問題點orm

    • 單元格下拉選擇值,保存提示引用兼容性問題
    • 強制保存後,從新打開,下拉列沒法獲取引用並取值

poi生成2007以上版本excel(.xlsx後綴文件)

  • 項目引用poi庫的依賴 (略過)get

  • 構造生成excel模板方法it

    // 傳入下拉列表數組值,構造信息模板	
      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();
      }
  • 完美解決該問題io

上述生成excel模板僅限於解決當前問題,若有興趣,本身封裝form

相關文章
相關標籤/搜索