1. 程式人生 > >【下拉列表值超過255問題】poi生成excel設定單列-解決方案

【下拉列表值超過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模板僅限於解決當前問題,如有興趣,自己封裝