Apache POI在生成excel文件方面比其他工具較為強(qiáng)大,把在項(xiàng)目中用到的東西記錄下來(lái)。由于之前沒(méi)有用過(guò)poi,所以期間耗費(fèi)了一些時(shí)間收集資料和看api。在此特地記錄下來(lái),希望能幫助你。
在這里只指出關(guān)鍵點(diǎn),完整源碼請(qǐng)根據(jù)下方提供的git地址查看。
本文示例使用poi版本: poi-3.10-FINAL-20140208 。
先把下拉框數(shù)據(jù)寫入隱藏sheet頁(yè)中,寫的同時(shí)進(jìn)行下拉數(shù)據(jù)與所要級(jí)聯(lián)的下拉數(shù)據(jù)進(jìn)行“名稱”映射(注意:excel“名稱”不能以數(shù)字開(kāi)頭,且不能包含特殊字符)
/**
* 初始化倉(cāng)庫(kù)&貨架下拉框數(shù)據(jù)
*
* @param workbook
* @param wsSheet
* @param warehouses
* @param warehousesAndShelves
*/
private static void initWarehousesAndShelves(HSSFWorkbook workbook, HSSFSheet wsSheet, List<String> warehouses, Map<String, List<String>> warehousesAndShelves) {
writeWarehouses(workbook, wsSheet, warehouses);
writeShelves(workbook, wsSheet, warehouses, warehousesAndShelves);
initWarehouseNameMapping(workbook, wsSheet.getSheetName(), warehouses.size());
}
/**
* 生成下拉框之前的準(zhǔn)備:根據(jù)公式生成下拉框驗(yàn)證規(guī)則及提示
*
* @param formulaString
* @param columnIndex
* @return
*/
public static DataValidation getDataValidationByFormula(String formulaString, int columnIndex) {
// 加載下拉列表內(nèi)容
DVConstraint constraint = DVConstraint.createFormulaListConstraint(formulaString);
// 設(shè)置數(shù)據(jù)有效性加載在哪個(gè)單元格上。
// 四個(gè)參數(shù)分別是:起始行、終止行、起始列、終止列
CellRangeAddressList regions = new CellRangeAddressList(1, XLS_MAX_ROW, columnIndex, columnIndex);
// 數(shù)據(jù)有效性對(duì)象
DataValidation dataValidationList = new HSSFDataValidation(regions, constraint);
dataValidationList.createErrorBox("Error", "請(qǐng)選擇或輸入有效的選項(xiàng),或下載最新模版重試!");
String promptText = initPromptText(columnIndex);
dataValidationList.createPromptBox("", promptText);
return dataValidationList;
}
/**
* 在主sheet中初始化下拉框
*
* @param mainSheet
*/
private static void initSheetNameMapping(HSSFSheet mainSheet) {
DataValidation warehouseValidation = getDataValidationByFormula(WAREHOUSE_NAMES, 3);
DataValidation shelfValidation = getDataValidationByFormula("INDIRECT($D1)", 4); //formula同"INDIRECT(INDIRECT(\"R\"&ROW()&\"C\"&(COLUMN()-1),FALSE))"
DataValidation deviceValidation = getDataValidationByFormula(DEVICE_NAMES, 0);
DataValidation deviceTypeValidation = getDataValidationByFormula(DEVICE_TYPE_NAMES, 1);
// 主sheet添加驗(yàn)證數(shù)據(jù)
mainSheet.addValidationData(warehouseValidation);
mainSheet.addValidationData(shelfValidation);
mainSheet.addValidationData(deviceValidation);
mainSheet.addValidationData(deviceTypeValidation);
}
注意: 級(jí)聯(lián)下拉框包含被級(jí)聯(lián)項(xiàng)和及聯(lián)項(xiàng)(選擇前者后可供選擇的下拉項(xiàng)),前者由于excel“名稱”的限制,不能以數(shù)字開(kāi)頭,也不能包含特殊字符。
給出效果圖:

excel.gif
源碼詳見(jiàn):https://github.com/hzhqk/java/blob/master/poi/excel%20template/ExcelTemplate.java