更新记录

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。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

无系统权限。读取调用方用系统文件选择器交过来的文件(路径或 content:// 授权),写出走应用外部私有目录。

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集、不上传任何数据,不访问网络。读取的 .docx 只在本机内存与临时缓存里处理,不复制到其他位置;写盘仅限调用方指定的 CSV/TSV 文件。

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无

暂无用户评论。