HarmonyOS 鸿蒙Next中怎么提取doc文件中的内容

HarmonyOS 鸿蒙Next中怎么提取doc文件中的内容 【问题描述】:怎么提取doc文件中的内容,未找到相关文档

16 回复

【解决方案】 开发者您好,您可以将doc文件上传服务端由Apache POI进行解析然后返回解析后的数据或者将doc格式升级成docx格式后使用[@ohos/mammoth](https://ohpm.openharmony.cn/#/cn/detail/@ohos%2Fmammoth)进行解析,读取docx文件的demo如下所示:

import fs from '[@ohos](/user/ohos).file.fs';
import { common } from '@kit.AbilityKit';
import * as mammoth from '[@ohos](/user/ohos)/mammoth';

@Entry
@Component
struct Index7 {
  context = this.getUIContext().getHostContext() as common.UIAbilityContext;
  fileName: string = 'test1.docx';
  filePath: string = this.context.filesDir + '/' + this.fileName;

  // 将rawfile下事先准备的docx文件拷贝到沙箱
  saveFileToSandbox() {
    try {
      const file = fs.openSync(this.filePath, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE);
      const content = this.context.resourceManager.getRawFileContentSync(this.fileName);
      const arrayBuffer = content.buffer.slice(0);
      fs.writeSync(file.fd, arrayBuffer);
      fs.closeSync(file.fd);
    } catch (error) {
      let err: BusinessError = error as BusinessError;
      console.error('error message: ' + err.message + ', error code: ' + err.code);
    }
  }

  aboutToAppear(): void {
    this.saveFileToSandbox()
  }

  build() {
    Column() {
      Button('读取docx文件的文字内容').onClick(() => {
        mammoth.extractRawText({ path: this.filePath }).then((result) => {
          let value: string = result.value;
          console.info('docx文件内容:', value);
          // 将读取的文字内容写入一个新的docx文件
          let filePath2 = this.context.filesDir + '/new.docx'
          let file = fs.openSync(filePath2, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE);
          fs.writeSync(file.fd, value);
          fs.closeSync(file.fd);
        }).catch((error: ESObject) => {
          console.error('文件读取失败:', error);
        });
      });
    }.height('100%').width('100%');
  }
}

更多关于HarmonyOS 鸿蒙Next中怎么提取doc文件中的内容的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


HarmonyOS 侧目前没有看到一个面向普通应用的原生 API 可以直接把旧版 .doc 文档内容全文抽出来。这里要先区分 .doc 和 .docx:.doc 是旧的二进制 Word 格式,.docx 是 OOXML 压缩包结构,解析方式完全不同。

可选方案:

  1. 如果只处理 .docx,可以用 XML/zip 方向解析 document.xml,再处理段落、表格和样式。
  2. 如果必须处理 .doc,通常要接入成熟解析库或放到服务端处理,端侧自己实现二进制 Word 解析成本很高。
  3. 如果文件只有纯文本且小于固定大小,可以先做服务端转换或导入时转换成 docx/txt,再给端侧解析。
  4. 如果涉及图片、表格、复杂排版,建议明确只提取纯文本,或直接走后端转换服务。
  5. 注意文档可能包含隐私内容,上传服务端前要有用户授权和数据处理说明。

所以这不是简单缺一个字段的问题,而是 Office 文件格式解析能力问题。端侧做轻量 docx 可以,旧 .doc 建议不要从零手写解析。

HarmonyOS NEXT 目前:

官方没有直接提供“读取 doc/docx 内容”的原生API

所以一般都是:

三方库方案

最常见就是:

1、Apache POI(最推荐)

官方地址:

Apache POI

https://poi.apache.org/

Word处理说明:

https://poi.apache.org/components/document/index.html

文本提取:

https://poi.apache.org/text-extraction.html


POI支持:

.doc
.docx
.xls
.xlsx
.ppt

等 Office 文件。


2、doc 和 docx 要区分

因为:

.doc 是旧二进制格式
.docx 是 Office XML格式

读取方式不一样。


3、读取 doc 示例(旧版Word)

FileInputStream fis = new FileInputStream(path);
HWPFDocument document = new HWPFDocument(fis);
WordExtractor extractor = new WordExtractor(document);
String text = extractor.getText();
System.out.println(text);

这是:

.doc

文件读取方式。


4、读取 docx 示例(新版Word)

FileInputStream fis = new FileInputStream(path);
XWPFDocument document = new XWPFDocument(fis);
XWPFWordExtractor extractor = new XWPFWordExtractor(document);
String text = extractor.getText();
System.out.println(text);

这是:

.docx

读取方式。


5、HarmonyOS NEXT 要注意的问题

因为:

POI 是 Java 库

所以:

ArkTS 不能直接用

一般有两种方案:


方案1(推荐)

Native侧(Java/C++)

处理 doc/docx。

例如:

Ability -> JNI -> POI解析

然后:

把文本回传 ArkTS

方案2

后端解析。

例如:

上传 doc/docx
-> 服务端POI解析
-> 返回文本

这个其实很多APP都这么做。


6、如果只是简单读取文本

其实:

docx 本质就是 zip+xml

理论上:

直接解压

也能拿到:

word/document.xml

里面的内容。

但:

不建议自己硬解析

因为:

  • 表格
  • 图片
  • 样式
  • 页眉页脚

会很复杂。


7、还有一个现实问题

很多开发者会踩坑:

缺少 poi-ooxml / dom4j 依赖

然后:

NoClassDefFoundError

所以:

依赖必须配全

例如:

poi
poi-ooxml
poi-scratchpad
xmlbeans
dom4j

等。


一句话总结:

HarmonyOS NEXT 目前没有官方原生 doc/docx 解析API,
通常使用 Apache POI 读取 Word 内容;
ArkTS 不能直接使用 POI,一般通过 Native(Java/C++) 或服务端解析实现。

开发者您好,请提供如下信息,方便问题分析解决:

  1. 需要提取doc文件内容是纯文本,还是会包含图片、表格等复杂信息;
  2. 文件是否有大小限制;
  3. 需要提取内容的文件类型是否仅为doc,还是会包含多种。
  1. 纯文本的doc
  2. 文件最大限制为10M
  3. 当前就剩doc文件类型,其他如txt、pdf、docx都可以提取了

可以提取嘛

HarmonyOS的开发者模式提供了很多实用的工具,方便我们进行调试和优化。

尊敬的开发者,您好,
感谢您的提问,我们已经将问题上升至相关部门,会尽快给您答复,请耐心等待。
如有进一步信息或需要协助,我们将及时与您联系。

合作愉快。
华为开发者联盟

你好,可以试试 Mammoth 库,旨在将.docx文档(例如由Microsoft Word创建的文档)转换为HTML。同时也可以读取为纯文本。

安装:

ohpm install [@ohos](/user/ohos)/mammoth

使用获取纯文本:

import * as mammoth from "[@ohos](/user/ohos)/mammoth";

mammoth.extractRawText({ path: sanBoxFileDir + "path/to/document.docx" })
  .then((result) => {
    let html: string =  result.value;
    let message: string =  result.message;
  })
  .catch((error: ESObject) => {
    // ... convert error
  });

相关文档参考这个 filePreview(文件预览),但是你的问题 这个文档应该解决不了,

因为你要的是读取, 我的想法就行将word 转换成二进制,然后给到后端然后用后端进行解析 返回纯文本,也可以使用云服务来完成这个操作 ,如有帮助给个采纳谢谢

基于鸿蒙系统的技术架构,提取doc文件内容通常有以下几种实现方式:

1. 使用HarmonyOS原生文件API + 第三方库

// 示例代码框架(需要结合第三方库)
import fs from '@ohos.file.fs';

async function extractDocContent(filePath: string): Promise<string> {
  try {
    // 1. 读取文件
    const fileContent = await fs.readFile(filePath);
    
    // 2. 使用第三方doc解析库(如mammoth.js的鸿蒙适配版)
    // 注意:需要将web库适配到鸿蒙环境
    const docParser = require('harmony-doc-parser');
    const content = await docParser.parse(fileContent);
    
    return content;
  } catch (error) {
    console.error('提取doc内容失败:', error);
    throw error;
  }
}

2. 通过Web组件 + JavaScript库实现

鸿蒙支持Web组件,可以利用成熟的JavaScript文档处理库:

  • 方案:在Web组件中加载docx.js、mammoth.js等库
  • 优势:生态成熟,功能完整
  • 限制:需要处理鸿蒙与Web环境的桥接

3. 云端服务方案

对于复杂的文档处理需求,建议采用云端服务:

  • 将doc文件上传到后端服务
  • 使用专业的文档处理服务(如阿里云、腾讯云的文档解析API)
  • 鸿蒙端只负责文件上传和结果展示

4. 实际开发建议

当前技术现状:

  • 鸿蒙原生支持:HarmonyOS 3.0+提供了基础的文件读写能力,但没有内置的doc解析能力
  • 第三方库适配:目前社区中成熟的doc解析库对鸿蒙的适配还不完善
  • 推荐方案:对于生产环境,建议优先考虑云端处理方案

开发资源参考:

  1. HarmonyOS文件管理
    • 官方文档:@ohos.file.fs 模块
    • 支持文件读取、写入、目录操作等基础功能
  2. 可能的第三方库
    • 需要寻找支持HarmonyOS的文档解析库
    • 或自行适配现有的JavaScript/TypeScript文档处理库
  3. 替代方案
    • 考虑使用PDF格式替代doc,鸿蒙对PDF的支持相对更成熟
    • 或将doc文件转换为纯文本/HTML格式后再处理

5. 重要提醒

由于鸿蒙生态仍在快速发展中,建议您:

  • 关注官方更新:HarmonyOS SDK版本迭代较快,新版本可能会增加文档处理能力
  • 社区资源:加入鸿蒙开发者社区,获取最新的技术方案和库适配信息
  • 分阶段实现:对于重要项目,建议先实现基础功能,再逐步优化文档处理能力

按照正常的文件读取操作就可以。

这个就按照文件读取操作就行了吧

在HarmonyOS 鸿蒙Next中,可使用@ohos.file.fs模块读取doc文件为ArrayBuffer,再通过@ohos.dds(文档数据服务)解析。调用dds.parse(buffer, 'application/msword')获取结构化内容,遍历提取文本数据。注意需在oh-package.json5中添加依赖@ohos/dds

HarmonyOS Next 未提供直接解析 doc 文件的系统 API。由于 doc(二进制)与 docx(Office Open XML)格式不同,纯 ArkTS/JS 难以处理老式 doc 结构。可行的方案:

  1. 仅限 docx 文件
    使用开源纯 JavaScript 库(如 mammoth.js)将文件读为 ArrayBuffer,提取纯文本。示例:

    import mammoth from 'mammoth';
    import fs from '[@ohos](/user/ohos).file.fs';
    
    async function extractDocxText(filePath: string): Promise<string> {
      const file = fs.openSync(filePath, fs.OpenMode.READ_ONLY);
      const buf = new ArrayBuffer(fs.statSync(filePath).size);
      fs.readSync(file.fd, buf);
      fs.closeSync(file);
      const result = await mammoth.extractRawText({ arrayBuffer: buf });
      return result.value;
    }
    

    注意:使用前需将 mammoth.js 及其依赖适配为 HarmonyOS 可用模块(通常经 esmodule 转换即可)。

  2. 老 doc 文件
    原生侧需依赖第三方工具(如 LibreOffice)转换成 docx 或 txt 后再解析,或通过 napi 调用 POI 等库。ArkTS 层直接处理较为困难且不推荐。

回到顶部