apache-poi - 有没有办法过滤掉 XSSFWorkbook.allNames 中的隐藏名称?
问题描述
我有兴趣使用 Apache POI 获取用户定义的命名范围列表(如 Excel 应用程序 UI 中所示)。
我可以使用XSSFName的静态属性过滤掉内置插件,但可能还有其他插件由插件等设置。下面是一个带有隐藏名称的(缩短的)真实示例:
<definedName name="user_named_range">...</definedName>
<definedName name="_xlnm._FilterDatabase" hidden="1">...</definedName>
<definedName name="CIQWBGuid" hidden="1">...</definedName>
<definedName name="ExactAddinConnection" hidden="1">...</definedName>
workbook.allNames
返回所有这些。如何识别user_named_range
为用户定义并跳过所有其他?
解决方案
直到现在还XSSFName
无法访问hidden
底层的属性CTDefinedName
。因此,如果需要,需要获得该底层CTDefinedName
. 不幸的是,该方法getCTName
仅具有受保护的访问权限。不过幸好有java.lang.reflect
。
例子:
import java.io.FileInputStream;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.xssf.usermodel.*;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDefinedName;
import java.lang.reflect.Method;
class ReadExcelXSSFNameDetails {
public static void main(String[] args) throws Exception {
XSSFWorkbook workbook = (XSSFWorkbook)WorkbookFactory.create(new FileInputStream("./inputFile.xlsm"));
for (XSSFName name : workbook.getAllNames()) {
String nameName = name.getNameName();
Method getCTName = XSSFName.class.getDeclaredMethod("getCTName");
getCTName.setAccessible(true);
CTDefinedName ctName = (CTDefinedName)getCTName.invoke(name);
//System.out.println(ctName);
boolean isHidden = ctName.getHidden();
System.out.println("Found name " + nameName + ". Is this name hidden? " + isHidden);
}
workbook.close();
}
}
现在您可以检测存储的名称是否具有隐藏属性集。
推荐阅读
- twilio - 使用 Angular 将屏幕共享添加到 Twilio Video 应用程序
- git - 将特定的 SVN 分支迁移到 GIT(2018 年迁移的主干)
- cypress - 如何使用柏树中的包含来断言是否存在特定字符串?
- php - PHPSpreadsheet 无法在 Excel 中获取注释
- java - Jetty 11 - HTTP/1.1 到 HTTP/2 升级,handler 怎么写?
- javascript - 在 TypeScript 中的另一个类型别名中传播类型别名
- weka - 在 Weka 中打开 CSV 数据集时,如何将属性转换为“日期”类型?
- python - 如何在networkx中找到几何子图的最近邻?
- c# - 不能在同一帧缝合网格
- tkinter - 如何使 tkinter 小部件全局化