导出Excel数据用的是EasyExcel插件,为了解决excel下拉框超过255无法正常显示问题,网上找了一大堆解决方案,都类似,wps都可以正常显示,但是office打开报部分内容有问题提示,踩了一波坑。
CellSelect 下拉框实体
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class CellSelect {
private int col;
private String[] values;
}
SelectSheetWriteHandler 下拉框写入处理类
public class SelectSheetWriteHandler implements SheetWriteHandler {
private List<CellSelect> cellSelectList;
private static final Integer LIMIT_NUMBER = 255;
public SelectSheetWriteHandler(List<CellSelect> cellSelectList) {
this.cellSelectList = cellSelectList;
}
@Override
public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
}
@Override
public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
if (cellSelectList == null) {
return;
}
for (int i = 0; i < cellSelectList.size(); i++) {
CellSelect cellSelect = cellSelectList.get(i);
CellRangeAddressList cellRangeAddressList = new CellRangeAddressList(1, 10000, cellSelect.getCol(), cellSelect.getCol());
DataValidationHelper helper = writeSheetHolder.getSheet().getDataValidationHelper();
if (cellSelect.getValues() != null && cellSelect.getValues().length > 0) {
String[] values = cellSelect.getValues();
if (getTotalLen(values)>=LIMIT_NUMBER){
addDropDownList(writeWorkbookHolder.getWorkbook(),writeSheetHolder.getSheet(),cellSelect.getValues(),cellRangeAddressList,cellSelect.getCol());
}else{
DataValidationConstraint constraint = helper.createExplicitListConstraint(cellSelect.getValues());
DataValidation dataValidation = helper.createValidation(constraint, cellRangeAddressList);
dataValidation.setSuppressDropDownArrow(true);
dataValidation.setShowErrorBox(true);
writeSheetHolder.getSheet().addValidationData(dataValidation);
}
}
}
}
public void addDropDownList(Workbook workbook, Sheet tarSheet, String[] menuItems, CellRangeAddressList cellRangeAddressList, int column)
{
String hiddenSheetName = "hiddenSheet" + (int) ((Math.random() * 9 + 1) * 100000);
Sheet hiddenSheet = workbook.createSheet(hiddenSheetName);
Row row = null;
Cell cell = null;
for (int i = 0; i < menuItems.length; i++)
{
row = hiddenSheet.createRow(i);
cell = row.createCell(column);
cell.setCellValue(menuItems[i]);
}
Name category1Name = workbook.createName();
category1Name.setNameName(hiddenSheetName);
String excelLine = getExcelLine(column);
String refers = hiddenSheetName + "!$" + excelLine + "$1:$" + excelLine + "$" + menuItems.length;
category1Name.setRefersToFormula(refers);
DataValidationHelper helper = tarSheet.getDataValidationHelper();
DataValidationConstraint constraint = helper.createFormulaListConstraint(hiddenSheetName);
DataValidation dataValidation = helper.createValidation(constraint, cellRangeAddressList);
dataValidation.setSuppressDropDownArrow(true);
dataValidation.setShowErrorBox(true);
tarSheet.addValidationData(dataValidation);
int hiddenIndex = workbook.getSheetIndex(hiddenSheetName);
if (!workbook.isSheetHidden(hiddenIndex)) {
workbook.setSheetHidden(hiddenIndex, true);
}
}
private Integer getTotalLen(String[] strs){
if(strs == null || strs.length == 0){
return 0;
}
int len = 0;
for(String str : strs){
len += str.length();
}
return len;
}
private String getExcelLine(int num) {
String line = "";
int first = num / 26;
int second = num % 26;
if (first > 0) {
line = (char) ('A' + first - 1) + "";
}
line += (char) ('A' + second) + "";
return line;
}
}
EasyExcel调用示例
private void writeSheet(ExcelWriter excelWriter, int num, DeviceSheetInfo deviceSheetInfo, List<CellSelect> cellSelectList) {
WriteSheet writeSheet = EasyExcel.writerSheet(deviceSheetInfo.getName())
.registerWriteHandler(new SelectSheetWriteHandler(cellSelectList)).head(deviceSheetInfo.getClazz()).build();
excelWriter.write(Collections.emptyList(), writeSheet);
}