如何用 xelem 读取 SpreadsheetML 电子表格?
更新时间
用 xelem 读取 SpreadsheetML 的前提是使用 2.0 及以上版本:从 xelem 2.0 起,这个库才具备读取 SpreadsheetML 的能力。读取功能位于 xelem.lex 包,官方站点在 javadoc 之外单独提供了 “reading spreadsheets” 说明页,按该包的方式解析即可。如果项目还在用 2.0 之前的版本,只能写不能读,需要先升级依赖。
先确认两件事
版本是否支持读取
xelem 早期定位是“写”库,用于在 Java 程序里生成 SpreadsheetML 格式的 Excel 文件;读取是 2.0 才加入的能力。因此第一步不是找 API,而是核对依赖版本。
文件格式是否为 SpreadsheetML
xelem 处理的是 SpreadsheetML,即 Microsoft 定义的 XML 方言,而不是 .xlsx(OOXML zip 包)或旧式 .xls 二进制格式。如果手上的文件是后两者,xelem 不是合适工具,需要先转换格式或换用其他库。
读取的基本思路
xelem 的架构刻意贴近 SpreadsheetML 本身:XML 中的每个元素,在 Java 侧都有一个实现 XLElement 接口的对应类;整个 XML 电子表格的根是 Workbook 元素,写操作的入口是 XLWorkbook 类。
读取走的是另一条路径:xelem.lex 包。可以把它理解为面向“解析”的一组类,与写侧的 XLWorkbook 分工不同。使用时的大致流程是:
- 引入 xelem 2.0+ 依赖,确保
xelem.lex包在类路径中。 - 以 SpreadsheetML 文件(或输入流)作为输入,交给
xelem.lex中的解析入口。 - 按 SpreadsheetML 的结构逐层取得 Workbook、Worksheet、Row、Cell 等层级内容。
- 从单元格中取出值,自行转换为业务需要的类型。
预期结果是得到一个可按工作表、行、单元格遍历的对象结构,而不是直接得到 POI 式的 Workbook 对象。
具体入口在哪里
官网没有在首页展开读取 API 的类名与方法签名,而是指向两个地方:
| 资源 | 用途 |
|---|---|
| javadoc 的 general overview 页 | 建立 xelem 整体模型的认识,理解元素与类的对应关系 |
| “reading spreadsheets” 说明页 | 专门讲 xelem.lex 包的读取用法 |
建议先读 overview 建立“XML 元素 ↔ Java 类”的映射直觉,再读 reading spreadsheets 页对照写代码。由于站点未列出具体方法名,本文不臆造类名和调用顺序,以该页给出的示例为准。
常见卡点
- 版本没升:在 1.x 上找读取 API 会一无所获,先确认依赖坐标与版本号。
- 包引错:写侧用
XLWorkbook,读侧在xelem.lex,两者不要混用。 - 格式误判:把
.xlsx当 SpreadsheetML 传入,解析会在结构层面失败。 - 期望过高:xelem 是紧凑型库,定位是读写 SpreadsheetML 本身,不提供公式计算引擎或完整 Excel 兼容层,复杂需求要评估是否够用。
什么时候选它
适合的场景:Java 项目已经以 SpreadsheetML 作为交换格式,或需要生成结构复杂、层级较深的电子表格,并希望用与 XML 结构一一对应的轻量 API 来读写。
不适合的场景:需要处理 .xlsx/.xls、需要公式求值、需要成熟生态与大量现成示例——这类需求应优先考虑 Apache POI 等方案。