存在一个Excel文件,其中有列数据是下拉选择,且下拉的来源是在另外一个Sheet中
这个时候,我们使用POI对其进行解析,想获得数据验证的个数:sheet.getDataValidations()
public static void main(String[] args) throws Exception {
String filePath = "/Users/fujiexiang/ExcelWorkbook.xlsx";
Workbook workbook = WorkbookFactory.create(new FileInputStream(filePath));
Sheet sheet = workbook.getSheetAt(0);
System.out.println("" + dataValidations + " " + dataValidations.size());
}
这个时候,你会抓狂,明明Excel里面有下拉,代码得到的确实空,是不是很头大。。。
网上各种查找,终于。。。。。
找重点:简单来说,就是Apache POI是基于Excel2007的xml进行解析的,而Excel2007自身是不支持数据验证跨Sheet的。
这个时候你就会惊讶的得到一个结论,POI不支持跨Sheet设置validation的读取,仿佛世界末日到了。。。。
办法总比问题多,还是有大牛的。
import java.io.FileInputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddressList;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.xmlbeans.XmlObject;
import org.apache.xmlbeans.XmlCursor;
import javax.xml.namespace.QName;
class ReadExcelDataValidaton {
static java.util.List<XmlObject> getX14DataValidations(XSSFSheet sheet) {
java.util.List<XmlObject> x14DataValidations = new java.util.ArrayList<XmlObject>();
XmlCursor cursor = sheet.getCTWorksheet().newCursor();
cursor.selectPath(
"declare namespace x14='http://schemas.microsoft.com/office/spreadsheetml/2009/9/main' .//x14:dataValidation");
while(cursor.hasNextSelection()) {
cursor.toNextSelection();
XmlObject obj = cursor.getObject();
x14DataValidations.add(obj);
}
return x14DataValidations;
}
static void addXSSFX14DataValidations(XSSFSheet sheet, java.util.List<DataValidation> dataValidat