更新记录
1.0.0(2026-10-29)
首个版本:解析 docx 主文档(段落、标题层级、表格行列与合并单元格、字数统计);表格抽取支持横向合并展开/紧凑两种模式、纵向合并向下填充、空行过滤;导出 CSV/TSV(引号转义、UTF-8 BOM);字段映射支持表头名、#列序号、包含匹配三种方式;多份文档批量汇总并附来源文件名;正文与单元格全文检索带上下文;9 个具名错误码;纯逻辑零依赖、不申请存储权限。UTS→Kotlin 编译通过(index.kt 2091 行、86 个函数),68 项回归测试全部通过(含 python-docx 生成的真实 docx 主文档部件解析);真机未执行(本轮无可用设备)。
平台兼容性
uni-app
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| × | √ | × | × | √ | × | √ | × | × |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| × | × | × | × | × | × | - | × | × | - | × | × |
szhzy-docx-read
把 Word(.docx)里的表格和正文抽成结构化数据:读骨架、抽表格、导 CSV、批量汇总、全文检索。 零三方依赖,纯本地解析,不联网、不上传。
适用场景:合同台账汇总、供应商报价单归集、点检/验收记录批量入库、单据归档前的字段核对。
验证状态
| 项 | 结果 |
|---|---|
| UTS → Kotlin 编译 | 通过(compiled successfully,无 error) |
| 纯逻辑回归测试 | 68 项,失败 0(含 python-docx 生成的真实 .docx 主文档部件解析) |
| 真实 .docx 往返 | 已覆盖:标题层级、横向合并展开、纵向合并填充、空行过滤、长文本单元格 |
| 真机运行 | 未执行(本轮无可用设备,adb devices 为空) |
| iOS / 鸿蒙 | 不支持,仅 Android |
真机未验证的部分:Android 平台层的 zip 解包(
ZipFile)、content://授权 URI 转缓存、CSV 落盘路径。 这三处只有编译期保证,接入前请在自己的设备上先跑一遍「选文件 → 抽表 → 导出 CSV」。
它不做什么
- 不解析老版
.doc(二进制格式),也不解析.docm里的宏;请在 Office/WPS 里另存为.docx。 - 不抽取页眉、页脚、脚注、尾注、批注、文本框里的内容,只处理正文主体。
- 不做 OCR:扫描件 PDF/图片里的字读不出来。
- 不还原复杂版式(分栏、文本框绕排、艺术字),只关心文字与表格结构。
- 不写 Word,只读。要生成 docx 请用
szhzy-docx-report。
快速开始
import { inspect, readTable, exportCsv, batchExtract } from '@/uni_modules/szhzy-docx-read'
// 1) 先看这份文件里有什么(表格数量、每张表的行列、标题清单)
const info = inspect({ path: filePath })
if (!info.ok) {
console.log(info.code, info.message) // NOT_DOCX / FILE_NOT_FOUND / NO_TABLE ...
}
console.log(info.stats.tables, info.tables.map((t) => t.header))
// 2) 抽第 2 张表(下标从 0 开始),首行当表头
const table = readTable({ path: filePath, tableIndex: 1, limit: 20 })
console.log(table.headers) // ['合同与供应商', '', '金额(元)', ...]
console.log(table.rows[0].cells)
// 3) 只导需要的列并改名,落成 CSV(带 BOM,Excel 双击不乱码)
const csv = exportCsv({
path: filePath,
tableIndex: 1,
fileName: '合同台账-2026-09',
mapping: [
{ target: '合同编号', source: '合同与供应商' },
{ target: '金额', source: '金额(元)' },
{ target: '交期', source: '交期' }
]
})
console.log(csv.path, csv.rows)
// 4) 多份单据一次汇总,带上来源文件名
const batch = batchExtract({
paths: [p1, p2, p3],
tableIndex: 0,
sourceColumn: '来源文件',
fileName: '点检汇总'
})
console.log(batch.files, batch.rows, batch.skipped)
选文件用系统选择器即可,返回的路径或 content:// 授权 URI 都能直接传进来:
uni.chooseFile({
count: 10,
extension: ['.docx'],
success: (res) => {
const paths = res.tempFilePaths
const out = batchExtract({ paths, tableIndex: 0, fileName: '汇总' })
}
})
API
所有方法返回统一信封 { ok, code, message, ... },不抛异常。
| 方法 | 入参 | 返回要点 |
|---|---|---|
inspect |
{ path } |
stats(段落/标题/表格/字数/空单元格占比)、outline(标题清单)、tables(每张表的行列与首行)、warnings |
readTable |
{ path, tableIndex, header, spanMode, fillMerged, skipEmpty, limit } |
headers、rows[].cells、totalRows、cols、keyValues(两列表转键值对) |
listTables |
{ path } |
count、tables[],用于让用户选表 |
search |
{ path, keywords: [], maxHits } |
hits[](block 为 paragraph/cell,带 row/col 与上下文片段) |
exportCsv |
{ path, tableIndex, dir, fileName, delimiter, bom, quoteAll, header, mapping } |
path、bytes、rows、cols、headers |
batchExtract |
{ paths: [], tableIndex, dir, fileName, delimiter, bom, header, sourceColumn, mapping } |
files、rows、skipped(没有该表)、broken(读不了) |
readXmlText |
{ xml } |
不开文件,直接解析一段 word/document.xml |
inspectPackage |
{ path } |
列出 zip 内部条目,排障用 |
readRawXml |
{ path } |
取原始正文 XML,排障用 |
getOutputDir |
— | 默认输出目录(应用外部私有目录) |
getVersion |
— | 插件版本 |
抽表参数
| 参数 | 默认 | 说明 |
|---|---|---|
header |
true |
首行当表头;false 时自动生成「列1…列N」 |
spanMode |
expand |
expand 把横向合并拆成多列(首列有值、其余空);compact 保持单元格数 |
fillMerged |
true |
纵向合并的延续单元格为空时,向上取同列的值(台账里的「同上」) |
skipEmpty |
true |
整行全空的行不输出 |
delimiter |
, |
传 \t 即导出 TSV |
bom |
true |
写 UTF-8 BOM,Excel 打开中文不乱码 |
mapping 的 source 支持三种写法:表头名精确匹配 → #列序号(从 1 开始)→ 包含匹配兜底。
一个都对不上时直接返回 MAPPING_EMPTY,不会导出一张空表。
能力边界
- 只解析主文档部件
word/document.xml;页眉页脚、脚注、批注、文本框不在范围内。 - 嵌套表格:内层文字并入外层单元格,并在
warnings里留NESTED_TABLE@<表序号>,不单独成表。 - 修订痕迹:被删除的文字(
w:del/w:delText)不计入正文。 - 单元格内多段:合并成一个空格分隔的字符串,避免 CSV 里出现裸换行。
- 不保证版式:列宽、字号、颜色、缩进等格式信息不解析。
错误码
| code | 含义 | 处理建议 |
|---|---|---|
EMPTY |
入参为空 / 正文为空 | 检查 path 或 xml 是否传了 |
FILE_NOT_FOUND |
文件不存在或不是文件 | 确认选择器返回的路径有效 |
OPEN_FAILED |
打不开文件 | content:// 授权可能已失效,重新选择 |
NOT_ZIP |
不是 zip(可能是 .doc) | 另存为 .docx |
NOT_DOCX |
缺少 word/document.xml |
不是 Word 2007+ 文档 |
NO_TABLE |
文档里没有表格 | 用 inspect 先看有没有表 |
TABLE_INDEX |
表格序号越界 | 序号从 0 开始,先 listTables |
MAPPING_EMPTY |
映射一个都没对上 | 打印 headers 核对列名 |
WRITE_FAILED |
写 CSV 失败 | 检查 dir 是否可写 |
演示工程
demo-docx-read/ 两个页面:
- 合同台账:读一份已生成的采购合同台账 docx,展示识别到的标题、两张表的规模、合并单元格展开结果与导出的 CSV 行;
- 点检记录:说明批量汇总的形态——多份点检记录同一张表拼成一行一条,附来源文件名。
预览环境(H5)用固定样本数据走通页面流程,结果卡会明确标注「预览环境」;安装到 Android 后同一次操作读的是真实文件。
授权
购买授权后可在自己的产品(含为客户定制的项目)中不限项目数、不限安装量使用。
源码授权另允许阅读与二次开发,但不得把插件本身(含修改版)再次分发或销售。详见 license.md。

收藏人数:
购买源码授权版(
试用
赞赏(0)
下载 13
赞赏 0
下载 12723595
赞赏 1958
赞赏
京公网安备:11010802035340号