如何通过UNO为每个打开的文档存储临时数据?
问题:在LibreOffice进程中按文档存储临时配置值
我有一些配置值(整数和字符串)会传递给启动程序,之后在扩展中需要使用并修改。这些值因文档而异,但不能随文档保存。请问能否直接在LibreOffice进程中存储这些值?我已获取或可获取文档的XStorable引用。目前我尝试在文档上使用XPropertyContainer.addProperty(...),但传入的值似乎是全局存储而非按文档存储,代码如下:
XDocumentPropertiesSupplier xDocumentPropertiesSupplier = UnoRuntime.queryInterface(XDocumentPropertiesSupplier.class, document); XDocumentProperties xDocumentProperties = xDocumentPropertiesSupplier.getDocumentProperties(); XPropertyContainer xPropertyContainer = xDocumentProperties.getUserDefinedProperties(); xPropertyContainer.addProperty(propertyName, PropertyAttribute.TRANSIENT | PropertyAttribute.MAYBEDEFAULT, propertyValue);
解决方案
当然可以实现按文档存储这类临时配置值!你当前的思路其实是对的,大概率是测试细节或者实例引用的问题让你误以为值是全局共享的,咱们来调整下实现方式,确保值严格绑定到单个文档:
1. 先确认文档实例的准确性
首先要排查你操作的document对象是不是当前目标文档的真实实例——如果不小心用了全局应用对象或者错误的文档引用,就会出现“全局存储”的错觉。比如你可以通过扩展事件回调里的文档参数,或者通过XComponentContext获取当前活跃文档,确保每次操作的都是对应文档的实例。
2. 验证现有代码的正确性
你的代码逻辑本身没问题,TRANSIENT标记已经确保属性不会随文档保存到磁盘,而且用户自定义属性是和文档绑定的。你可以加一段验证代码,添加属性后立即从同一文档实例读取,确认值是属于该文档的:
// 添加属性后,从当前文档的用户自定义属性集中读取验证 XPropertySet xPropertySet = UnoRuntime.queryInterface(XPropertySet.class, xPropertyContainer); Object retrievedValue = xPropertySet.getPropertyValue(propertyName); // 对比retrievedValue和你传入的propertyValue,确认是否匹配当前文档
如果在不同文档中用同一个属性名,读取到的值应该是各自独立的。
3. 更直接的替代方案:绑定到文档核心模型
如果还是觉得用户自定义属性的方式有问题,咱们可以直接在文档的核心模型上添加临时属性,比如针对Writer文档的写法:
// 获取文档的PropertySet实例 XPropertySet docPropertySet = UnoRuntime.queryInterface(XPropertySet.class, document); // 添加临时属性,TRANSIENT确保不写入文档文件 docPropertySet.addProperty("MyTempConfigKey", PropertyAttribute.TRANSIENT | PropertyAttribute.MAYBEDEFAULT, initialValue); // 读取属性值 Object currentValue = docPropertySet.getPropertyValue("MyTempConfigKey"); // 修改属性值 docPropertySet.setPropertyValue("MyTempConfigKey", updatedValue);
这种方式下,属性直接附着在文档实例上,每个文档的属性完全独立,绝对不会出现全局共享的情况。
关键提醒
- 所有操作必须针对具体的文档实例,绝对不能复用全局的文档引用
PropertyAttribute.TRANSIENT是核心,一定要加上,否则属性会被保存到文档里- 如果跨扩展组件访问这些值,务必通过同一个文档实例的接口操作,别搞混不同文档的属性
内容的提问来源于stack exchange,提问作者A developer
相关产品推荐
相关产品推荐

