直接回答
应把 XLSX 当作结构化 Open XML package,而不是已解释好的二维字符串表。单元格可引用 shared string,也可保存 inline string、数字、Boolean 或 error。公式和缓存值也要分开;shared formula follower 可带 group metadata 而没有完整内联表达式。若解析库只返回便捷字符串,原始类型、缓存和公式来源可能被隐藏。应分别保留原始表示和派生展示值。 SpreadsheetML `f` 元素可以保存公式文本,单元格也可能有 `v` 元素保存缓存结果,但并非每个公式单元格都有内联公式文本。Shared-formula follower 可标记 `t="shared"` 并带 `si` group index,而不保存表达式;应按准确 parser 合同找到 master 解析公式,master 缺失或无法唯一定位时标 unresolved。缓存是历史保存结果,不表示导入时重算,也不证明公式当前有效。缓存缺失/过期、外部引用、不支持函数或 shared formula 未解析时,当前结果未知。只读导入不得暗中访问外链或调用计算引擎。 字符串也需要 package 上下文。Shared string 单元格保存索引,inline string 位于工作表。富文本可以含普通 text runs、注音 `rPh` runs 和 `xml:space` 空白标记。不得把注音拼入正文;parser 暴露空白元数据时应保留,并用首尾空格和 run 边界夹具验证明示的拼接策略,不能默认某 library 会怎样处理。Boolean 和 error 也不是普通数字。规范化展示时仍保留单元格类型与原始内容。 单元格不能因值是数字或样式像日期就自动当日期。SpreadsheetML 支持 `t="d"` 和 ISO 8601 文本直接表示,也可用 numeric serial 结合 workbook 日期系统和样式表示。先确认 library 支持直接日期类型;不支持则标 unsupported,不得强转数值。数值格式只是解释证据,不是强类型声明。Excel 保留 1900 被当闰年的兼容行为,因此 serial 60 是虚构的 1900-02-29,并非公历;workbook 级 1904 标志改变 epoch。并列保留原始值、日期系统标志、style 与解释,避免歧义时静默偏移。 公式可引用其他单元格、命名范围、函数或外部工作簿。只读导入只在单元格实际有 inline expression 时返回它;shared formula 要找到 master 并测试相对引用解析后才提供表达式。缓存缺失和公式无法解析分开记录;不刷新链接、不重算、不改设置、不保存源文件。若消费者需要值,可明确使用“上次计算时保存”的缓存,展示已解析公式,或将单元格标 unresolved。不可说缓存是刚算的结果。 先固定 Android 实际可用的 library 和版本,再定义支持面。Microsoft Open XML 文档描述 SpreadsheetML 和 Open XML SDK,不证明 .NET API 可以运行于 Android,也不证明其他库具备同样行为。记录解析库坐标、传递依赖、所支持的 workbook 特性和用户选择 URI 的读入方式。ZIP package 也只是容器边界;应通过所选库实际暴露的接口限制 entry 数、解压总字节、压缩比、XML 深度、单元格数、共享字符串数及工作时间。不要为了补齐能力而自写临时 ZIP/XML 解析器。 安全的只读结果应带来源信息。每个单元格记录 workbook/sheet、坐标、声明类型、原始值、formula kind 与 shared-group metadata、表达式是否解析、shared-string lookup、style、日期系统和解释状态。公式表达式、缓存结果与展示字符串分开保存。没有准确测试时,不宣称保留了宏、外链、格式、批注或全部 workbook 特性;导入不能修改源文件。 准备合成 workbook,其中有共享与 inline 字符串、富文本 runs、数字、布尔值、错误值、带缓存公式、无缓存公式、过期缓存和外部工作簿引用。再加入日期样式数值与普通数字、两种日期系统以及 1900 系统的序列 60。使用准确 Android build 和 library 打开及关闭,对比原始 package part 与解析投影,并确认源文件字节未改变。不要连接真实外部工作簿,也不要用用户私有数据制作测试 fixture。 验收的是解释契约,而非模型质量。报告应说明读到了哪些 sheet/cell、如何处理公式和缓存、哪些单元格类型不支持,以及是否触发限制或解析错误。模型仍可能误解已正确导入的文本;解析成功也不证明工作簿内容正确、安全可操作或 Cove 已支持。本文只是一种 Android 通用方法,不表示 Cove 当前导入 XLSX。
工作簿里的合计缓存已经过期
用户选择工作簿进行本地费用复核。其中一个合计单元格是引用另一工作表的公式,但缓存结果保存于最近一次编辑之前,工作簿还含有外部引用。导入不得启动桌面计算引擎或改写所选文件。
决策
分别保留公式、缓存结果、单元格类型、来源坐标和缓存状态。只有在明确的过期值策略下才使用缓存;否则将金额标为未解析并请求用户复核。
预期结果
派生工作表视图可以追溯到原始单元格,并清楚标明值是字面输入、历史缓存、日期解释、暂不支持还是尚未确定。
需要收集的证据
只有将以下证据与同一模型文件和测试运行关联起来,结论才可复核:
- ANDROID-XLSX-READ-2026-10:SpreadsheetML formula cache 是上次保存的结果;共享公式 follower 可不含公式文本,需依 master group 定位;`t="d"` ISO 日期与 numeric serial 是两种表示。
- ANDROID-PRIVACY-01:Android 的权限、数据访问、存储与用户控制责任不随模型执行位置改变。
- PRIVACY-01:端侧推理不证明应用没有其他网络请求;workbook 外链策略需单独核验。
任务质量需要有版本记录的语料和验收规则;流畅的单条样例不等于准确度结果。
实施流程
- 固定解析依赖和导入边界. 记录准确 Android dependency 坐标、解析版本、工作簿特性范围和用户 URI 路径。确认库暴露 formula type/shared-group 元数据、缓存、单元格类型、shared strings、富文本、直接日期类型、styles 和 workbook date-system flags。
- 解析单元格并保留文本表示. 从实际 package part 读取 shared string index 和 inline string。区分正文 text runs 与 `rPh` 注音 runs;parser 暴露 `xml:space` 时保留,并按具名策略测试空白。公式、缓存、Boolean、error、数字和展示结果仍独立。
- 按声明形式解释日期. 将 `t="d"` ISO 日期与 numeric serial 分开;只有准确 parser 支持时才接受前者。Numeric serial 同时依据 workbook date-system 和 style/number format 解释。测试两套系统、普通数值及 1900 serial 60。
- 解析共享公式并限定缓存. 对 `t="shared"` cell 依 `si` 找到 master,并测试 library 的相对引用规则。无法唯一解析时报告 unresolved,不声称 cell 内含完整表达式。区分缓存缺失和可能过期;不重算、不刷新外链或保存源文件。
- 限制 package 并测试真实解析路径. 使用所选 library 实际支持的 package entry、解压字节、XML 深度、shared string、行/单元格和耗时限制。通过合成 fixture 覆盖公式、缓存、字符串、日期系统、缺失 part、不支持特性、取消和源文件字节保持。
让每个阶段的状态都可观察。失败信息应指出阶段、模型、运行时和恢复动作,同时避免记录用户私密内容。
验收标准
- 可用公式文本、shared master 解析结果、缓存、原始值、单元格类型和显示解释彼此区分;缓存不被说成导入时重算。
- 直接 `t="d"` ISO 日期与 numeric serial 是不同表示;前者仅在准确 parser 支持时接受,后者结合 workbook 日期系统和 style 证据解释。
- 无内联公式的 shared follower 由匹配 master 解析或标为 unresolved;1900 serial 60 不报告为真实公历日期。
- shared/inline string、普通与注音 rich-text runs、显著空白、Boolean、error、缓存缺失/过期和外链都有明确 fixture 结果。
- 实际 Android 依赖与可观测解析能力经过验证;Open XML SDK 文档不被当成 Android 兼容性证据。
- 源文件字节保持不变;解压与解析工作通过真实 library 控制项设限,不调用外部公式链接或计算引擎。
决策对照表
| 维度 | 选择或证据 | 解读方式 |
|---|---|---|
| 字面值单元格 | 展示前同时保留类型和原始值。 | 可见字符串可能取决于样式、地区和数字格式,不总等于存储表示。 |
| 公式及共享公式 follower | 分开记录内联表达式、master 解析结果和缓存。 | Follower 可能没有内联公式文本;master 未解析不能当作可展示表达式。 |
| 无可用缓存的公式 | 按已声明策略标为未解析或请求复核。 | 只读解析器没有执行受支持的计算步骤时,不能声称得到当前结果。 |
| 直接 `t="d"` 日期 | 仅在准确 parser 支持时读取 ISO 8601 内容。 | 它与 numeric serial 不同,也不证明 Android library 支持。 |
| 带日期样式的数字 | 结合 workbook date system 和样式证据解释。 | 并非所有数字都是日期;Excel 1900 兼容行为包含虚构序列 60。 |
| 外部工作簿公式 | 保持引用不执行,并报告缓存状态。 | 导入不授权网络访问、刷新链接或修改源文件。 |
需要避免的失败模式
- 把缓存值说成导入时重新计算的结果,或忽略缺失/过期缓存。
- 把所有数值当作日期,遗漏工作簿的 1900/1904 日期系统及样式上下文。
- 把 .NET Open XML SDK 示例当成 Android 兼容性证明,或在只读导入时刷新外部链接。
还要避免静默回退、版本未固定、缺少取消处理,以及把不同配置的结果混在一起下结论。失败运行也应与成功记录一并保存。
最小复现记录
| 层级 | 记录内容 |
|---|---|
| 设备 | 厂商、型号、芯片、内存档位、操作系统版本 |
| 软件 | 应用版本和 Git 提交号 |
| 模型 | 系列、变体、版本、格式、文件长度、摘要、量化方式 |
| 运行时 | 名称、版本、请求后端及实际后端证据 |
| 工作负载 | 样例版本、输入摘要、提示词摘要、输出策略 |
| 结果 | 完成、失败、取消、回退及保护隐私的诊断信息 |
发布检查表
- ☐ 主要搜索问题已回答,且没有未经支持的数字。
- ☐ 所有模型文件和运行时版本均已固定。
- ☐ 代表性任务和失败处理策略均有说明。
- ☐ 生命周期、取消、清理和回退均已测试。
- ☐ 用户内容与网络边界均有说明。
- ☐ 结论只适用于被记录的配置。
- ☐ 新增测试结果时链接到原始方法或证据。
来源与相关证据
- Android privacy and security
- Microsoft Learn:SpreadsheetML 公式与缓存值
- Microsoft Learn:SpreadsheetML 共享字符串表
- Microsoft Learn:读取电子表格单元格值
- Microsoft Learn:共享公式 master 与 follower 语义
- Microsoft Learn:SpreadsheetML 直接日期单元格类型
- Microsoft Learn:WorkbookProperties.Date1904
- Microsoft Learn:Excel 1900 闰年兼容行为
- Microsoft Learn:SpreadsheetML 注音 runs
- Microsoft Learn:SpreadsheetML 文本空白元数据
- ECMA:Office Open XML 标准概览
中文部署与排错专题见。奇连 AI 端侧专题。
常见问题
每个 XLSX 公式单元格都含有可读公式文本吗?
不一定。Shared-formula follower 可带 group metadata 指向 master,却没有内联公式文本。只有通过已测试的 parser 路径找到 master 后才能解析,否则应报告 unresolved;缓存也可能缺失或过期。
所有 XLSX 日期都以数值序列存储吗?
不是。SpreadsheetML 还支持 `t="d"` 和 ISO 8601 文本。只有准确 parser 能暴露该类型时才接受;numeric serial 是另一种表示,需要 workbook 日期系统和样式证据。
导入时应该重算公式或刷新链接工作簿吗?
只读导入不应这样做。重算和刷新可能改变数据或触发外部行为。分别保存公式文本和缓存值;计算功能应有单独的引擎、策略和测试。
Microsoft Open XML 示例能证明同一 API 可用于 Android 吗?
不能。文档说明 SpreadsheetML 结构及其所述环境中的 SDK 行为。声明 Android 支持前,必须记录并测试准确的 Android 兼容 library 与版本。