最近想在看下poi导出excel,先看下单元格带下拉框效果怎么实现,其他的还在慢慢研究。本文参考了:
http://poi.apache.org/spreadsheet/quick-guide.html
直接上代码了:
数据源如下:
String dropDataSource = null; StringBuffer sb = new StringBuffer(); for (int i = 100; i >= 20; i--) { sb.append(i).append(","); } sb = sb.deleteCharAt(sb.length() - 1); dropDataSource = sb.toString();
excel 2003实现代码如下:
public static void dropDownList42003(String dataSource, String filePath) throws Exception { HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet realSheet = workbook.createSheet("下拉列表测试"); String[] datas = dataSource.split("\\,"); DVConstraint dvConstraint = DVConstraint .createExplicitListConstraint(datas); CellRangeAddressList addressList = null; HSSFDataValidation validation = null; for (int i = 0; i < 100; i++) { addressList = new CellRangeAddressList(i, i, 0, 0); validation = new HSSFDataValidation(addressList, dvConstraint); // 03 默认setSuppressDropDownArrow(false) // validation.setSuppressDropDownArrow(false); // validation.setShowErrorBox(true); validation.setShowErrorBox(false);// 取消弹出错误框 realSheet.addValidationData(validation); } FileOutputStream stream = new FileOutputStream(filePath); workbook.write(stream); stream.close(); addressList = null; validation = null; }
效果为:
excel 2007实现如下:
public static void dropDownList42007(String dataSource, String filePath) throws Exception { XSSFWorkbook workbook = new XSSFWorkbook(); XSSFSheet sheet = workbook.createSheet("下拉列表测试"); String[] datas = dataSource.split("\\,"); XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper(sheet); XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint) dvHelper .createExplicitListConstraint(datas); CellRangeAddressList addressList = null; XSSFDataValidation validation = null; for (int i = 0; i < 100; i++) { addressList = new CellRangeAddressList(i, i, 0, 0); validation = (XSSFDataValidation) dvHelper.createValidation( dvConstraint, addressList); // 07默认setSuppressDropDownArrow(true); // validation.setSuppressDropDownArrow(true); // validation.setShowErrorBox(true); sheet.addValidationData(validation); } FileOutputStream stream = new FileOutputStream(filePath); workbook.write(stream); stream.close(); addressList = null; validation = null; }
效果如下:
注意上面的数据源大小,只从100到20,到10的话,excel 2003创建报错,错误信息为:
Exception in thread "main" java.lang.IllegalArgumentException: String literals in formulas can't be bigger than 255 characters ASCII at org.apache.poi.ss.formula.ptg.StringPtg.<init>(StringPtg.java:65) at org.apache.poi.hssf.usermodel.DVConstraint.createListFormula(DVConstraint.java:412) at org.apache.poi.hssf.usermodel.DVConstraint.createFormulas(DVConstraint.java:385) at org.apache.poi.hssf.usermodel.HSSFDataValidation.createDVRecord(HSSFDataValidation.java:195) at org.apache.poi.hssf.usermodel.HSSFSheet.addValidationData(HSSFSheet.java:396)
excel 2007创建不报错,但是下拉框出不来。如果数据源很多,建议引用另一个sheet页的数据。
数据源如下:
sb = new StringBuffer(); for (int i = 200; i >= 0; i--) { sb.append(i).append(","); } sb = sb.deleteCharAt(sb.length() - 1); dropDataSource = sb.toString();
excel 2003实现如下:
public static void dropDownList2003(String dataSource, String filePath) throws Exception { HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet realSheet = workbook.createSheet("下拉列表测试"); HSSFSheet hidden = workbook.createSheet("hidden"); //数据源sheet页不显示 workbook.setSheetHidden(1, true); String[] datas = dataSource.split("\\,"); CellStyle style = workbook.createCellStyle(); style.setDataFormat(HSSFDataFormat.getBuiltinFormat("0")); style.setAlignment(CellStyle.ALIGN_CENTER); style.setVerticalAlignment(CellStyle.VERTICAL_CENTER); HSSFRow row = null; HSSFCell cell = null; for (int i = 0, length = datas.length; i < length; i++) { row = hidden.createRow(i); cell = row.createCell(0); cell.setCellValue(Integer.valueOf(datas[i])); } Name namedCell = workbook.createName(); namedCell.setNameName("hidden"); namedCell.setRefersToFormula("hidden!A1:A" + datas.length); DVConstraint constraint = DVConstraint .createFormulaListConstraint("hidden"); CellRangeAddressList addressList = null; HSSFDataValidation validation = null; row = null; cell = null; for (int i = 0; i < 100; i++) { row = realSheet.createRow(i); cell = row.createCell(0); cell.setCellStyle(style); addressList = new CellRangeAddressList(i, i, 0, 0); validation = new HSSFDataValidation(addressList, constraint); realSheet.addValidationData(validation); validation.setShowErrorBox(false);// 取消弹出错误框 } FileOutputStream stream = new FileOutputStream(filePath); workbook.write(stream); stream.close(); style = null; addressList = null; validation = null; }
效果为:
excel 2007实现如下:
public static void dropDownList2007(String dataSource, String filePath) throws Exception { XSSFWorkbook workbook = new XSSFWorkbook(); XSSFSheet sheet = workbook.createSheet("下拉列表测试"); XSSFSheet hidden = workbook.createSheet("hidden"); //数据源sheet页不显示 workbook.setSheetHidden(1, true); String[] datas = dataSource.split("\\,"); CellStyle style = workbook.createCellStyle(); style.setDataFormat(HSSFDataFormat.getBuiltinFormat("0")); style.setAlignment(CellStyle.ALIGN_CENTER); style.setVerticalAlignment(CellStyle.VERTICAL_CENTER); XSSFRow row = null; XSSFCell cell = null; for (int i = 0, length = datas.length; i < length; i++) { row = hidden.createRow(i); cell = row.createCell(0); cell.setCellValue(Integer.valueOf(datas[i])); } Name namedCell = workbook.createName(); namedCell.setNameName("hidden"); namedCell.setRefersToFormula("hidden!A1:A" + datas.length); XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper(sheet); XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint) dvHelper .createFormulaListConstraint("hidden"); CellRangeAddressList addressList = null; XSSFDataValidation validation = null; for (int i = 0; i < 100; i++) { row = sheet.createRow(i); cell = row.createCell(0); cell.setCellStyle(style); addressList = new CellRangeAddressList(i, i, 0, 0); validation = (XSSFDataValidation) dvHelper.createValidation( dvConstraint, addressList); sheet.addValidationData(validation); } FileOutputStream stream = new FileOutputStream(filePath); workbook.write(stream); stream.close(); addressList = null; validation = null; }
效果如下:
说明:如果你没有上面的效果或者报错,请检查poi架包的版本,或者使用版本高些的poi,我使用的是poi 3.10最新版。谢谢。
全文完。