Browse Source

fix select bug

Looly 5 years ago
parent
commit
9a68d4299f

+ 1 - 0
CHANGELOG.md

@@ -14,6 +14,7 @@
 
 ### Bug修复
 * 【core   】     修复NumberWordFormatter拼写错误(issue#799@Github)
+* 【poi    】     修复xls文件下拉列表无效问题(issue#I1C79P@Gitee)
 
 -------------------------------------------------------------------------------------------------------------
 ## 5.2.4

+ 16 - 20
hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelWriter.java

@@ -15,20 +15,18 @@ import cn.hutool.core.util.URLUtil;
 import cn.hutool.poi.excel.cell.CellLocation;
 import cn.hutool.poi.excel.cell.CellUtil;
 import cn.hutool.poi.excel.style.Align;
-import org.apache.poi.hssf.usermodel.DVConstraint;
-import org.apache.poi.hssf.usermodel.HSSFDataValidation;
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.CellStyle;
 import org.apache.poi.ss.usermodel.DataValidation;
+import org.apache.poi.ss.usermodel.DataValidationConstraint;
+import org.apache.poi.ss.usermodel.DataValidationHelper;
 import org.apache.poi.ss.usermodel.Font;
 import org.apache.poi.ss.usermodel.HeaderFooter;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.poi.ss.util.CellRangeAddressList;
-import org.apache.poi.xssf.usermodel.XSSFDataValidationConstraint;
-import org.apache.poi.xssf.usermodel.XSSFDataValidationHelper;
-import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFDataValidation;
 
 import java.io.File;
 import java.io.IOException;
@@ -569,22 +567,20 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
 	 * @since 4.6.2
 	 */
 	public ExcelWriter addSelect(CellRangeAddressList regions, String... selectList) {
-		final DVConstraint constraint = DVConstraint.createExplicitListConstraint(selectList);
-		
-		// 绑定
-		DataValidation dataValidation;
-		
-		if(this.sheet instanceof XSSFSheet) {
-			final XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper((XSSFSheet)sheet);
-			final XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint) dvHelper.createExplicitListConstraint(selectList);
-			dataValidation = dvHelper.createValidation(dvConstraint, regions);
-		} else {
-			dataValidation = new HSSFDataValidation(regions, constraint);
+		final DataValidationHelper validationHelper = this.sheet.getDataValidationHelper();
+		final DataValidationConstraint constraint = validationHelper.createExplicitListConstraint(selectList);
+
+		//设置下拉框数据
+		final DataValidation dataValidation = validationHelper.createValidation(constraint, regions);
+
+		//处理Excel兼容性问题
+		if(dataValidation instanceof XSSFDataValidation) {
+			dataValidation.setSuppressDropDownArrow(true);
+			dataValidation.setShowErrorBox(true);
+		}else {
+			dataValidation.setSuppressDropDownArrow(false);
 		}
-		
-		dataValidation.setSuppressDropDownArrow(true);
-		dataValidation.setShowErrorBox(true);
-		
+
 		return addValidationData(dataValidation);
 	}
 

+ 2 - 3
hutool-poi/src/test/java/cn/hutool/poi/excel/test/ExcelWriteTest.java

@@ -419,9 +419,9 @@ public class ExcelWriteTest {
 	}
 
 	@Test
-	@Ignore
+//	@Ignore
 	public void addSelectTest2() {
-		ExcelWriter writer = ExcelUtil.getWriter(true);
+		ExcelWriter writer = ExcelUtil.getWriter("d:/test/select.xls");
 		writer.writeCellValue(0, 0, "请选择科目");
 		int firstRow = 0;
 		int lastRow = 0;
@@ -433,7 +433,6 @@ public class ExcelWriteTest {
 		List<?> rows = new ArrayList<>();
 		writer.write(rows, true);
 
-		writer.flush(FileUtil.file("d:/test/select.xlsx"));
 		writer.close();
 	}