由于業(yè)務(wù)需求经磅,我需要處理一個(gè)excel表射众,讀取數(shù)據(jù)庫中的信息并作為下拉列表(即數(shù)據(jù)驗(yàn)證,舊版的叫數(shù)據(jù)有效性)添加到excel表中述暂。由于是新版的excel痹升, 這里就不考慮HSSF而是直接使用XSSF。
首先畦韭,由于我對(duì)poi疼蛾,xssf這個(gè)東西不熟,所以直接采用createExplicitListConstraint實(shí)現(xiàn)艺配,但是一開始就報(bào)錯(cuò)了察郁。打開生成的excel表提示:
"無法讀取表中的某些數(shù)據(jù),如果對(duì)其信任转唉,是否對(duì)數(shù)據(jù)源進(jìn)行修復(fù)皮钠?"
選擇“是”,就會(huì)發(fā)現(xiàn)彈出這樣一個(gè)提示:
"已刪除的功能:../../xx.xml赠法,的數(shù)據(jù)驗(yàn)證"
然后數(shù)據(jù)驗(yàn)證功能被完全刪除麦轰!
這是為什么呢?一開始砖织,我以為是編碼問題款侵,后來發(fā)現(xiàn)不是,又以為是中文問題侧纯,手動(dòng)測試后發(fā)現(xiàn)也不是新锈。難道是因?yàn)槌霈F(xiàn)了空格和特殊字符?都不是眶熬!我小心翼翼地測試妹笆,發(fā)現(xiàn)有時(shí)候報(bào)錯(cuò)有時(shí)候不報(bào)錯(cuò),但總體規(guī)律就是:數(shù)據(jù)驗(yàn)證的條數(shù)越多聋涨、每條的字?jǐn)?shù)越多晾浴,報(bào)錯(cuò)的幾率越大。
后面牍白,我終于知道了脊凰,這個(gè)它這個(gè)功能固有的缺陷,那怎么辦茂腥?方法就是改用createFormulaListConstraint狸涌,創(chuàng)建一個(gè)隱藏的sheet,并往里放入枚舉項(xiàng)最岗,然后在真正的sheet內(nèi)增加關(guān)聯(lián)關(guān)系帕胆!
具體的實(shí)現(xiàn)步驟如下:
public static Workbook XSSFSetDropDownAndHidden(String[] formulaString) {
Workbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet("mysheet");
// 創(chuàng)建隱藏sheet,寫入枚舉項(xiàng)
Sheet hideSheet = workbook.createSheet("hiddenSheet");
for (int i = 0; i < formulaString.length; i++) {
hideSheet.createRow(i).createCell(0).setCellValue(formulaString[i]);
}
// 創(chuàng)建名稱般渡,作用是被其他單元格引用
Name categoryName = workbook.createName();
categoryName.setNameName("hidden");
// 設(shè)置名稱引用的公式
categoryName.setRefersToFormula("hiddenSheet!" + "$A$1:$A$" + formulaString.length);
//由于在hiddensheet中的每一行的第一個(gè)格子我們放入了等同于length的數(shù)據(jù)懒豹,所以這里用絕對(duì)引用第一列的1到length的數(shù)據(jù)
// 設(shè)置下拉單位格范圍芙盘,第5列的1到1024
CellRangeAddressList regions = new CellRangeAddressList(0,1024,4,4);
//獲取數(shù)據(jù)
XSSFDataValidationHelper dvHelper = (XSSFDataValidationHelper) sheet.getDataValidationHelper();
XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint)dvHelper.createFormulaListConstraint("hidden");
//將數(shù)據(jù)關(guān)聯(lián)
XSSFDataValidation dataValidation = (XSSFDataValidation)dvHelper.createValidation(dvConstraint,regions);
//其他設(shè)置
dataValidation.setSuppressDropDownArrow(true);
dataValidation.setShowErrorBox(true);
//添加到sheet中
sheet.addValidationData(dataValidation);
//設(shè)置隱藏
workBook.setSheetHidden(1,true);
return workbook;
}
最后感謝博客園的"(00)"的博文。