Java POI解析Excel的跨Sheet读取数据验证下拉值

当处理含有跨Sheet下拉选择的Excel文件时,使用Apache POI解析会发现无法获取数据验证。原因是POI基于Excel2007的XML解析,不支持跨Sheet数据验证的读取。虽然有解决方法,但对于Excel2003,由于其本身不支持这种设置,所以无法通过POI实现。解决方案是使用特定工具类的方法替代POI的getDataValidations。在设置低版本Excel的跨Sheet下拉时,需利用自定义名称。
摘要由CSDN通过智能技术生成

存在一个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
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值