标题数据下拉选工具类如下:
/**
* * excel导出,有码值的数据使用下拉框展示。解决下拉框最多255个字符的问题。
* * 原理为新建一个隐藏状态的sheet页,用来存储下拉框的值。
* * @param wb 工作簿 HSSFWorkbook
* * @param col 当前列名
* * @param boxMap 码值集合
* * @param rows 正常sheet页数据,用来指定哪些行需要添加下拉框
* * @param i 多个码值需要添加下拉,隐藏状态的sheet页名称不能重复,添加i值区分。
* * @param colToIndex 用来指定哪些列需要添加下拉框
* * @return dataValidation
*/
public static HSSFDataValidation createBox1(HSSFWorkbook wb, String col, Map<String, String> boxMap, int rows, int i, int colToIndex) {
HSSFDataValidation dataValidation = null;
String cols = "";
//查询码值集合,获取当前列的码值。
if (null != boxMap.get(col)) {
cols = boxMap.get(col);
}
//新建隐藏状态的sheet,用来存储码值。
if (cols.length() > 0 && null != cols) {
String str[] = cols.split(",");
//创建sheet页
HSSFSheet sheet = wb.createSheet("hidden" + i);
//向创建的sheet页添加码值数据。
for (int i1 = 0; i1 < str.length; i1++) {
HSSFRow row = sheet.createRow(i1);
HSSFCell cell = row.createCell((int) 0);
cell.setCellValue(str[i1]);
}
//将码值sheet页做成excel公式
Name namedCell = wb.createName();
namedCell.setNameName("hidden" + i);
namedCell.setRefersToFormula("hidden" + i + "!$A$1:$A$" + str.length);
//确定要在哪些单元格生成下拉框
DVConstraint dvConstraint = DVConstraint.createFormulaListConstraint("hidden" + i);
CellRangeAddressList regions = new CellRangeAddressList(1, rows, colToIndex, colToIndex);
dataValidation = new HSSFDataValidation(regions, dvConstraint);
//隐藏码值sheet页
int sheetNum = wb.getNumberOfSheets();
for (int n = 1; n < sheetNum; n++) {
wb.setSheetHidden(n, true);
}
}
return dataValidation;
}
/**
* * excel导出,有码值的数据使用下拉框展示。
* * @param col 列名
* * @param boxMap 码值集合
* * @param firstRow 插入下拉框开始行号
* * @param lastRow 插入下拉框结束行号
* * @param firstCol 插入下拉框开始列号
* * @param lastCol 插入下拉框结束行号
* * @return
*/
public static HSSFDataValidation createBox(String col, Map<String, List<String>> boxMap, int firstRow, int lastRow, int firstCol, int lastCol) {
HSSFDataValidation dataValidation = null;
//查询码值表
List<String> cols = new ArrayList<>();
if (null != boxMap.get(col)) {
cols = boxMap.get(col);
}
//设置下拉框
if (cols.size() > 0 && null != cols) {
//list转数组
String[] str = cols.toArray(new String[cols.size()]);
//指定0-9行,0-0列为下拉框
CellRangeAddressList cas = new CellRangeAddressList(firstRow, lastRow, firstCol, lastCol);
//创建下拉数据列
DVConstraint dvConstraint = DVConstraint.createExplicitListConstraint(str);
//将下拉数据放入下拉框
dataValidation = new HSSFDataValidation(cas, dvConstraint);
}
return dataValidation;
}
//设置样式
public static HSSFCellStyle createCellStyle(HSSFCellStyle cellStyle, HSSFFont font, Boolean flag, HSSFRow row) {
//设置边框
//下
cellStyle.setBorderBottom(BorderStyle.THIN);
//左
cellStyle.setBorderLeft(BorderStyle.THIN);
//上
cellStyle.setBorderTop(BorderStyle.THIN);
//右
cellStyle.setBorderRight(BorderStyle.THIN);
//垂直居中
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
//设置大小
cellStyle.setFont(font);
//背景色填充整个单元格
cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
//填充背景色
cellStyle.setFillBackgroundColor(IndexedColors.YELLOW.getIndex());
return cellStyle;
}
//创建HSSFWorkbook对象
HSSFWorkbook workbook = new HSSFWorkbook();
//创建sheet对象
HSSFSheet sheet = workbook.createSheet();
//列名样式
HSSFFont colFont = workbook.createFont();
colFont.setFontName("宋体");
colFont.setFontHeightInPoints((short) 10);//字体大小
//设置表格列宽
sheet.setDefaultColumnWidth(10);
sheet.setColumnWidth(0, 6000);
sheet.setColumnWidth(1, 6000);
sheet.setColumnWidth(2, 6000);
sheet.setColumnWidth(3, 6000);
sheet.setColumnWidth(4, 6000);
//第一行表头
HSSFRow row = sheet.createRow(0);
HSSFCellStyle style = ExcelUtil.createCellStyle(workbook.createCellStyle(), colFont, true, row);
sheet.setDefaultColumnStyle(0, style);
对于下拉选字节长度超过355的问题
将以下:
HSSFDataValidation dataValidation = ExcelUtil.createBox(title.get(i), boxMap, 0, 1000, 3, 5);
sheet.addValidationData(dataValidation);
换成:
HSSFWorkbook hssfWorkbook = sheet.getWorkbook();
HSSFSheet hidden = hssfWorkbook.createSheet("hidden");
HSSFCell hssfCell = null;
String[] dataArray = boxMap.get(title.get(i)).toArray(new String[boxMap.get(title.get(i)).size()]);
for (int s =0; s < dataArray.length; s++){
String name =dataArray[s];
HSSFRow hssfRow = hidden.createRow(s);
hssfCell = hssfRow.createCell(0);
hssfCell.setCellValue(name);
}
Name name = hssfWorkbook.createName();
name.setNameName("hidden");
name.setRefersToFormula("hidden!$C$1:$A$"+dataArray.length);
hssfWorkbook.setSheetHidden(1,true);
DVConstraint constraint = DVConstraint.createFormulaListConstraint("hidden");
//列开始0结束1000行开始2行结束2
CellRangeAddressList addressList = new CellRangeAddressList(0,1000,2,2);
HSSFDataValidation dataValidation = new HSSFDataValidation(addressList,constraint);
sheet.addValidationData(dataValidation);
中文过滤
/**
* 过滤掉中文
* @param str 待过滤中文的字符串
* @return 过滤掉中文后字符串
*/
public static String filterChinese(String str,boolean flag) {
// 用于返回结果
String result = str;
// 包含中文
if (flag) {// 包含中文
// 用于拼接过滤中文后的字符
StringBuffer sb = new StringBuffer();
// 用于校验是否为中文
boolean flag2 = false;
// 用于临时存储单字符
char chinese = 0;
// 5.去除掉文件名中的中文
// 将字符串转换成char[]
char[] charArray = str.toCharArray();
// 过滤到中文及中文字符
for (int i = 0; i < charArray.length; i++) {
chinese = charArray[i];
flag2 = isChinese(chinese);
if (!flag2) {// 不是中日韩文字及标点符号
sb.append(chinese);
}
}
result = sb.toString();
}
//去空格
return result.trim();
}
/**
* 判定输入的是否是汉字
*
* @param c
* 被校验的字符
* @return true代表是汉字
*/
public static boolean isChinese(char c) {
Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
|| ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
return true;
}
return false;
}
其他校验:
/**
* 校验String是否全是中文
*
* @param name
* 被校验的字符串
* @return true代表全是汉字
*/
public static boolean checkNameChese(String name) {
boolean res = true;
char[] cTemp = name.toCharArray();
for (int i = 0; i < name.length(); i++) {
if (!isChinese(cTemp[i])) {
res = false;
break;
}
}
return res;
}
/**
* 校验某个字符是否是a-z、A-Z、_、0-9
*
* @param c
* 被校验的字符
* @return true代表符合条件
*/
public static boolean isWord(char c) {
String regEx = "[\\w]";
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher("" + c);
return m.matches();
}
/**
* 验证是否是汉字或者0-9、a-z、A-Z
*
* @param c
* 被验证的char
* @return true代表符合条件
*/
public static boolean isRightChar(char c) {
return isChinese(c) || isWord(c);
}
/**
* 验证字符串内容是否包含下列非法字符<br>
* `~!#%^&*=+\\|{};:'\",<>/?○●★☆☉♀♂※¤╬の〆
*
* @param content
* 字符串内容
* @return 't'代表不包含非法字符,otherwise代表包含非法字符。
*/
public static char validateLegalString(String content) {
String illegal = "`~!#%^&*=+\\|{};:'\",<>/?○●★☆☉♀♂※¤╬の〆";
char isLegalChar = 't';
L1: for (int i = 0; i < content.length(); i++) {
for (int j = 0; j < illegal.length(); j++) {
if (content.charAt(i) == illegal.charAt(j)) {
isLegalChar = content.charAt(i);
break L1;
}
}
}
return isLegalChar;
}
/**
* 校验一个字符是否是汉字
*
* @param c
* 被校验的字符
* @return true代表是汉字
*/
public static boolean isChineseChar(String c) {
try {
return c.getBytes("UTF-8").length > 1;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return false;
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。