最近工作中出现了使用POI生成excel模板的需求,数据库签出了所有类型的excel生成下拉列表,供用户选择。
使用的POI版本为3.14
两种方案中的第一个缺点是列表数据量不能超过128。
方案1
public static hssf workbook write(inputstream inputstream)throws io exception、classnotfoundexception {
//第一个工作手册
hssf workbook workbook=new hssf workbook(input stream);
//创建图纸
Hssf工作表=workbook . get sheet at(0);
//准备下拉数据
String[] strs=new String[] { '刘德华','张学友','黎明','郭福清' };
//设置第一列中1-10行为的下拉列表
cellrangeaddresslistregions=new cellrangeaddresslist(0,9,0,0);
//创建下拉数据
dv constraint constraint=dv con(strs);
//绑定
hssfdatavalidation datavalidation=new hssfdatavalidation(regions,constraint);
(数据验证);
《返回工作手册》;
}
方案2
方案2的想法是在excel中添加隐藏的工作表存储数据源(下拉数据),并将属性写入实际上需要下拉列表的工作表单元格。
1.需要使用的util类
package com . excel . select;
import Java . io . input stream;
Importorg.a
Import org.aStyle
Importorg.a
Importorg.a
Importorg.a
Importorg.a
Importorg.a
Importorg.a
Import org.aStyle
Importorg.a
Importorg.a
Importorg.a
Importorg.a
Importorg.a
/* *
Ca类实施说明
*
* @author
*/
Public class CatalogExcelUtil {
/* *
*创建工作簿
*
* @param in
* @return
* @throws Exception
*/
public static workbook create workbook(inputstream in)throws exception {
Try {
Return new HSSFWorkbook(in):
} finally {
If (in)!=空){
in . close();
}
}
}
/* *
*获取单个单元格字符串值
*
* @param cell
* @return
*/
public static string getcellstringvalue(单元格单元格){
If (cell==null) {
Return
}
cell . setcelltype);
富文本字符串str=cell . getrichstringcellvalue();
return();
}
/* *
*初始化Excel储存格、设定储存格值和型式
*
* @param cell
* @param style
* @param value
*/
public static void init cell(cell cell、cellstyle style、string value) {
Cell.setcellstyle(样式);
Cell.setcellvalue(值);
}
/* *
*初始化Excel储存格、设定储存格值、型式和注解
*
* @param cell
* @param styl
e * @param value * @param comment */ public static void initCell(Cell cell, CellStyle style, String value, Comment comment) { cell.setCellStyle(style); cell.setCellValue(value); cell.setCellComment(comment); } /** * 获取Excel单元格备注 * * @param drawing * @param anchor * @param content * @return */ public static Comment getCellComment(Drawing drawing, HSSFClientAnchor anchor, String content) { Comment comment = drawing.createCellComment(anchor); comment.setString(new HSSFRichTextString(content)); return comment; } /** * 获取Excel标题单元格样式 * * @param wb * @return */ public static CellStyle getHeadStyle(Workbook wb) { CellStyle style = wb.createCellStyle(); ); ); ); ); ); ); Font font = wb.createFont(); ); // 粗体 (font); (true); return style; } /** * 获取Excel数据单元格样式 * * @param wb * @return */ public static CellStyle getBodyStyle(Workbook wb) { CellStyle style = wb.createCellStyle(); ); ); ); ); return style; } /** * 获取Excel错误单元格样式 * * @param wb * @return */ public static CellStyle getErrorStyle(Workbook wb) { CellStyle style = wb.createCellStyle(); Font font = wb.createFont(); ); (font); return style; } }2.Test类
package com.excel.select; import java.io.FileOutputStream; import org.a; import org.a; import org.a; import org.a; import org.a; import org.a; import org.a; import org.a; import org.a; import org.aStyle; import org.a; import org.a; import org.a; public class Test3 { public static void main(String[] args) throws Exception { Workbook wb = new HSSFWorkbook(); Sheet sheet = wb.createSheet("导入模板"); // 第一行 Row row = (0); CellStyle style = Ca(wb); Ca(0), style, "第1列列头"); Ca(1), style, "第2列列头"); Ca(2), style, "部门"); Ca(3), style, "层级"); Ca(4), style, "第5列列头"); Ca(5), style, "第6列列头"); // 设置部门 String[] departSelectList = new String[] { "刘德华", "张学友", "黎明", "郭富城", "金城武", "梁朝伟" }; // 第3列的第1行到第21行单元格部门下拉 ,可替换为从数据库的部门表数据, // hidden_depart 为隐藏的sheet的别名,1为这个sheet的索引 ,考虑到有多个列绑定下拉列表 wb = dropDownList2003(wb, sheet, departSelectList, 1, 20, 2, 2, "hidden_depart", 1); // 设置层级 String[] levelSelectList = new String[] { "科比", "詹姆斯", "库里", "麦迪", "艾弗森" }; for (int i = 0; i < levelSelec; i++) { } wb = dropDownList2003(wb, sheet, levelSelectList, 1, 20, 3, 3, "hidden_level", 2); FileOutputStream stream = new FileOutputStream("d:\\;); wb.write(stream); (); } /** * @param wb HSSFWorkbook对象 * @param realSheet 需要操作的sheet对象 * @param datas 下拉的列表数据 * @param startRow 开始行 * @param endRow 结束行 * @param startCol 开始列 * @param endCol 结束列 * @param hiddenSheetName 隐藏的sheet名 * @param hiddenSheetIndex 隐藏的sheet索引 * @return * @throws Exception */ public static HSSFWorkbook dropDownList2003(Workbook wb, Sheet realSheet, String[] datas, int startRow, int endRow, int startCol, int endCol, String hiddenSheetName, int hiddenSheetIndex) throws Exception { HSSFWorkbook workbook = (HSSFWorkbook) wb; // 创建一个数据源sheet HSSFSheet hidden = workbook.createSheet(hiddenSheetName); // 数据源sheet页不显示 workbook.setSheetHidden(hiddenSheetIndex, true); // 将下拉列表的数据放在数据源sheet上 HSSFRow row = null; HSSFCell cell = null; for (int i = 0, length = da; i < length; i++) { row = (i); cell = row.createCell(0); cell.setCellValue(datas[i]); } //2016-12-15更新,遇到问题:生成的excel下拉框还是可以手动编辑,不满足 //HSSFName namedCell = workbook.createName(); (hiddenSheetName); // A1 到 Ada 表示第一列的第一行到da行,需要与前一步生成的隐藏的数据源sheet数据位置对应 (hiddenSheetName + "!$A$1:$A" + da); // 指定下拉数据时,给定目标数据范围 hiddenSheetName!$A$1:$A5 隐藏sheet的A1到A5格的数据 DVConstraint constraint = DVCon(hiddenSheetName + "!$A$1:$A" + da); CellRangeAddressList addressList = null; HSSFDataValidation validation = null; row = null; cell = null; // 单元格样式 CellStyle style = workbook.createCellStyle(); ("0")); ); ); // 循环指定单元格下拉数据 for (int i = startRow; i <= endRow; i++) { row = (HSSFRow) realS(i); cell = row.createCell(startCol); cell.setCellStyle(style); addressList = new CellRangeAddressList(i, i, startCol, endCol); validation = new HSSFDataValidation(addressList, constraint); realS(validation); } return workbook; } }
1.《【poi怎么设置excel】POI Java excel生成下拉列表》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《【poi怎么设置excel】POI Java excel生成下拉列表》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/keji/2542824.html