最近做到導出功能經常用到,在此記錄實現方式,首先導入maven poi 依賴,使用已存在的模板測試
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.0.0</version>
</dependency>
實現方式一:
手動添加下拉選項,但是這種單元格不能超過255個字符,如果只是簡單的下拉數據,可以使用這種方便。
/**
* 設置下拉框
*
* @param sheet 指定sheet頁
* @param values 下拉框的值
* @param firstRow 起始行號
* @param lastRow 起始行號
* @param firstCol 起始列號
* @param lastCol 終止列號
*
* @author zengwei
* @email 1014483974@qq.com
* @date 2021-05-30
*
* 能日賺30的APP試玩平台推薦,親測有效、
* (https://mp.weixin.qq.com/s/V5j45WYoyIvFsZbua56RSQ)
*/
public static void setDropDownBox(XSSFSheet sheet, String[] values, Integer firstRow, Integer lastRow, Integer
firstCol, Integer lastCol) {
XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper(sheet);
XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint) dvHelper.createExplicitListConstraint(values);
CellRangeAddressList addressList = new CellRangeAddressList(firstRow, lastRow, firstCol, lastCol);
DataValidation validation = dvHelper.createValidation(dvConstraint, addressList);
//這兩行設置單元格只能是列表中的內容,否則報錯
validation.setSuppressDropDownArrow(true);
validation.setShowErrorBox(true);
sheet.addValidationData(validation);
}
調用方法
/**
* 生成excel下拉框
*
* @author zengwei
* @email 1014483974@qq.com
* @date 2021-05-30
*/
public static void main(String[] args) {
FileOutputStream out = null;
File file = new File("F://test.xlsx");
try (XSSFWorkbook wb = new XSSFWorkbook(file)) {
// 選中指定sheet
XSSFSheet sheet = wb.getSheetAt(wb.getSheetIndex("sheet1"));
String[] values = {"blue", "red", "black"};
setDropDownBox(sheet, values, 1, 100, 0, 0);
// 寫入文件
String outFile = "F://" + RandomUtil.randomString(10) + ".xlsx";
out = new FileOutputStream(outFile);
wb.write(out);
} catch (InvalidFormatException | IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
生成的模板效果
實現方式二:
從單元格選擇下拉選項,手動添加下拉選項單元格不能超過255個字符,否則會報A valid formula or a list of values must be less than or equal to 255 characters (including separators).
。
我們需要創建一個隱藏的sheet,從隱藏的sheet頁獲取單元格內容作為下拉選項。
/**
* 設置下拉框數據
*
* @param wb 表格對象
* @param typeName 要渲染的sheet名稱
* @param values 下拉框的值
* @param firstCol 起始列號
* @param lastCol 終止列號
*
* @author zengwei
* @email 1014483974@qq.com
* @date 2021-05-30
*
* 能日賺30的APP試玩平台推薦,親測有效
* (https://mp.weixin.qq.com/s/V5j45WYoyIvFsZbua56RSQ)
*/
public void setDropDownBox(XSSFWorkbook wb, String typeName, String[] values, Integer firstCol, Integer lastCol) {
//獲取所有sheet頁個數
int sheetTotal = wb.getNumberOfSheets();
//處理下拉數據
if (values != null && values.length != 0) {
//新建一個sheet頁
String hiddenSheetName = "hiddenSheet";
XSSFSheet hiddenSheet = wb.getSheet(hiddenSheetName);
if (hiddenSheet == null) {
hiddenSheet = wb.createSheet(hiddenSheetName);
//寫入下拉數據到新的sheet頁中
for (int i = 0; i < values.length; i++) {
XSSFRow row = hiddenSheet.createRow(i);
XSSFCell cell = row.createCell(0);
cell.setCellValue(values[i]);
}
//將新建的sheet頁隱藏掉
wb.setSheetHidden(sheetTotal, true);
}
//獲取新sheet頁內容
String strFormula = hiddenSheetName + "!$A$1:$A$65535";
XSSFDataValidationConstraint constraint = new XSSFDataValidationConstraint(DataValidationConstraint.ValidationType.LIST, strFormula);
// 設置數據有效性加載在哪個單元格上,四個參數分別是:起始行、終止行、起始列、終止列
CellRangeAddressList regions = new CellRangeAddressList(0, 65535, firstCol, lastCol);
// 數據有效性對象
DataValidationHelper help = new XSSFDataValidationHelper(hiddenSheet);
DataValidation validation = help.createValidation(constraint, regions);
XSSFSheet sheet1 = wb.getSheet(typeName);
sheet1.addValidationData(validation);
}
}
調用方法
/**
* 生成excel下拉框
*
* @author zengwei
* @email 1014483974@qq.com
* @date 2021-05-30
*/
@Test
public void test() {
List<FreightTemplate> list = freightTemplateService.list();
List<String> nameList = list.stream().map(FreightTemplate::getName).collect(Collectors.toList());
String[] values = Convert.toStrArray(nameList);
// 導出excel到指定位置
FileOutputStream out = null;
File file = new File("F://test.xlsx");
try (XSSFWorkbook wb = new XSSFWorkbook(file)) {
// 選中指定sheet
setDropDownBox(wb, "sheet1", values, 0, 0);
// 寫入文件
String outFile = "F://" + RandomUtil.randomString(10) + ".xlsx";
out = new FileOutputStream(outFile);
wb.write(out);
} catch (InvalidFormatException | IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
生成的模板效果
右鍵點擊sheet,可以看見后面是有隱藏的sheet的,這個隱藏sheet的單元格數據,就是我們下拉顯示的數據。
以上是對excel導出生成下拉框的兩種方式的總結,希望能幫助到更多的開發者。