【下拉列表值超過255問題】poi生成excel設定單列-解決方案
阿新 • • 發佈:2019-02-20
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模板僅限於解決當前問題,如有興趣,自己封裝