Apache POI .xlsx 下拉框實現

主要對象

  • 工做本: HSSFWorkbook(.xls) / XSSFWorkbook(.xlsx)
  • 工做表:HSSFSheet / XSSFSheet
  • 行:Row
  • 單元格:Cell
  • 其餘:CellRangeAddressList 選中區域,DataValidationConstraint 數據約束,DataValidation 數據驗證,XSSFCellStyle 單元格樣式

讀取與建立 Excel

/**
 * 建立
 * 1. 若是是一個FileOutputStream,則會直接建立文件
 * 2. 能夠是 response.getOutputStream(),則直接返回瀏覽器進行下載
 */
OutputStream os = ...;
XSSFWorkbook wb = new XSSFWorkbook();
wb.write(os);
os.flush();

// 讀取
XSSFWorkbook workbook = new XSSFWorkbook(file.getInputStream());
// 獲取工做表
XSSFSheet sheet = workbook.getSheetAt(index);
// 獲取總行數
int rows = sheet.getLastRowNum();

單元格合併

// 建立工做表
XSSFSheet sheet = wb.createSheet("sheetName");
// 添加合併區域,第一行前三個格子
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 3));
// 設置合併區域的值,cell爲0、一、2都同樣
sheet.createRow(0)
    .createCell(0)
    .setCellValue("cellValue");

單元格樣式

//建立樣式對象、字體對象
XSSFCellStyle style = wb.createCellStyle();                       
XSSFFont font = wb.createFont();                                  

// 字體
font.setFontName("宋體");
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
font.setColor(HSSFFont.COLOR_NORMAL);
font.setFontHeight((short) 12*20);
style.setFont(font);

// 填充色
style.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

// 邊框
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
style.setBorderTop(HSSFCellStyle.BORDER_THIN);

// 內容佈局
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);

// 給單元格設置樣式
Cell cell = ...;
cell.setCellStyle("style");

下拉框

XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper(sheet);

// 下拉框可選的數據,做爲約束
XSSFDataValidationConstraint dvConstraint = 
    (XSSFDataValidationConstraint) dvHelper.createExplicitListConstraint(new String[]{"a", "b", "c"});
// 設置爲下拉框的範圍
CellRangeAddressList addressList = 
    new CellRangeAddressList(0, 0, 0, 4);
// 建立 DataValidation 對象
XSSFDataValidation validation = 
    (XSSFDataValidation)dvHelper.createValidation(dvConstraint, addressList);
validation.setShowErrorBox(true);

// 做用於指定工做表
sheet.addValidationData(validation);

下拉框引用隱藏域

  • 用於解決上種方法,數組超過255和字節就會報錯的問題
  • 公式不能漏掉 $
  • 與上面的區別只是建立了一個公式約束
// 建立一個隱藏域,users是下拉列表數組
String hiddenSheet = "hiddenSheet";
XSSFSheet sheet_hidden = wb.createSheet(hiddenSheet);
wb.setSheetHidden(1, true);
for (int i = 0; i < users.length; i++)
    sheet_hidden.createRow(i)
            .createCell(0)
            .setCellValue(users[i]);
            
// 而後用公式去引用,隱藏域中的 A1:A user.length 就是上面設置的格子
String formula = hiddenSheet + "!$A$1:$A$" + users.length;

XSSFDataValidationConstraint dvConstraint_agent = 
    (XSSFDataValidationConstraint) dvHelper.createFormulaListConstraint(formula);
CellRangeAddressList addressList_agent = 
    new CellRangeAddressList(2, 11, 3, 3);
XSSFDataValidation validation_agent = 
    (XSSFDataValidation)dvHelper.createValidation(dvConstraint_agent, addressList_agent);
validation_agent.setShowErrorBox(true);

sheet.addValidationData(validation_agent);
相關文章
相關標籤/搜索