Apache POI .xlsx 下拉框实现 https://my.oschina.net/u/3035165/blog/1530016
读取与创建 Excel
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/** * 创建 * 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(); |
单元格合并
1 2 3 4 5 6 7 8 |
// 创建工作表 XSSFSheet sheet = wb.createSheet("sheetName"); // 添加合并区域,第一行前三个格子 sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 3)); // 设置合并区域的值,cell为0、1、2都一样 sheet.createRow(0) .createCell(0) .setCellValue("cellValue"); |
单元格样式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
//创建样式对象、字体对象 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"); |
下拉框
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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和字节就会报错的问题
- 公式不能漏掉 $
- 与上面的区别只是创建了一个公式约束
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// 创建一个隐藏域,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); |